【手写一个spring】spring源码的简单实现--初始化机制,回调机制
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 {
@Override
public 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{
@Autowird
private OrderService orderService;
private String beanName;
@Override
public void setBeanName(String beanName) {
this.beanName=beanName;
}
}
那么,在spring
容器中,我们应该怎么对aware
机制的接口进行调用呢?
/**
*
* aware回调机制
*
*/
if(instance instanceof BeanNameAware){
((BeanNameAware) instance).setBeanName(beanName);//强制类型转换,调用重写方法
}
这里,我们判断是否实现了
bean
对象是否实现了BeanNameAware
接口:如果实现,直接强制类型转换后,对该方法进行调用.
初始化机制和回调机制之间的区别
- 应用的场景不同:
- 初始化机制是
spring
容器对某个方法进行调用的一种机制,这里的方法是由开发人员设计的,由spring
容器进行调用,具体执行的内容spring
容器并不负责. - 回调机制是需要从
spring
容器中获取某个属性的时候进行调用的,当Bean
实现了某个Aware
接口后,Spring
容器会在Bean
初始化时自动调用该接口定义的回调方法,并将相关的上下文或资源对象作为参数传递给该方法。开发者可以在这些方法中获取Spring
容器的相关信息或资源,并执行相应的逻辑。
- 初始化机制是
总结来说:初始化机制会对开发人员设置的方法进行调用,具体的执行内容并不负责;而回调机制是对
spring
容器中的某个参数进行获取.
原文地址:https://blog.csdn.net/2301_78320637/article/details/143978356
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!