Spring创建bean的方式有哪些
导读:本文共10818.5字符,通常情况下阅读需要36分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 环境Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17.0.3Spring 5.3.21 准备创建Maven项目 test0705 。修改 pom.xml 文件,添加依赖:......<!--https://mvnrepository.com/artifact/junit/junit--><dependency... ...
目录
(为您整理了一些要点),点击可以直达。Ubuntu 22.04
IntelliJ IDEA 2022.1.3
JDK 17.0.3
Spring 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的方式。我其它文档也用过相似代码。如果已熟悉可直接略过。
创建如下POJO:
Book
:Book接口;
PlayBook
:Book实现类;
StudyBook
:Book实现类;
Student
:Student持有Book;
在 applicationContext.xml
中注册bean:
创建测试用例:
运行测试,如下:
......
PlayBook constructor
StudyBook constructor
Student constructor
before getBean student
I am Jerry
Play 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 object
Dog constructor
creating new Animal object
Cat constructor
before getBean dog cat
I am Snoopy
Wang wang...
I am Kitty
Miao Miao...
实例工厂方法跟静态工厂方法很相像,主要区别是:
静态工厂方法:不用实例化工厂,只需直接调用工厂类的静态工厂方法;
实例工厂方法:工厂方法不是静态的,因此需要通过 factory-bean
来指定工厂类的实例。
比如:
其它都一样。
完整例子如下:
创建如下POJO:
Fruit
:Fruit接口;
Apple
:Fruit实现类;
Banana
:Fruit实现类;
创建工厂类 FruitFactory
:
在 applicationContext.xml
中注册bean:
创建测试用例:
运行测试,如下:
creating new Fruit object
Apple constructor
creating new Fruit object
Banana constructor
before getBean apple banana
I am Fuji
Juicy!
I am Pisang
Sweet!
工厂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 audi
creating new Car object
Benz constructor
Go go go!
creating new Car object
Audi constructor
OOOO
此外,有几点说明:
使用工厂bean来管理的bean,即使scope是 singleton
,也并不是在Spring初始化时生产对象的,而是在第一次调用 ctx.getBean()
方法时生产的。
Spring整合MyBatis,使用了 SqlSessionFactoryBean
、 MapperFactoryBean
,这两个就是工厂bean,它们实现了 FactoryBean
接口。前者生产 SqlSessionFactory
,后者生产 Mapper
。比如:
Spring创建bean的方式有哪些的详细内容,希望对您有所帮助,信息来源于网络。