Spring Ioc 实例化 Bean 对象有几种方式?
Spring Ioc 实例化 Bean 对象有几种方式?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QzpmfVbH-1600334829896)(https://imgkr.cn-bj.ufileos.com/50416f44-5b7e-43bb-a0c4-ee71be577c04.jpg)]
Spring 实例化 bean 的方式
- 构造器的方式
- 静态工厂方式
- 实例化工厂方式
案例实操
构造器的方式实例化 bean 对象
<bean id="hello" name="hello" class="com.xxx.demo.Hello"></bean>
**通过默认构造器创建 空构造方法必须存在 否则创建失败 **
静态工厂模式
特点:
要有该工厂类及工厂方法
工厂方法是静态的
StaticFactory 静态工厂
/**
* 静态工厂模式
*
*/
public class StaticFactory {
public static GoodsService createGoodsService() {//方法一定要是一个静态方法
return new GoodsService();
}
}
GoodsService实体类
public class GoodsService {
public void getGoodsInfo() {
System.out.println("外星人贼便宜");
}
}
Bean配置
<bean id="goodsService"
class="com.xxx.demo.StaticFactory" factory-method="createGoodsService"></bean>
当我们指定Spring使用静态工厂方法来创建Bean实例时,Spring将先解析配置文件,并根据配置文件指定的信息,通过反射调用静态工厂类的静态工厂方法,并将该静态工厂方法的返回值作为Bean实例,在这个过程中,Spring不再负责创建Bean实例,Bean实例是由用户提供的静态工厂方法提供的。
实例化工厂方式创建 Bean
相比较静态工厂实现
1、工厂方法为非静态方法
2、需要配置工厂bean,并在业务bean中配置factory-bean,factory-method属性
实例化工厂定义
/**
* 实例化工厂
* @author Best Liu
*
*/
public class InstanceFactory {
public OrderService createOrderService() {
return new OrderService();
}
}
实体类定义
public class OrderService {
public void getOrderInfo() {
System.out.println("亲,已经下单完成,但是想发货没门");
}
}
Bean配置
<!--
实例化工厂
1、定义实例化工厂bean
2、引用工厂bean指定工厂创建方法(方法为非静态)
-->
<bean id="instanceFactory" class="com.xxx.demo.InstanceFactory"></bean>
<bean id="orderService" factory-bean="instanceFactory" factory-method="createOrderService"></bean>
扩展
Spring 三种实例化 bean 的方式比较
方式一:通过bean的缺省构造函数创建,当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。
方式二:利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法先进行统一的处理等等。
方式三:利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,
1、可用于集成其他框架的bean创建管理方法
2、能够使bean和factory的角色互换
用这个factory方法先进行统一的处理等等。
方式三:利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,
1、可用于集成其他框架的bean创建管理方法
2、能够使bean和factory的角色互换
开发中项目一般使用一种方式实例化bean,项目开发基本采用第一种方式,交给spring托管,使用时直接拿来使用即可,另外两种了解即可。