文章目录
- A. 初始化机制
- 实现初始化机制的方法
- 1.实现`InitializingBean`接口
- B. 回调机制(`Aware`)
- 初始化机制和回调机制之间的区别
A. 初始化机制
在Spring
框架中,初始化机制是Bean
生命周期管理的一个重要组成部分。它确保了Bean
在创建和依赖注入完成后,能够执行必要的初始化逻辑,如资源分配、状态设置等。spring
提供了多种方式来支持bean
的初始化机制.
初始化机制发生时间:在完成了
bean
对象的创建和依赖注入后
实现初始化机制的方法
1.实现InitializingBean
接口
spring
框架提供了一个InitializingBean
接口,该接口包含一个afterPropertiesSet()
方法。当一个Bean
实现了这个接口后,Spring
容器会在Bean
的所有属性被设置完毕后,自动调用afterPropertiesSet()
方法。这允许Bean
在依赖注入完成后执行一些初始化操作。
//自定义一个InitializingBean 接口public interface InitializingBean {public void afterPropertiesSet();
}
//bean对象实现该接口,并重写其中的afterPropertiesSet()方法@Component
@Scope("prototype") //多例
public class UserService1 implements InitializingBean {@Overridepublic void afterPropertiesSet() {System.out.println("进行after :InitializingBean~~~~");}
}
那么具体是如何在bean
对象的创建过程中执行的呢?
其实很简单,只需要在完成bean
对象的创建和依赖注入后,判断该bean
对象是否实现了InitializingBean
接口,如果实现了,调用该方法即可
/**** 初始化机制** */if(instance instanceof InitializingBean){((InitializingBean)instance).afterPropertiesSet();}
instanceof
:在Java
编程语言中,instanceof
关键字被用于检查一个对象是否是指定类的实例(或其子类的实例)。这个操作符返回一个布尔值:如果对象是指定类型的实例,或者是指定类型子类的实例,则返回 true;否则返回 false。
- 使用
@PostConstruct
注解
@PostConstruct
注解是Java EE 5
引入的,用于标记在依赖注入完成后需要被自动调用的初始化方法。在Spring
框架中,当一个Bean
的方法上使用了@PostConstruct
注解时,Spring
容器会在Bean
实例化并且所有属性被注入后,自动调用该方法。这种方式比实现InitializingBean
接口更加简洁和直观。
/**** 执行@PostConstruct注释的方法** *///当前遍历clazz的所有方法for(Method method:clazz.getDeclaredMethods()){if(method.isAnnotationPresent(PostConstruct.class)){//说明当前的方法上存在这个@PostConstruct注解,那么调用这个方法method.invoke(instance,null);//调用当前被注释的这个方法}}
B. 回调机制(Aware
)
在Spring
框架中,回调机制是一种强大的特性,它允许在Spring
容器中的Bean
生命周期的不同阶段执行特定的操作。这种机制为开发者提供了一种灵活的方式来管理和控制Bean
的生命周期。
它允许Bean
在初始化过程中感知并获取Spring
容器的相关信息或资源。这种机制通过一组预定义的Aware
接口来实现,当Bean
实现了这些接口后,Spring
容器会在Bean
初始化时自动调用相应的回调方法,并将相关的上下文或资源对象传递给Bean
。
举例BeanNameAware
回调接口进行说明:
/*** beanName的回调机制(Aware)* */
public interface BeanNameAware {public void setBeanName(String beanName);
}
此处我们实现的bean
对象,实现了BeanNameAware
接口,并且重写了其中的setBeanName
方法:
@Component("userService")
public class UserService implements BeanNameAware{@Autowirdprivate OrderService orderService;private String beanName;@Overridepublic void setBeanName(String beanName) {this.beanName=beanName;}
}
那么,在spring
容器中,我们应该怎么对aware
机制的接口进行调用呢?
/**** aware回调机制**/if(instance instanceof BeanNameAware){((BeanNameAware) instance).setBeanName(beanName);//强制类型转换,调用重写方法}
这里,我们判断是否实现了
bean
对象是否实现了BeanNameAware
接口:如果实现,直接强制类型转换后,对该方法进行调用.
初始化机制和回调机制之间的区别
- 应用的场景不同:
总结来说:初始化机制会对开发人员设置的方法进行调用,具体的执行内容并不负责;而回调机制是对
spring
容器中的某个参数进行获取.