决战圣地玛丽乔亚Day41 Spring其余部分

发布时间 2023-03-26 23:50:46作者: EmiXXXt

扩展点:

BeanPostProcessor:在 Bean 初始化前后进行一些处理,常用于 AOP 功能的实现。

postProcessBeforeInitialization(初始化bean前)

postProcessAfterInitialization(初始化bean后)

BeanDefinitionRegistryPostProcessor

可以向 BeanFactory 动态注册 BeanDefinition,也可以修改已经注册的 BeanDefinition。这个在BeanFactoryPostProcessor之前进行,是在refresh的invokeBeanFactoryPostProcessors中进行处理。

执行顺序:

BeanDefinitionRegistryPostProcessor > BeanFactoryPostProcessor > BeanPostProcessor

使用的方法:

1.实现 BeanDefinitionRegistryPostProcessor 接口,重写其 postProcessBeanDefinitionRegistry 方法

允许在BeanFactoryPostProcessor执行之前调用,对BeanDefinition对象进行增删改查操作

public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        // 在这里可以添加新的 BeanDefinition 或修改已有的 BeanDefinition
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
}

//将该类注册为 Spring 的 Bean,在 Spring 容器启动时会自动调用其     
   postProcessBeanDefinitionRegistry 方法。    


@Configuration
public class AppConfig {
    @Bean
    public static MyBeanDefinitionRegistryPostProcessor myBeanDefinitionRegistryPostProcessor() {
        return new MyBeanDefinitionRegistryPostProcessor();
    }
}

tips:需要注意的是,如果我们在 postProcessBeanDefinitionRegistry 方法中添加了新的 BeanDefinition,那么这些 BeanDefinition 不会立即被实例化,而是需要等到下一次的 BeanFactoryPostProcessor 处理完成后才会被实例化。因此,如果我们需要在应用中使用这些新的 Bean,需要确保这些 Bean 已经被实例化。

需要注意一个问题:

 

 

 BeanDefinitionRegistryPostProcessor 接口是继承的BeanFactoryPostProcessor

 

BeanFactoryPostProcessor

postProcessBeanFactory方法,在bean的实例化之前,对beanFactory进行一些后置操作。

 

InstantiationAwareBeanPostProcessor:在 Bean 实例化之前和之后进行一些处理,可以对 Bean 进行定制化的实例化。

ApplicationListener:用于监听 Spring 事件,当事件发生时可以进行一些处理。

InitializingBeanDisposableBean:分别在 Bean 初始化和销毁时被调用。

@PostConstruct 和 @PreDestroy:分别在 Bean 初始化和销毁时被调用,通过注解方式来实现。

@Autowired 和 @Resource:用于实现自动装配。

 

 

 

如何控制事务?

事务的传播机制

多线程事务的处理

IOC和AOP

循环依赖的问题是怎么产生的,如何解决?

懒加载和饿汉加载的区别和应用

单例/多例模式的实现