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的角色互换

**开发中项目一般使用一种方式实例化bean,项目开发基本采用第一种方式,交给spring托管,使用时直接拿来使用即可,另外两种了解即可。

更多相关文章

  1. IDA静态分析
  2. 静态路由实例
  3. 队列(静态方式)
  4. 设计模式之抽象工厂模式
  5. 设计模式之工厂模式
  6. 小程序静态资源如何设置防盗链?
  7. 静态h5页面没有后台直接访问本地json文件
  8. 在Rails 3中通过.ajax渲染静态部分
  9. 用HTML+CSS编写一个计科院网站首页的静态网页

随机推荐

  1. javascript阻塞加载问题【转】
  2. AngularJS:登录cookie过期时如何注销
  3. 调用另一个html页面后,选择列表值不会保持
  4. 怎么javascript读取本地文件中的数据,并显
  5. RequireJS中的命名模块与未命名模块
  6. 更新:在Gulpfile中带有postCSS和Babel的
  7. 推json敲出可观察的数组
  8. Angularjs在ng-repeat中找到最后一个可见
  9. Angularjs:如何将范围变量传递给指令?
  10. IE 浏览器各个版本 JavaScript 支持情况