Spring Bean生命周期

Posted hot小热

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Bean生命周期相关的知识,希望对你有一定的参考价值。

Spring Bean生命周期

Spring Bean生命周期
-----------------------------------------------------------------------------------
1.Bean实例化和DI:
	--> 扫描XML文件/注释类/Java配置类中的bean定义 
	--> 创建bean实例 
	--> 注入bean依赖项(调用setter,为自动装配字段设置值)
2.检查Spring Awareness:
	--> 如果bean类型实现了BeanNameAware,则调用setBeanName() 
	--> 如果bean类型实现了BeanClassLoaderAware,则调用setBeanClassLoader() 
	--> 如果bean类型实现了ApplicationContextAware,则调用setApplicationContext()
3.创建bean生命周期回调
	--> 如果存在@PostConstruct注释,则使用它注释调用方法
	--> 如果bean类型实现了InitialzingBean,则调用afterPropertiesSet()
	--> 如果bean定义包含init-method或@Bean(initMethod="..."),则调用初始方法
------------------------------------------------------------------------------------
4.销毁bean生命周期回调
	--> 如果存在@PreDestroy注释,则使用它注释调用方法
	--> 如果bean类型实现了DisposableBean,则调用destroy()
	--> 如果bean定义包含destroy-method或@Bean(destroyMethod="..."),则调用销毁方法



实现了InitialzingBean接口调用afterPropertiesSet()和使用public void init()方法的区别:
xml中bean元素不需要在使用init-method属性来告诉spring该调用哪个初始化方法了。

完全使用注解的方式:
创建一个配置类,实例化对象,xml中的配置,通过对象setter设置。
@Configuration
@Lazy
@Bean(initMethod="init")

=================================================
使用关闭钩子:
(GenericXmlApplicationContext)ctx.registerShutDownHook();


@PostConstruct
public void afterPropertiesSet();

@PreDestory
public void destroy();

=================================================

FactroyBean接口
public MessageDigest getObject();
public Class<?> getObjectType();


PropertyEditorSupport类
public void setAsText(String text);
理解:xml配置setter注入一个字符串,通过CustomEditorConfigurer类的setCustomEditors方法传入参数Map<MyObject,MyPropertyEditor> 。
字符串传入MyPropertyEditor类的setAsText转换再调用setValue(new MyObject())返回MyObject对象。


ApplicationListener接口
public void onApplicationEvent(MessageEvent event);
理解:xml配置发布者(Pulisher)和监听器(Listener)。
发布者继承ApplicationContextAware接口获取到ctx,使用ctx.pulishEvent传入事件对象(Event)。
监听器的onApplicationEvent会接收事件对象(Event),获取相关信息,编写逻辑代码。
发布者的实例只要调用自定义的发布方法,监听器便会执行监听器onApplicationEvent方法的逻辑代码。


访问资源
ctx.getResource("xx");
文件系统:"file:///e:/data.txt"
类路径:"classpath:data.txt"
URL资源:"https://www.baidu.com"

Spring混合配置
理解:Provider和Render
1.正向:将Provider配置在xml中,然后Render在业务类中通过自动装配,获取使用,创建特定功能的Render对象,并将其返回。
2.反向:将业务类和特定功能的Render对象配置在xml中,然后在业务类中 @Bean 返回Provider对象。xml中使用<context:annotation-config/>


配置文件
第一种方法:
xml中的<beans ... profile="xxx">
vm args:
-Dspring.profiles.active="highschool"
-Dspring.profiles.active="kindergarten"
第二种方法:
//1.config
@Profiles("xxx")
public class XxxConfig{
    @Bean
    public XxxInterface xxxInterface(){
        return new XxxInterfaceImpl();
    }
}
//2.main
new AnnotationConfigApplicationContext(XxxConfig.class,YyyConfig.class);
//3.vm args:
-Dspring.profiles.active="highschool"
-Dspring.profiles.active="kindergarten"


指定运行的配置文件
@ActiveProfiles("xxxx")

  

以上是关于Spring Bean生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务,Bean生命周期

Spring应用上下文中Bean的生命周期

Spring课程 Spring入门篇 3-2 Spring bean装配(上)之bean的生命周期

Spring Bean的生命周期

Spring之bean的生命周期

Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析