一、Bean的创建
1. 实例化
- 默认使用该类的无参构造方法,进行实例化;
- 如果存在多个构造方法,Spring会根据配置推断出一个构造方法进行实例化;
2. 属性赋值(依赖注入)
- 在实例化之后,Spring 会检查该对象的属性是否需要自动注入;
- 如添加了
@Autowired、@Resource、@Value 注解的属性,Spring 会为其注入相应的依赖;
- Spring拓展点:实现
InstantiationAwareBeanPostProcessor,重写postProcessProperties()
3. Aware回调
- 依赖注入后,Spring会判断该对象是否实现了
BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口;
- 如果实现了,就表示当前对象必须实现该接口中所定义的
setBeanName()、setBeanClassLoader()、setBeanFactory()方法,那Spring就会调用这些方法并传入相应的参数;
4 初始化前
- Spring拓展点:实现
BeanPostProcessor接口,重写postProcessBeforeInitialization方法;
- Spring会调用当前Bean对象有
@PostConstruct注解的方法;
5 初始化
- 查看当前Bean对象是否实现了
InitializingBean接口;
- 如果实现了就调用其
afterPropertiesSet()方法;
6 初始化后
- Spring会判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,
- 如果需要进行AOP,则会进行动态代理并生成一个代理对象做为Bean;
- Spring拓展点:实现
BeanPostProcessor接口,重写postProcessAfterInitialization方法:
7. Bean的销毁过程
public class MyBean implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("销毁方法...");
}
}
- 在XML配置文件中,可以通过 bean元素的
destroy-method 属性来指定销毁方法;
<bean id="myBean" class="com.example.MyBean" destroy-method="destroy"/>
public class MyBean {
@PreDestroy
public void destroy() {
System.out.println("销毁方法...");
}
}
- 使用 @Bean 注解的
destroyMethod 属性
@Configuration
public class AppConfig {
@Bean(destroyMethod = "destroy")
public MyBean myBean() {
return new MyBean();
}
}
public class MyBean {
public void destroy() {
System.out.println("销毁方法...");
}
}
二、代码案例
1. MyBean类
@Data
@Component
public class MyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {
private String name;
public MyBean(){
System.out.println("==》1.实例化:无参构造器执行...");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("==》3.BeanFactoryAware回调");
}
@Override
public void setBeanName(String name) {
System.out.println("==》3.BeanNameAware回调 " );
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("==》3.ApplicationContextAware回调" );
}
@PostConstruct
public void init() {
System.out.println("==》4.初始化前:@PostConstruct" );
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("==》5.初始化:InitializingBean.afterPropertiesSet");
}
@Override
public void destroy() throws Exception {
System.out.println("==》7.销毁方法:destroy");
}
}
2. MyBeanPropertiesProcessor类
@Component
public class MyBeanPropertiesProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
if ("myBean".equals(beanName)) {
MyBean myBean = (MyBean) bean;
myBean.setName("李四");
System.out.println("==》2.属性赋值:InstantiationAwareBeanPostProcessor.postProcessProperties:" + myBean.getName());
}
return pvs;
}
}
3. MyBeanPostProcessor类
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("myBean".equals(beanName)) {
System.out.println("==》4.初始化前:postProcessBeforeInitialization");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("myBean".equals(beanName)) {
System.out.println("==》6.初始化后:postProcessAfterInitialization");
}
return bean;
}
}
4.输出结果
==》1.实例化:无参构造器执行...
==》2.属性赋值:InstantiationAwareBeanPostProcessor.postProcessProperties:李四
==》3.BeanNameAware回调
==》3.BeanFactoryAware回调
==》3.ApplicationContextAware回调
==》4.初始化前:postProcessBeforeInitialization
==》4.初始化前:@PostConstruct
==》5.初始化:InitializingBean.afterPropertiesSet
==》6.初始化后:postProcessAfterInitialization
==》7.销毁方法:destroy