Spring创建bean的方式有哪些(bean,spring,开发技术)

时间:2024-05-09 08:26:37 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    Spring%E5%88%9B%E5%BB%BAbean%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9C%89%E5%93%AA%E4%BA%9B

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,使用了 SqlSessionFactoryBeanMapperFactoryBean ,这两个就是工厂bean,它们实现了 FactoryBean 接口。前者生产 SqlSessionFactory ,后者生产 Mapper 。比如:

本文:Spring创建bean的方式有哪些的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:JWT设置token过期时间无效怎么解决下一篇:

7 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18