自学内容网 自学内容网

【手写一个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。

  1. 使用@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)!