spring bean的生命周期
@Configuration
public class DEE {
@Bean(initMethod = "initMethod")
public Demo getDemo() {
return new Demo();
}
}
package com.iyunwen.elc.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
public class Demo implements InitializingBean, ApplicationContextAware {
private String aa;
private String bb;
private String cc;
@Resource
ObjectMapper om;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean的afterPropertiesSet方法执行可以做属性赋值");
this.aa = "aa";
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("ApplicationContextAware 的aware 方法执行,可以获取spring容器,通过容器获取任何数据");
System.out.println("也是在方法在beanpostprocessor的beanpostproceesorbeforeinition中执行");
System.out.println("其他的awre接口的方法在实例化完成, 属性值赋值后就立马执行,这个ApplicationContextAware稍微特殊一些");
this.aa = "bb";
}
@PostConstruct
public void aaa() {
System.out.println("PostConstruct 方法在beanpostprocessor的beanpostproceesorbeforeinition中执行");
this.cc = "cc";
}
public void initMethod() {
System.out.println("调用initMethod方法");
System.out.println(" @Bean(initMethod = ‘initMethod’),当在另个类里面以@bean注入的时候可以审明初入华执行的initmethod方法");
}
// bean的生命周期
// Spring项目启动后,首先创建Spring容器,并且会注入内置的BeanFactoryPostProcessor处理器,用来处理加载配置文件,注解,或者xml等配置文件、解析,将读取到的内容存放到BeanDefinitionMap中(bean的定义信息中),
// 比如propertiesPlaceHodlerconfigurar就是用来处理spel表达式,像xml或者@value;
// 每一个bean对应map里面的 beanname 跟 beandefinition;
// 完成实例化
// 下面都是初始化,完成属性赋值的操作
// 然后属性赋值
// 执行已经册进去的aware接口,回调实现属性的赋值;
// 执行bpp的前置处理器方法,bppbeforeinition() @PostConstruct就是这个时候执行的;
// 执行inintliziBean的接口方法(包括,afterPropertiesSet,init-method方法)
// 执行bppaftoerinittion()方法,完成aop的操作,实现代理,功能增强的功能;
// 使用中;
// 销毁;
//
// 可以自实义inintliziBean的实现类完成afterPropertiesSet,init-method方法,完成属性的填充
// 可以自定义某个aware的实现类完成某个功能,比如ApplicationContextAware 获取Context,获得任一对象bean
// 可以自定义实现beanPostProcessor的实现类完成两个方法,前置处理器,后置处理器,前置处理器可以完成一些初始化赋值的功能,后置处理器可以完成aop的一些功能
// 比如定义传进来的bean是否是isomeService接口的实现类,如果是的话,就可以通过动态代理代理这个类生成一个代理对象,对这个代理对像里面的某个方法进行增强,比如增加打印日志等功能;
// 像@EnableAsync注解的原理就是通过import引入AsyncCongurationSelector类,再根据你用@EnableAsync注解时传入的AdviceMode的值默认选择是proxy代理方式 完成配置的获取
}