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

    ■场景 执行nohup命令的时候,经常会出现下面这种没有写入权限的错误. nohup: ignoring input and appending output to `nohup.out'nohup: ...

  2. 【转载】Java动态代理之JDK实现和CGlib实现(简单易懂)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是 ...

  3. UVA11090 Going in Cycle!!(二分判负环)

    UVA11090 Going in Cycle!! 二分答案,用spfa判负环. 注意格式:图不一定连通. 复杂度$O(nmlog(maxw-minw))$ #include<iostream& ...

  4. 清理tomcat日志大的文件

    先看一个命令: [root@weblogic logs]# catalina.--.log icatalina.--:-.out icatalina.--:-.out localhost_access ...

  5. 【Java----正则关键字转义】

    正则需要转义字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'   问题现象:  替换URL格式的字符串时 ...

  6. POJ 3259 Wormholes(Bellman-Ford)

    http://poj.org/problem?id=3259 题意:有一些普通的洞和虫洞,每个洞都有经过的时间,虫洞的时间是负的,也就是时光倒流,问是否能回到出发时的时间. 思路: 贝尔曼-福特算法判 ...

  7. python 获取5天前的日期

    from datetime import date, timedelta dt = date.today() - timedelta() print('Current Date :',date.tod ...

  8. Java IO流-标准输入输出流

    2017-11-05 19:13:21 标准输入输出流:System类中的两个成员变量. 标准输入流(public static final InputStream in):“标准”输入流.此流已打开 ...

  9. Java Spring-AOP的概述

    2017-11-08 19:31:23 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP ...

  10. auth权限认证详细讲解

    auth权限认证详细讲解 一.总结 一句话总结:四表两组关系,一个多对多(权限和用户组之间)(多对多需要3个表),一个一对多(用户和用户组之间) 1.实际上使用Auth是需要4张表的(1.会员表 2. ...