被Spring管理的bean可以是直接创建实例,还可以通过工厂模式来进行创建。例如brave的tracing bean定义:
 <bean id="tracing" class="brave.spring.beans.TracingFactoryBean">
...
<property name="propagationFactory">
<bean id="propagationFactory" class="brave.propagation.ExtraFieldPropagation"
factory-method="newFactory">
<constructor-arg index="0">
<util:constant static-field="brave.propagation.B3Propagation.FACTORY" />
</constructor-arg>
<constructor-arg index="1">
<list>
<value>user-name</value>
</list>
</constructor-arg>
</bean>
</property>
</bean>
 
1. Spring的工厂模式获取bean
class + factory-method属性的定义指出了该bean的获取方式是静态工厂模式;
与之类似的是实例工厂模式,在spring中实例化一个类,然后通过factory-bean + facgtory-method的方式来获取bean实例。
 <bean id="carFactory" class="com.home.factoryMethod.CarInstanceFactory">
...
</bean>
<bean id="car4" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="4"></constructor-arg>
</bean>
 
2. 构造/参数
<constructor-arg index="0">这种写法是通过工厂(静态/动态)构造函数的参数,尽管这里是通过factory-method的方式,并不是传统意义的构造函数,那是确实是构造函数的语义。通过constructor-arg这种声明方式除了可以通过xml中配置来进行实例化,还可以通过编程的方式来构造对象:
 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factoryMethod.xml");
Car car1 = (Car) ctx.getBean("car4");
 
3. 静态字段的处理
 <constructor-arg index="0">
<util:constant static-field="brave.propagation.B3Propagation.FACTORY" />
</constructor-arg>
这个写法是为第一个构造函数赋值,util:constant static-field这个语义就是说明FACTORY是B3Propagation里面的静态字段,在进行反射处理的时候需要基于静态字段的处理。
 
4. util:constant
  是spring里面很活跃的处理,尤其是在map,list的定义很方便:
 <bean id="some1" class="cn.itcast.spring._util.Some">
<property name="val" value="some instance1" />
</bean>
<bean id="some2" class="cn.itcast.spring._util.Some">
<property name="val" value="some instance2" />
</bean>
<bean id="some3" class="cn.itcast.spring._util.Some">
<property name="val" value="some instance3" />
</bean>
<util:list id="strArray">
<value>Hello</value>
<value>Welcome</value>
</util:list>
<util:list id="objArray">
<ref bean="some1" />
<ref bean="some2" />
<ref bean="some3" />
</util:list>
<util:list id="list" list-class="java.util.ArrayList">
<ref bean="some1"/>
<ref bean="some2" />
<ref bean="some3" />
</util:list>
<util:map id="map" map-class="java.util.HashMap" >
<entry key="key1" value-ref="some1"/>
<entry key="key2" value-ref="some2"/>
<entry key="key3" value-ref="some3"/>
</util:map>
<bean id="someBean" class="cn.itcast.spring._util.SomeBean">
<property name="someStrArray" ref="strArray"/>
<property name="someObjArray" ref="objArray"/>
<property name="someList" ref="list"/>
<property name="someMap" ref="map"/>
</bean>

5. Spring里面的sington

  一类工厂bean是AbstractFactoryBean,那么可以通过setSingleton来设定创建的类是singleton还是每次都返回新的实例。

 
 
参考:

由spring的工厂构造bean想到的的更多相关文章

  1. 使用Junit测试一个 spring静态工厂实例化bean 的例子,所有代码都没有问题,但是出现java.lang.IllegalArgumentException异常

    使用Junit测试一个spring静态工厂实例化bean的例子,所有代码都没有问题,但是出现 java.lang.IllegalArgumentException 异常, 如下图所示: 开始以为是代码 ...

  2. Spring 通过工厂配置Bean

    1.通过静态工厂方法配置Bean 要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名 ...

  3. Spring 通过工厂方法(Factory Method)来配置bean

    Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...

  4. Spring基础(3) : 静态工厂和实例工厂创建bean

    public class Factory { public static Person staticCreate(){ Person p = new Person(); p.name="st ...

  5. [sping]xml配置文件中factory-bean与factory-method(spring使用工厂方法注入bean)

    public class CarFactory { //非静态方法 public Car createCar(){ Car car = new Car(); car.setBrand("BM ...

  6. spring实战一:装配bean之注入Bean属性

    内容参考自spring in action一书. 创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入的本质. 1. 创建spring配置 spring是一个基于容器的框架.如果没有配置spri ...

  7. Spring三种实例化Bean的方法

    1.实例化bean的三种方法:(1) 构造器<!-- 体验1 --><bean id="personService" class="com.persia ...

  8. spring-framework-中文文档一:IoC容器、介绍Spring IoC容器和bean

    5. IoC容器 5.1介绍Spring IoC容器和bean 5.2容器概述 本章介绍Spring Framework实现控制反转(IoC)[1]原理.IoC也被称为依赖注入(DI).它是一个过程, ...

  9. spring学习(03)之bean实例化的三种方式

    bean实体例化的三种方式 在spring中有三中实例化bean的方式: 一.使用构造器实例化:(通常使用的一个方法,重点) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化 第一种.使用构 ...

随机推荐

  1. Sybase数据库常用函数

    Sybase数据库常用函数 一.字符串函数 1,ISNULL(EXP1,EXP2,EXP3,...) :返回第一个非空值,用法与COALESCE(exp1,exp2[,exp3...])相同: 2,T ...

  2. libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)

    转载:http://blog.csdn.net/fengshuiyue/article/details/39530093(基本教程) 转载:https://my.oschina.net/u/14207 ...

  3. js的重载

    1.重载 //重载(个数不同,类型不同)function prop(){var firstP = document.getElementById("p");if(arguments ...

  4. CF_884_F(NetFlow)

    codeforces_884_f 题目大意:给出一串长为n的字符串(保证n为偶数),定义反回文串为每一个位置的对应位置上的字母都不等于它(for each i : s[i] != s[n+1-i]), ...

  5. python 去除不可见的控制字符

    尤其是在json load的时候,字符串中的不可见控制字符可能会导致错误,应该先对字符串进行控制字符过滤. 对网页文本同样适用,最好在处理网页文本时先进性控制字符清洗. Replace null by ...

  6. socket可读可写就绪条件

    参考 <UNIX 网络编程卷1>中的<第6章 I/O复用> 一. 满足下列四个条件中的任何一个时,一个套接字准备好读. 该套接字接收缓冲区中的数据字节数大于等于套接字接收缓存区 ...

  7. javascript debugger

    打开调试工具,刷新,可以看到脚本被暂停 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  8. Spring中的@Transactional

    spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: @Transactiona ...

  9. Rails 5 Test Prescriptions 第9章 Testing-JavaScript: Integration Testing,❌挂一个问题webpacker::helper

    使用Capybara进行JS的集成测试 谈论驱动 让测试通过 Webpack in Development Mode Js设计 是用户在网页上有好的体验的重要因素. 尽管如此,许多网页不测试JS. 部 ...

  10. bzoj-4565-区间dp+状压

    4565: [Haoi2016]字符合并 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 542  Solved: 253[Submit][Status ...