使用静态工厂创建Bean
2018-02-28 00:00
274 查看
使用静态工厂创建Bean时,在<bean>中也要指定class属性,但此时class属性并不是指定Bean实列的实现类,而是产生该Bean的静态工厂类。Spring需要知道由哪个静态工厂来创建Bean实列。如下:
定义需要的Bean
分别有dog和cat两个实现类
下面的AnimalFactory工厂包含了getBeing静态方法,用于产生对应的动物。
XML中配置:
测试类:
控制台输出:
XML中dog和cat两个Bean配置的class属性和factory-method属性一样,因为这个两个Bean有同一个工厂中的静态方法产生,配置工厂的实参值使用<constructor-arg>进行配置。当我们指定Spring使用静态工厂方法来创建Bean实列时,Spring将先解析配置文件,并根据配置文件指定的信息,通过反射调用静态工厂类的静态工厂方法,将该静态工厂方法的返回值作为Bean实列。在这个过程中,Spring不再负责创建Bean实列,Bean实列由用户提供的静态工厂类负责创建。
定义需要的Bean
public interface Animal { //指定动物行为 public void beHaveing(); }
分别有dog和cat两个实现类
package com.custle.spring; public class Dog implements Animal { private String msg; public void setMsg(String msg) { this.msg = msg; } @Override public void beHaveing() { System.out.println(msg + "狗爱啃骨头"); } }
package com.custle.spring; public class Cat implements Animal { private String msg; public void setMsg(String msg) { this.msg = msg; } @Override public void beHaveing() { System.out.println(msg + "猫爱吃老鼠"); } }
下面的AnimalFactory工厂包含了getBeing静态方法,用于产生对应的动物。
package com.custle.spring; public class AnimalFactory { /** * 根据参数决定返回对应Animal的实列 * @param arg * @return */ public static Animal getBeing(String arg ){ if(arg.equalsIgnoreCase("dog")){ return new Dog(); }else{ return new Cat(); } } }
XML中配置:
<!-- 配置BeanFactory的getBeing方法产生dog Bean --> <bean id="dog" class="com.custle.spring.BeingFactory" factory-method="getBeing"> <!-- 配置静态工厂方法的参数 --> <constructor-arg value="dog"/> <!-- 配置普通依赖注入属性 --> <property name="msg" value="我是狗"/> </bean> <!-- 配置BeanFactory的getBeing方法产生cat Bean --> <bean id="cat" class="com.custle.spring.BeingFactory" factory-method="getBeing"> <!-- 配置静态工厂方法的参数 --> <constructor-arg value="cat"/> <!-- 配置普通依赖注入属性 --> <property name="msg" value="我是猫"/> </bean>
测试类:
package com.custle.spring; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class BeingTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-spring.xml"); Animal dog = applicationContext.getBean("dog", Animal.class); dog.beHaveing(); Animal cat = applicationContext.getBean("cat", Animal.class); cat.beHaveing(); } }
控制台输出:
我是狗狗爱啃骨头 我是猫猫爱吃老鼠
XML中dog和cat两个Bean配置的class属性和factory-method属性一样,因为这个两个Bean有同一个工厂中的静态方法产生,配置工厂的实参值使用<constructor-arg>进行配置。当我们指定Spring使用静态工厂方法来创建Bean实列时,Spring将先解析配置文件,并根据配置文件指定的信息,通过反射调用静态工厂类的静态工厂方法,将该静态工厂方法的返回值作为Bean实列。在这个过程中,Spring不再负责创建Bean实列,Bean实列由用户提供的静态工厂类负责创建。
相关文章推荐
- Spring使用静态工厂方法创建Bean
- Spring使用静态工厂方法创建Bean(一)
- 转:Spring使用静态工厂方法创建Bean
- 【spring notes】 使用静态工厂方法创建Bean
- 7.7.2:使用静态工厂方法创建Bean
- 7.7.2: Bean实例的创建方式及依赖配置---使用静态工厂方法创建Bean
- Spring 学习总结 使用静态工厂创建Bean
- 4.2 使用工厂方法创建Bean
- SocketChannel类(用于阻塞或非阻塞式传输数据) 创建SocketChannel要使用SocketChannel类的静态工厂方法。 SocketChannel open():创建未连接的
- Fragment传参:使用静态工厂方法来创建Fragment的实例
- spring创建bean的三种方式-通过构造器,通过静态工厂方法,通过实例工厂方法
- Spring使用实例工厂方法创建Bean(一)
- 使用实列工厂创建Bean
- Spring 使用静态工厂方式实例化Bean
- Spring学习--静态工厂方法、实例工厂方法创建 Bean
- 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器
- Spring学习之使用静态工厂方法以及实例工厂方法配置bean
- Spring入门学习——调用静态工厂方法创建Bean
- Spring静态工厂和实例工厂创建bean
- SocketChannel类(用于阻塞或非阻塞式传输数据) 创建SocketChannel要使用SocketChannel类的静态工厂方法。 SocketChannel open():创建未连接的