七叶笔记 » java编程 » Spring创建bean实例的几种方式分享

Spring创建bean实例的几种方式分享

前言

Spring常见的创建bean实例的方式有:

1.通过bean的class属性创建实例 

无参构造器带参构造器

2.工厂方法

静态工厂方法实例工厂方法

3.工厂bean

关于每种方式的Spring配置,详见文末总结。

环境 Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17.0.3Spring 5.3.21 准备

创建Maven项目 test0705 。

修改 pom.xml 文件,添加依赖:

在 src/main/resources 目录下创建 applicationContext.xml 文件:

在 src/test/java 目录下创建测试:

通过bean的class属性创建实例(无参构造器)

注:这是最常见的创建bean的方式。我其它文档也用过相似代码。如果已熟悉可直接略过。

创建如下POJO:

Axe :Axe接口;StoneAxe :Axe实现类;SteelAxe :Axe实现类;Person :Person持有Axe;

在 applicationContext.xml 中注册bean:

创建测试用例:

运行测试,如下:

通过bean的class属性创建实例(带参构造器)

注:这是较为常见的创建bean的方式。我其它文档也用过相似代码。如果已熟悉可直接略过。

创建如下POJO:

Book :Book接口;PlayBook :Book实现类;StudyBook :Book实现类;Student :Student持有Book;

在 applicationContext.xml 中注册bean:

创建测试用例:

运行测试,如下:

......PlayBook constructorStudyBook constructorStudent constructorbefore getBean studentI am JerryPlay book!

工厂方法(静态工厂方法)

配置:

class 属性指向静态工厂类factory-method 属性指向静态工厂方法

注:如果静态工厂方法需要参数,则通过 constructor-arg 来指定。

例如:

当调用 ctx.getBean("dog") 时,Spring会调用 AnimalFactory 类的静态方法 getAnimal() ,并传入参数 "dog",创建一个Animal的实例并返回。

注:同普通的bean一样,其默认scope是 singleton ,多次调用 ctx.getBean("dog") 返回的是同一个实例(在Spring初始化时生产bean)。

完整例子如下:

创建如下POJO:

Animal :Animal接口;Dog :Animal实现类;Cat :Animal实现类;

创建工厂类 AnimalFactory :

在 applicationContext.xml 中注册bean:

创建测试用例:

运行测试,如下:

creating new Animal objectDog constructorcreating new Animal objectCat constructorbefore getBean dog catI am SnoopyWang wang...I am KittyMiao Miao...

工厂方法(实例工厂方法)

实例工厂方法跟静态工厂方法很相像,主要区别是:

静态工厂方法:不用实例化工厂,只需直接调用工厂类的静态工厂方法;实例工厂方法:工厂方法不是静态的,因此需要通过 factory-bean 来指定工厂类的实例。

比如:

其它都一样。

完整例子如下:

创建如下POJO:

Fruit :Fruit接口;Apple :Fruit实现类;Banana :Fruit实现类;

创建工厂类 FruitFactory :

在 applicationContext.xml 中注册bean:

创建测试用例:

运行测试,如下:

creating new Fruit objectApple constructorcreating new Fruit objectBanana constructorbefore getBean apple bananaI am FujiJuicy!I am PisangSweet!

工厂bean

工厂bean是指实现了 FactoryBean 接口的类。

FactoryBean 接口有3个方法:

T getObject() throws :创建产品实例;Class<?> getObjectType() :获取产品的类;default boolean isSingleton() {return true;} :是否单例,默认值为true;

实现 FactoryBean 接口,则无需再配置 factory-method ,Spring知道如何创建产品(通过 getObject() 方法)。

比如:

注意:该配置看起来很像普通的bean,实际上因为 CarFactoryBean 实现了 FactoryBean 接口,当调用 ctx.getBean("benz") 方法时,返回的并不是 CarFactoryBean 的实例,而是其 getObject() 方法的返回值。

注:默认scope是 singleton ,多次调用 ctx.getBean("dog") 返回的是同一个实例。如果在 CarFactoryBean 中override isSingleton() 方法并返回false,则每次调用ctx.getBean("benz") 返回的是不同对象。

注:工厂bean跟其它bean有一点不同,即使是singleton,它也不是在Spring初始化时生产bean,而是在第一次调用 ctx.getBean() 时才生产bean。

完整例子如下:

创建如下POJO:

Car :Car接口;Benz :Car实现类;Audi :Car实现类;

创建工厂类 FactoryBean :

在 applicationContext.xml 中注册bean:

创建测试用例:

运行测试,如下:

before getBean benz audicreating new Car objectBenz constructorGo go go!creating new Car objectAudi constructorOOOO

总结

此外,有几点说明:

使用工厂bean来管理的bean,即使scope是 singleton ,也并不是在Spring初始化时生产对象的,而是在第一次调用 ctx.getBean() 方法时生产的。

Spring整合MyBatis,使用了 SqlSessionFactoryBean 、 MapperFactoryBean ,这两个就是工厂bean,它们实现了 FactoryBean 接口。前者生产 SqlSessionFactory ,后者生产 Mapper 。比如:

到此这篇关于Spring创建bean实例的几种方式分享的文章就介绍到这了,更多相关Spring创建bean 内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章