转:http://blog.sina.com.cn/s/blog_5f1fe33f0100hyx7.html
配置工厂Bean
通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象.
一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean.
调用getBean()方法,Spring返回的不是直接创建的Bean的实例,而是由工厂Bean创建的Bean实例.
一般在Spring中配置工厂Bean,有3中不同类型的工厂Bean的配置.
1.静态工厂
创建具体Bean实例的是静态方法
import java.util.Random;
public class StaticFactoryBean {
public static Integer createRandom() {
return new Integer(new Random().nextInt());
}
}
将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称
<bean id="random"
class="example.chapter3.StaticFactoryBean"
factory-method="createRandom" //
createRandom方法必须是static的,才能找到
scope="prototype"
/>
测试:
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("random").toString());
//StaticFactoryBean sfb = (StaticFactoryBean)factory.getBean("random");
//System.out.println(sfb.createRandom().toString());
//调用getBean()时,返回随机数.如果没有指定factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例
}
2.实例工厂
创建具体Bean实例的是实例,不是静态方法
import java.text.SimpleDateFormat;
import java.util.Date;
public class InstanceFactoryBean {
private String format = "yy-MM-dd HH:mm:ss";
public void setFormat(String format) {
this.format = format;
}
public String createTime() {
return new SimpleDateFormat(format).format(new Date());
}
}
配置文件需要配置两个bean:第一个Bean和普通的Bean没有区别,第二个bean定义如何通过工厂Bean获取Bean,需要指定工厂Bean的名称和方法名称
<bean id="instanceFactoryBean" class="example.chapter3.InstanceFactoryBean">
<property name="format" value="yyyy-MM-dd HH:mm:ss" />
</bean>
<bean id="currentTime"
factory-bean="instanceFactoryBean"
factory-method="createTime"
/>
测试:
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("currentTime"));
}
3.实现FactoryBean接口
public class PiFactoryBean implements FactoryBean {
public Object getObject() throws Exception {
return new Double(3.14159265358979);
}
public Class getObjectType() {
return Double.class;
}
public boolean isSingleton() {
return true;
}
}
实现了FactoryBean接口的Bean,不再被视为普通的Bean.Spring会自动检测.
<bean id="pi" class="example.chapter3.PiFactoryBean" />
测试
public static void main(String[] args) throws Exception {
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));
System.out.println(factory.getBean("pi"));//返回PiFactoryBean 的工厂方法getObject返回的Double对象实例
//PiFactoryBean p = (PiFactoryBean)factory.getBean("&pi"); //加"&"返回工厂Bean的实例.
//System.out.println(p.getObject());
}
分享到:
相关推荐
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) (Level 300)
### Spring的BeanFactory的接口注解 #### 一、引言 在Spring框架中,`BeanFactory`是工厂模式的一种实现,它负责管理容器中的Bean的生命周期与依赖注入。了解`BeanFactory`及其相关接口的功能对于掌握Spring的核心...
- 如果不想通过默认构造函数创建Bean,可以使用`factory-bean`和`factory-method`来指定工厂Bean和工厂方法。 8. ** Profiles**: - Spring 3.1 引入了Profiles的概念,允许根据不同的环境配置不同的Bean。例如:...
<bean id="actualBean" factory-bean="myFactoryBean" factory-method="create"/> ``` 在这个例子中,`myFactoryBean`是FactoryBean,`actualBean`是通过`myFactoryBean`的`create`方法创建的。 在标签"源码"中,...
实例化Bean有两种方式:通过`class`属性指定构造器,或者通过`factory-bean`和`factory-method`指定工厂方法。 - **构造器实例化**: ```xml <!-- 构造器参数 --> ``` - **工厂方法实例化**: ```xml ...
<bean id="exampleBean" class="com.example.StaticFactory" factory-method="create"/> ``` 这里,`class`属性指定了静态工厂类,`factory-method`属性指定了要调用的静态工厂方法。 实例工厂的配置则更复杂一些...
“tiny-spring-step-7-method-interceptor-by-jdk-dynamic-proxy.zip”开始涉及AOP概念,通过JDK动态代理实现了方法拦截器,这使得我们可以在不修改原有代码的情况下,对方法进行增强,例如添加日志、事务控制等。...
在源码中,`org.springframework.beans.factory.BeanFactory`接口和`org.springframework.context.ApplicationContext`接口是IoC容器的基石。`ApplicationContext`提供了更丰富的功能,如事件发布、国际化支持和AOP...
使用`factory-bean`属性来指定工厂类的bean id,`factory-method`属性指定工厂方法: ```xml <bean id="myBean" factory-bean="myBeanFactory" factory-method="createMyBean"/> ``` 三、实例工厂注入的优势 1. ...
2. **工厂方法配置**:对于非静态工厂类,可以通过`factory-bean`指定工厂对象,`factory-method`指定工厂方法,如`clientService2`。对于静态工厂类,可以直接在`class`属性中指定工厂方法,如`clientService`。 3...
- `<bean id="personService3" factory-bean="fac" factory-method="createInstance" scope="prototype">`: `factory-bean`引用一个已经存在的bean,`factory-method`则指定实例工厂的方法,这里创建的是原型...
上面的配置中,首先定义了一个 `InstanceObjectsFactory` 对象,然后通过 `factory-bean` 指定了工厂对象的 ID,通过 `factory-method` 指定了工厂方法的名称。当 Spring.NET 容器需要创建 `instanceCreatedObject` ...
9. `<bean factory-method="">`:通过工厂方法创建bean,而非使用默认构造器。 10. `<aop:config>`和`<aop:aspect>`:用于配置面向切面编程(AOP),定义切点、通知、切面等。 Spring的`ApplicationContext`是...
<object id="myObject" factory-type="MyNamespace.Factory, MyAssembly" factory-method="CreateInstance"> <constructor-arg index="0" value="param1"/> ``` 这里,`factory-type`指定了包含工厂方法的类...
<bean id="userService" factory-bean="instanceFactory" factory-method="getUserServiceStatic"/> ``` Spring还提供了对bean作用域、生命周期管理和AOP(面向切面编程)等高级功能。例如,`scope`属性可以设置...
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" /> <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" /> ...
在Spring配置文件中,我们需要定义一个工厂bean,然后指定该工厂bean的`factory-bean`属性,以及工厂bean中用于创建目标bean的方法,即`factory-method`属性。下面是一个简单的例子: ```xml ...
在XML配置中,使用`factory-bean`和`factory-method`属性指定FactoryBean和创建对象的方法。 这些不同的创建对象方式在不同场景下各有优势。XML配置适合传统应用,注解配置简化了配置且易于理解和维护。Java配置...
factory-method 可以用来实例化 Bean,提供了更多的灵活性。 8. 使用 depends-on 来指定 Bean 的依赖关系 depends-on 可以用来指定 Bean 的依赖关系,确保在依赖的 Bean 实例化之前,已经实例化了该 Bean。 9. ...