详解-手写Spring框架(5)-初始化

引言

在Spring框架中,InitializingBean接口是一个用于定义Bean初始化逻辑的接口。通过实现InitializingBean接口,我们可以在Bean实例化完成后执行自定义的初始化操作,从而更好地掌控Bean的状态和行为。

本文将深入探究InitializingBean接口的使用方法、原理以及与其他初始化方式的比较,帮助读者更好地了解和应用这一特性。

InitializingBean接口概述

InitializingBean接口是Spring框架提供的一种扩展机制,它包含了一个唯一的方法afterPropertiesSet()。当Spring容器实例化Bean并完成依赖注入后,会自动调用该方法来执行自定义的初始化逻辑。

本文文件目录

在这里插入图片描述

实现InitializingBean接口

要实现InitializingBean接口,只需在Bean类中添加implements InitializingBean语句,并实现afterPropertiesSet()方法。该方法可以包含需要在Bean初始化完成后执行的逻辑代码。

  1. 创建接口类InitializingBean,并声明afterPropertieSet()方法
public interface InitializingBean {
    void afterPropertieSet() throws Exception;
}
  1. 在bean类中调用接口,重写方法,在方法体中书写创建bean实例时需要做的事
@Scope("prototype")//原型bean
@Component("userService")//用户定义的bean的名字,说明UserService是个bean
public class UserService implements InitializingBean {
    @Autowired//意思就是让spring自动为orderService注入值
    private OrderService orderService;
    
    //spring提供的初始化机制
    @Override//创建userService对象时,spring会调afterPropertieSet()方法,可以在方法体中做很多事
    public void afterPropertieSet() throws Exception {
        System.out.println("LPL2023世界赛夺冠");
    }

    public void test(){
        System.out.println(orderService);//打印orderService属性
    }
}
  1. 在ApplicationContext类中的createBean方法里添加初始化机制
    public Object createBean(String beanName,BeanDefinition beanDefinition) throws Exception {
		Class clazz=beanDefinition.getClazz();
        //实例化得到对象
        Object instance=clazz.getDeclaredConstructor().newInstance();
		......
        //初始化
        //判断当前实例对象是否实现了InitializingBean接口
        if(instance instanceof InitializingBean){
            //如果实现,就让spring调用afterPropertieSet方法,做方法体中的事
            ((InitializingBean)instance).afterPropertieSet();
        }
        return instance;

    }
  1. 测试初始化情况
public class Test {//测试书写的spring源码是否正确
    public static void main(String[] args) throws Exception {
        ApplicationContext applicationContext =new ApplicationContext(AppConfig.class);//传入配置文件

        //依赖注入的目的:在从spring容器中获取到userService对象时,userService中的orderService属性应该已经赋好了值
        UserService userService=(UserService) applicationContext.getBean("userService");
        userService.test();
    }
}

打印结果:(正常打印出了afterPropertiesSet()中的内容)
在这里插入图片描述

InitializingBean接口与其他初始化方式的比较

与其他初始化方式相比,InitializingBean接口具有以下几点优势:

  • 内置于Spring框架:InitializingBean接口是Spring框架提供的标准接口,与框架紧密集成,无需额外导入或配置。
  • 统一的初始化逻辑:通过实现InitializingBean接口,所有的初始化逻辑都可以集中在afterPropertiesSet()方法中,使代码更加整洁和可维护。
  • 容器感知性:在afterPropertiesSet()方法中,可以访问到由Spring容器提供的各种资源,如BeanFactory、ApplicationContext等,方便进行进一步的操作。

然而,InitializingBean接口也有一些限制和不足之处:

  • 与Spring框架强耦合:实现InitializingBean接口意味着Bean类与Spring框架紧密耦合,可能会降低代码的可移植性和可复用性。
  • 仅限于单个初始化方法:InitializingBean接口只提供了一个初始化方法,无法支持多个不同的初始化方法,可能不够灵活。

使用InitializingBean接口的注意事项

  • 异常处理:在afterPropertiesSet()方法内,应该正确处理所抛出的异常,以避免对Spring容器的正常运行产生负面影响。
  • 依赖注入:afterPropertiesSet()方法在属性注入完成后执行,可以确保所依赖的属性已经被正确注入。因此,如果有需要在初始化时使用的依赖属性,可以放心地在afterPropertiesSet()方法中使用。

总结

InitializingBean接口是Spring框架提供的一种初始化方式,通过实现该接口并编写自定义的初始化逻辑,我们可以更好地控制Bean的初始化过程。尽管与其他初始化方式相比,InitializingBean接口存在一些限制和不足之处,但它仍然是一个方便且内置于Spring框架的扩展机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值