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的。
个人公号:【排骨肉段】,可以关注一下。