Spring

Spring的7种事务传播方式:

PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事物,如果已经存在一个事务中,加入到这个事务中。

PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY:使用当前的事物,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW:创建事务,如果当前存在事务,就把事务挂起。

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAFATION_NEVER:以非事务方式执行,如果当前存在事务,就抛出异常。

PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就新建一个事物。


Bean具体生命周期

postProcessBeanFactory(ConfigurableListableBeanFactory c) 

工厂后处理器(这名字其实只是一个翻译,感觉意义有的时候不一定正确),这个方法其实和Bean生命周期没多少关系,是IoC容器(ApplicationContext)初始化的一部分,详细的可以参考IoC容器初始化一节。具体是容器每一次刷新时(初始化)调用,它是对BeanDefinition进行后处理(BeanDefinition可以参考: Spring IoC 容器结构),具体的作用就是可以修改配置文件的各个bean的配置。 

实现:写一个类,实现BeanFactoryPostProcessor接口,重写该方法,并在Spring配置文件中配置该类的一个bean。

postProcessBeforeInstantiation(Class<?>c,String beanName) 

所有bean对象(注1)实例化之前执行,具体点就是执行每个bean类构造函数之前。 

实现:写一个类,实现InstantiationAwareBeanPostProcessor接口,重写该方法,在Spring配置文件中配置该类的一个bean。返回一个Object,但是实际上你返回一个null即可。

bean实例化,调用bean类构造函数

postProcessAfterInstantiation(Object bean,String beanName) 

bean类实例化之后,初始化之前调用 

实现:同第2步,重写该方法,但注意,返回类型这里是boolean,默认是false,你需要更改为true,否则无法注入属性

postProcessPropertyValue(属性名太长,详细查看代码实现) 

属性注入之前调用 

实现:同第2步,重写该方法,注意返回类型是PropertyValue,默认返回null,这里需改为返回第一个参数,详见代码章节3。

setBeanName(String beanName) 

属性注入后调用,该方法作用是让bean类知道自己所在的Bean的name或id属性。 

实现:bean类实现BeanNameAware接口,重写该方法。

setBeanFactory(BeanFactory factory) 

setBeanName后调用,该方法作用是让bean类知道自己所在的BeanFactory的属性(传入bean所在BeanFactory类型参数)。 

实现:bean类实现BeanFactoryAware接口,实现该方法。

postProcessBeforeInitialization(Object bean,String beanName) 

BeanPostProcessor作用是对bean实例化、初始化做些预处理操作(注2)。 

实现:写一个类,实现BeanPostProcessor接口,注意返回类型为Object,默认返回null,需要返回参数中bean。

postProcessBeforeInitialization(Object bean,Strign beanName) 

实现:同第2步,实现该方法,注意点同第8步。(注3)

afterPropertiesSet() 

实现:bean类实现InitializingBean接口,重写该方法。初始化工作,但实现该接口这种方法和Spring耦合,不推荐(这一点DisposableBean一样)。 

11. xml_init() 

实现:spring bean配置文件中配置bean属性init-method=”xml_init”,这个方法名开发者自己定义,与Spring代码解耦。另外需要注意的是,init-method指定的方法不能有参数,有参数抛异常(这一点destroy-method一样)。

postProcessAfterInitialization(Object bean,Strign beanName) 

实现:同第8步,注意点相同。

postProcessAfterInitialization(Object bean,Strign beanName) 

实现:同第2步,注意点同第9步。

程序执行,bean工作

destroy() 

bean销毁前执行 

实现:bean类实现DisposableBean接口

xml_destroy() 

实现:spring bean配置文件中配置bean属性destroy-method=”xml_destroy”,这个方法名开发者自己定义。

注1:这里的bean类指的是普通bean类,不包括这里实现了各类接口(就是2.2提到的这些接口)而在配置文件中声明的bean。 

注2:如果有多个BeanPostProcessor实现类,其执行顺序参考:BeanPostProcessor详解。 

注3:InstantiationAwareBeanPostProcessor接口继承自BeanPostProcessor接口,是它的子接口,扩展了两个方法,即bean实例化前后操作,当然前者也会有bean初始化前后操作,当它们两同时存在的话,开发者又同时对两者的postProcessBeforeInitialization、postProcessAfterInitialization方法实现了,先回去执行BeanPostProcessor的方法,再去执行InstantiationAwareBeanPostProcessor的。




个人公号:【排骨肉段】,可以关注一下。

你可能感兴趣的:(Spring)