前言:当我们使用 Spring 框架时,最常见的任务之一就是初始化 Bean。Bean 是 Spring 框架的核心概念之一,它代表了应用程序中的一个对象,可以是任何 Java 对象。以下介绍Spring实例化bean的三种方式
1.构造方法(bean初始化默认的方法)
1.1测试
演示中有一个持久层接口和对应实现类,接口中仅有一个fun方法,配置文件中仅完成了bean的创建,在主程序中使用该bean并调用它的方法
当我们在UserDaoImpl中显式地创建构造函数并在里面打印输出
结果:可以发现Spring容器中的bean经过了类中的无参构造方法,说明bean的实例化默认需要无参构造函数,并且即使我们将构造函数私有,也会调用到它的无参构造。因为底层是通过反射实现的。
有参构造器行吗?答案是不行,如下当我们修改无参构造器后
会出现以下结果:
1.2结论:
- 以上就是Spring中bean实例化的第一种方式,构造函数的方式,并且只能通过无参构造函数的方式。构造函数实例化Bean具有简单直观、明确依赖关系和不可变性等优点,但灵活性受限、依赖注入困难和可测试性较差等缺点。
2.静态工厂
2.1测试
这里创建了一个工厂类和BookDao接口以及对应实现类,内部只有一个save方法,工厂类里面有一个静态创建BookDaoImpl的方法,这也是静态工厂的基本结构。
工厂类:
在Spring中配置bean需要注意不仅要指明工厂类,还要指明工厂类中的创建对象方法:
main方法以及运行结果如下 :
2.2结论:
静态工厂方法实例化Bean具有灵活性、隐藏实例化细节和可以使用不同的方法名称等优点。但同时也会增加代码复杂性和降低可测试性。
3.实例工厂
3.1测试
实例化工厂和静态工厂最大的区别就是静态工厂创建对象的方法是静态的,实例工厂中创建对象的方法是非静态的,也就是实例工厂需要创建出实例后再调用创建方法,比静态工厂多出了创建实例这一步。
实例工厂在Spring中配置bean的方式也有差距,分为两步,第一步是先把工厂对象给造出来,然后再是对象
运行结果如下:
3.2实例工厂的第二种方式
由于该方法中工厂bean仅仅是为了被引用,以及必须手动配置方法名,因此有以下改进方式 ,这种方式也是重点需要掌握的方式。我们可以创建一个新的工厂再通过实现FactoryBean接口实现内部方法来完成实例化。通过此方法,我们可以不再手动指定实例化的方法名,统一了规范并且简化了配置,工厂类具体实现代码如下:
我们在配置文件中配置bean的方式如下:
main方法以及运行结果:
3.2结论
使用实现FactoryBean接口创建Bean实例具有灵活性、可以管理对象生命周期和支持懒加载等优点。但同时也会增加代码复杂度和依赖注入的困难度。