`
huttoncs
  • 浏览: 200864 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring配置bean的方法(工厂方法和Factorybean)

 
阅读更多

转自: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一下

 

 

 

分享到:
评论

相关推荐

    spring的FactoryBean增强我们的目标对象.rar

    当我们声明一个bean为`FactoryBean`类型时,Spring容器在实例化bean时会调用`FactoryBean`的相关方法来获取实际的对象,而不是直接使用默认的构造函数创建。这给我们提供了一个灵活的方式来控制对象的创建过程,包括...

    SSH笔记-静态/实例工厂方法配置bean

    在Spring4版本中,这两种工厂方法配置依然有效,并且Spring4引入了更多改进,如支持Java配置、@Configuration注解以及@Bean注解等,使得Bean的创建更加简洁和面向对象。Java配置允许我们以编程方式定义Bean,如下所...

    spring如何通过FactoryBean配置Bean

    Spring 通过 FactoryBean 配置 Bean 在 Spring 框架中,FactoryBean 是一种特殊的 Bean,它可以实现复杂的 Bean 实例化逻辑。通过 FactoryBean,我们可以将复杂的实例化逻辑封装起来,使得 Bean 的配置更加灵活和...

    spring学习----工厂Bean

    Bean可以通过简单的构造函数、工厂方法或工厂Bean来创建。 工厂Bean是实现了`org.springframework.beans.factory.FactoryBean`接口的类。这个接口定义了两个核心方法:`getObject()`用于返回实际的业务对象,`...

    Spring实例化Bean顺序

    综上所述,Spring Bean的实例化顺序是一个复杂的过程,涉及到配置、依赖关系、注解和接口等多个层面。理解这些机制有助于优化和调试应用程序,确保Bean的正确初始化和协同工作。在实际开发中,应谨慎处理Bean的实例...

    SSH笔记-通过实现FactoryBean接口来创建 Bean

    当你在Spring配置文件中声明一个Bean,并指定它的类型为`FactoryBean`的实现类时,Spring不会直接调用无参构造函数来创建Bean,而是调用`FactoryBean`的方法来获取Bean实例。 首先,我们需要了解`FactoryBean`的...

    Spring框架中Bean的生命周期 Spring中Bean有几种作用域

    3. **初始化**:在实例化和属性注入后,Spring调用Bean的初始化回调方法。这些方法可以通过以下方式定义: - `@PostConstruct`注解的方法:当容器调用该注解的方法时,表明Bean的初始化完成。 - `InitializingBean...

    尚硅谷佟刚Spring4代码及PPT.rar

    在 Eclipse 中安装 SpringIDE 插件、IOC & DI、在 Spring 中配置 Bean、自动装配、Bean 之间的关系(依赖、继承)、Bean 的作用域、使用外部属性文件、SpEL、管理 Bean 的生命周期、通过工厂方法配置 Bean、通过 ...

    09-IoC配置-静态工厂与实例工厂创建bean

    Spring IOC 04 配置通过静态工厂方法创建的bean、实例工厂创建的bean、FactoryBean (1)bean的创建默认就是框架利用反射new出来的bean实例; (2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这...

    spring源码解析之FactoryBean相关测试代码demo

    本篇将通过一个测试代码示例来深入解析`FactoryBean`的工作原理及其在Spring配置中的应用。 首先,我们需要了解`FactoryBean`的基本概念。`FactoryBean`是Spring提供的一种扩展点,它是一个工厂,可以用来创建对象...

    spring bean的生命周期测试代码

    4. **容器回调**:在Bean初始化之后,Spring容器可能会调用自己的回调方法,如`BeanPostProcessor`接口实现的`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,允许自定义逻辑进一步...

    FactoryBean代码最简实现

    当Spring容器遇到一个实现了`FactoryBean`接口的bean时,它不会直接调用`getBean()`方法来获取对象,而是调用`FactoryBean`的`getObject()`方法。这样,我们可以在`getObject()`方法中实现复杂的逻辑,如初始化、...

    Spring中的FactoryBean.rar

    同时,也可以使用`@Bean`注解配合`@Configuration`类,通过工厂方法来达到类似的效果,这是Spring 3.0以后引入的新特性,提供了更简洁的编码方式。 在实际应用中,FactoryBean的使用需要注意以下几点: - 调用`...

    简单了解Spring中BeanFactory与FactoryBean的区别

    简单了解Spring中BeanFactory与FactoryBean的...BeanFactory和FactoryBean都是Spring框架中的重要组件,它们提供了不同的功能和机制来管理和生成Bean。理解它们之间的区别对我们使用Spring框架开发应用程序非常重要。

    spring中FactoryBean中的getObject()方法实例解析

    在 Spring 中,当配置文件中 &lt;bean&gt; 的 class 属性配置的实现类是 FactoryBean 时,通过 getBean 方法返回的不是 FactoryBean 本身,而是 FactoryBean#getObject() 方法所返回的对象。这相当于 FactoryBean#...

    详细的Spring配置和Spring Boot-外文翻译

    Spring配置的核心在于如何创建、管理和装配bean。通过XML配置文件或Java配置类,我们可以定义bean的生命周期行为,如初始化方法、销毁方法等。此外,我们还可以利用@Autowired注解自动装配bean的依赖,使得代码更加...

    day38 07-Spring框架Bean的时候方式

    `FactoryBean`提供了创建Bean实例的逻辑,Spring容器会调用`FactoryBean`的方法来获取实际的Bean实例。 7. **Prototype和Singleton作用域**: Spring中的Bean默认为Singleton,即每个Bean只有一个实例。也可以通过`...

    spring工厂属性注入

    当我们遇到一些特殊的对象,如由工厂方法创建,而非简单地通过`new`关键字实例化时,Spring提供了工厂bean(FactoryBean)来处理这种情况。工厂bean允许我们自定义对象的创建过程,同时让Spring容器负责属性注入。 ...

    通过@Autowired注解注入bean的顺序,以及@bean注入.rar

    在`@Bean`和`Spring的factoryBean`注入的情况下,`factoryBean`允许我们通过自定义工厂方法创建bean。`@Bean`相当于一个简化版的工厂bean,因为它直接在配置类中定义了bean的创建逻辑。而传统的`factoryBean`则是...

    详解Spring中的FactoryBean

    总结来说,Spring的`FactoryBean`提供了一种强大的机制,允许我们在运行时动态地创建和配置Bean,尤其适用于处理复杂逻辑和多步骤的实例化过程。通过自定义`FactoryBean`,我们可以完全控制Bean的生命周期,使得...

Global site tag (gtag.js) - Google Analytics