转自:http://www.cnblogs.com/dreamfree/p/4088431.html?utm_source=tuicool&utm_medium=referral
通过工厂方法配置bean
通过调用静态工厂方法创建bean
通过静态工厂方法创建bean是将对象创建的过程封装到静态方法中。当客户端需要对象时,只需要简单地调用静态方法,而不关心创建对象的细节。
要声明通过静态方法创建的bean,需要在bean的class属性里指定拥有该工厂的方法的类,通知在factory-method属性里指定工厂方法的名称,
最后,使用<constructor-arg>元素为该方法传递方法参数
通过调用实例工厂方法创建bean
实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需关心对象的创建细节。
要声明通过实例工厂方法创建的bean:
-在bean的factory-bean属性里指定拥有该工厂方法的bean
-在factory-method属性里指定该工厂方法的名称
-使用constructor-arg元素为工厂方法传递方法参数
静态工厂类:
package com.yl.factory;
import java.util.HashMap;
import java.util.Map;
/**
* 静态工厂方法:直接调用某一个类的静态方法就可与返回bean的实例
* @author yul
*
*/
public class StaticCarFactory {
private static Map<String, Car> cars = new HashMap<String, Car>();
static {
cars.put("audi", new Car("audi", 300000));
cars.put("ford", new Car("ford", 300000));
}
/**
* 静态工厂方法
* @param name
* @return
*/
public static Car getCar(String name) {
return cars.get(name);
}
}
实例工厂类:
package com.yl.factory;
import java.util.HashMap;
import java.util.Map;
/***
* 实例工厂方法:实例工厂的方法,即现需要创建工厂本身,在调用工厂的实例方法来返回bean的实例
* @author yul
*
*/
public class InstanceCarFactory {
private Map<String, Car> cars = new HashMap<String, Car>();
public InstanceCarFactory() {
cars = new HashMap<String, Car>();
cars.put("audi", new Car("audi", 300000));
cars.put("ford", new Car("ford", 400000));
}
public Car getCar(String brand) {
return cars.get(brand);
}
}
工厂方法的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是配置bean实例 -->
<!--
class属性:指向静态工厂方法的全类名
factory-method:指向静态工厂方法的名字
constructor-arg:如果静态工厂方法需要传入参数,则使用constructor-arg来配置参数
-->
<bean id="car1"
class="com.yl.factory.StaticCarFactory"
factory-method="getCar">
<constructor-arg value="audi"></constructor-arg>
</bean>
<!-- 配置工厂的实例 -->
<bean id="carFactory" class="com.yl.factory.InstanceCarFactory"></bean>
<!--
factory-bean:指向实例工厂方法的bean
factory-method:指向实例工厂方法的名字
constructor-arg:如果实例工厂方法需要传入参数,则使用constructor-arg来配置参数
-->
<!-- 通过实例工厂方法来配置bean -->
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean>
</beans>
通过Factorybean配置bean
继承Factorybean的实现类:
package com.yl.factorybean;
import org.springframework.beans.factory.FactoryBean;
//自定义的Factorybean需要实现FactoryBean接口
public class CarFactoryBean implements FactoryBean<Car> {
private String brand;
public void setBrand(String brand) {
this.brand = brand;
}
/**
* 返回bean的对象
*/
@Override
public Car getObject() throws Exception {
// TODO Auto-generated method stub
return new Car("BMW", 600000);
}
/**
* 返回bean的类型
*/
@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Car.class;
}
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
通过Factorybean来配置bean的实例
class:指向Factorybean的全类名
property:配置Factorybean的属性
但实际返回的实例却是Factorybean的getObject()方法返回的实例
-->
<bean id="car" class="com.yl.factorybean.CarFactoryBean">
<property name="brand" value="BMW"></property>
</bean>
</beans>
在我们的项目中,将spring 的实例工厂bean结合cglib的动态代理功能,实现了更好的应用。我这里mark一下
相关推荐
当我们声明一个bean为`FactoryBean`类型时,Spring容器在实例化bean时会调用`FactoryBean`的相关方法来获取实际的对象,而不是直接使用默认的构造函数创建。这给我们提供了一个灵活的方式来控制对象的创建过程,包括...
在Spring4版本中,这两种工厂方法配置依然有效,并且Spring4引入了更多改进,如支持Java配置、@Configuration注解以及@Bean注解等,使得Bean的创建更加简洁和面向对象。Java配置允许我们以编程方式定义Bean,如下所...
Spring 通过 FactoryBean 配置 Bean 在 Spring 框架中,FactoryBean 是一种特殊的 Bean,它可以实现复杂的 Bean 实例化逻辑。通过 FactoryBean,我们可以将复杂的实例化逻辑封装起来,使得 Bean 的配置更加灵活和...
Bean可以通过简单的构造函数、工厂方法或工厂Bean来创建。 工厂Bean是实现了`org.springframework.beans.factory.FactoryBean`接口的类。这个接口定义了两个核心方法:`getObject()`用于返回实际的业务对象,`...
综上所述,Spring Bean的实例化顺序是一个复杂的过程,涉及到配置、依赖关系、注解和接口等多个层面。理解这些机制有助于优化和调试应用程序,确保Bean的正确初始化和协同工作。在实际开发中,应谨慎处理Bean的实例...
当你在Spring配置文件中声明一个Bean,并指定它的类型为`FactoryBean`的实现类时,Spring不会直接调用无参构造函数来创建Bean,而是调用`FactoryBean`的方法来获取Bean实例。 首先,我们需要了解`FactoryBean`的...
3. **初始化**:在实例化和属性注入后,Spring调用Bean的初始化回调方法。这些方法可以通过以下方式定义: - `@PostConstruct`注解的方法:当容器调用该注解的方法时,表明Bean的初始化完成。 - `InitializingBean...
在 Eclipse 中安装 SpringIDE 插件、IOC & DI、在 Spring 中配置 Bean、自动装配、Bean 之间的关系(依赖、继承)、Bean 的作用域、使用外部属性文件、SpEL、管理 Bean 的生命周期、通过工厂方法配置 Bean、通过 ...
Spring IOC 04 配置通过静态工厂方法创建的bean、实例工厂创建的bean、FactoryBean (1)bean的创建默认就是框架利用反射new出来的bean实例; (2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这...
本篇将通过一个测试代码示例来深入解析`FactoryBean`的工作原理及其在Spring配置中的应用。 首先,我们需要了解`FactoryBean`的基本概念。`FactoryBean`是Spring提供的一种扩展点,它是一个工厂,可以用来创建对象...
4. **容器回调**:在Bean初始化之后,Spring容器可能会调用自己的回调方法,如`BeanPostProcessor`接口实现的`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,允许自定义逻辑进一步...
当Spring容器遇到一个实现了`FactoryBean`接口的bean时,它不会直接调用`getBean()`方法来获取对象,而是调用`FactoryBean`的`getObject()`方法。这样,我们可以在`getObject()`方法中实现复杂的逻辑,如初始化、...
同时,也可以使用`@Bean`注解配合`@Configuration`类,通过工厂方法来达到类似的效果,这是Spring 3.0以后引入的新特性,提供了更简洁的编码方式。 在实际应用中,FactoryBean的使用需要注意以下几点: - 调用`...
简单了解Spring中BeanFactory与FactoryBean的...BeanFactory和FactoryBean都是Spring框架中的重要组件,它们提供了不同的功能和机制来管理和生成Bean。理解它们之间的区别对我们使用Spring框架开发应用程序非常重要。
在 Spring 中,当配置文件中 <bean> 的 class 属性配置的实现类是 FactoryBean 时,通过 getBean 方法返回的不是 FactoryBean 本身,而是 FactoryBean#getObject() 方法所返回的对象。这相当于 FactoryBean#...
Spring配置的核心在于如何创建、管理和装配bean。通过XML配置文件或Java配置类,我们可以定义bean的生命周期行为,如初始化方法、销毁方法等。此外,我们还可以利用@Autowired注解自动装配bean的依赖,使得代码更加...
`FactoryBean`提供了创建Bean实例的逻辑,Spring容器会调用`FactoryBean`的方法来获取实际的Bean实例。 7. **Prototype和Singleton作用域**: Spring中的Bean默认为Singleton,即每个Bean只有一个实例。也可以通过`...
当我们遇到一些特殊的对象,如由工厂方法创建,而非简单地通过`new`关键字实例化时,Spring提供了工厂bean(FactoryBean)来处理这种情况。工厂bean允许我们自定义对象的创建过程,同时让Spring容器负责属性注入。 ...
在`@Bean`和`Spring的factoryBean`注入的情况下,`factoryBean`允许我们通过自定义工厂方法创建bean。`@Bean`相当于一个简化版的工厂bean,因为它直接在配置类中定义了bean的创建逻辑。而传统的`factoryBean`则是...
总结来说,Spring的`FactoryBean`提供了一种强大的机制,允许我们在运行时动态地创建和配置Bean,尤其适用于处理复杂逻辑和多步骤的实例化过程。通过自定义`FactoryBean`,我们可以完全控制Bean的生命周期,使得...