`
默翁1
  • 浏览: 27076 次
社区版块
存档分类
最新评论

FactoryBean 接口

阅读更多

Spring 中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean,这两种Bean都被容器管理,但工厂Bean跟普通 Bean不同,其返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象。

接口FactoryBean是由Spring提供的工厂Bean的标准接口,提供了如下3个方法

(1)Object getObject();

(2)Class getObject();

(3)boolean isSingleton()

实例:

public class Car {
	private String maxSpeed;
	private String brand;
	private String price;
	public String getMaxSpeed() {
		return maxSpeed;
	}
	public void setMaxSpeed(String info) {
		this.maxSpeed = info;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	
}

 

public class CarFactoryBean implements FactoryBean<Car>{
	private String carInfo;
	@Override
	public Car getObject() throws Exception {
		Car car=new Car();
		String[] info=carInfo.split(",");
		car.setMaxSpeed(info[0]);
		car.setBrand(info[1]);
		car.setPrice(info[2]);
		return car;
	}

	@Override
	public Class<Car> getObjectType() {
		
		return Car.class;
	}

	@Override
	public boolean isSingleton() {
		
		return false;
	}

	public String getCarInfo() {
		return carInfo;
	}

	public void setCarInfo(String carInfo) {
		this.carInfo = carInfo;
	}
	
}

 

<bean id="car" class="application.CarFactoryBean">
		<property name="carInfo">
			<value>100米每个小时,奔驰,1000元</value>
		</property>
	</bean>

 

public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("config/applicationContext.xml");
		Car car=(Car)context.getBean("car");
		System.out.println("品牌:"+car.getBrand());
		System.out.println("最大速度:"+car.getMaxSpeed());
		System.out.println("价格:"+car.getPrice());
	}

结果:品牌:奔驰
最大速度:100米每个小时
价格:1000元

 该实例中容器通过getBean返回来的不是CarFactoryBean本身,而是该类getObject方法中创建的实例Car,要想获得CarFactoryBean,可以通过getBean("&car")来获取

public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("config/applicationContext.xml");
		CarFactoryBean car=(CarFactoryBean)context.getBean("&car");
		System.out.println("汽车基本信息:"+car.getCarInfo());
		
	}

结果:汽车基本信息:100米每个小时,奔驰,1000元

 factorybean的另外一种实现方式:实例工厂

public class CarFactoryBean{
	
	
	public  Car getCar(String carInfo){
		Car car=new Car();
		String[] info=carInfo.split(",");
		car.setMaxSpeed(info[0]);
		car.setBrand(info[1]);
		car.setPrice(info[2]);
		return car;
	
	}
}

 

<bean id="carFactory" class="application.CarFactoryBean">
		
	</bean>
	<bean id="car" factory-bean="carFactory" factory-method="getCar">
		<constructor-arg><value>2930,239,3090</value></constructor-arg>
	</bean>

 其中factory-bean是指实例工厂,factory-method是指实例工厂的方法,constructor-arg是为实例工厂的方法传入参数

public static void main(String[] args) {
		ApplicationContext context=new ClassPathXmlApplicationContext("config/applicationContext.xml");
		Car car=(Car)context.getBean("car");
		System.out.println("价格:"+car.getPrice());
		System.out.println("品牌:"+car.getBrand());
		System.out.println("速度:"+car.getMaxSpeed());
	}

结果:价格:3090
品牌:239
速度:2930

 

分享到:
评论

相关推荐

    Spring中BeanFactory与FactoryBean接口的区别详解

    **FactoryBean接口**则是一种特殊的Bean,它不是用来直接创建对象的,而是用来创建Bean的Bean。当你需要在Spring容器中创建更复杂、有特定初始化逻辑的对象时,可以使用FactoryBean。FactoryBean的实例本身就是一个...

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

    在Spring框架中,`FactoryBean`接口是一个非常重要的组件,它允许我们自定义Bean的创建逻辑,这在处理复杂对象的实例化或者需要特定初始化步骤时尤其有用。本笔记将详细探讨如何通过实现`FactoryBean`接口来创建Bean...

    Spring中的FactoryBean.rar

    首先,FactoryBean接口是Spring框架的核心组件之一,位于`org.springframework.beans.factory`包下。该接口定义了两个主要方法: 1. `Object getObject() throws Exception;`:返回由FactoryBean创建的对象。Spring...

    68-BeanFactory与FactoryBean1

    在 Spring 中,FactoryBean 是一个特殊的 Bean,它实现了 FactoryBean 接口,该接口提供了 getObject() 方法来返回实例化后的对象。当我们在配置文件中配置了 FactoryBean 时,getBean() 方法返回的对象实际上是 ...

    Spring源码学习八:常用的扩展接口详解1

    5. **FactoryBean接口**: `FactoryBean`接口允许开发者自定义Bean的实例化过程。通过实现`getObject()`方法,我们可以控制Spring容器加载我们期望的Bean。这个接口特别适用于那些需要特殊初始化逻辑或非标准实例化...

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

    FactoryBean 接口定义了三个重要的方法:getObject()、isSingleton() 和 getObjectType()。其中,getObject() 方法是 FactoryBean 的核心方法,它返回由 FactoryBean 创建的 Bean 实例。如果 isSingleton() 方法返回...

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

    FactoryBean接口提供了一种机制,使你可以轻松地将自定义工厂与Spring的BeanFactory接口集成。 4. **使用JavaBeans PropertyEditors**:PropertyEditor接口是java.beans包中提供的标准接口。PropertyEditors用于...

    spring学习----工厂Bean

    通过阅读Spring框架的源代码,我们可以看到FactoryBean接口的实现如何影响IoC容器的行为,以及`getObject()`和`isSingleton()`方法如何被容器调用来生成和管理Bean实例。 至于"工具"标签,FactoryBean也是Spring...

    FactoryBean代码最简实现

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

    spring资料5

    通过实现FactoryBean接口,你可以控制实例化对象的具体过程,包括任何复杂的依赖注入或者初始化步骤。例如,如果你有一个数据库连接池,可能需要在创建连接时进行配置,这时可以使用FactoryBean来创建和配置这些连接...

    spring如何通过FactoryBean配置Bean

    在上面的代码中,我们实现了 FactoryBean 接口的三个方法:getObject()、getObjectType() 和 isSingleton()。其中,getObject() 方法负责返回一个 Car 实例,getObjectType() 方法返回 Car 类型,而 isSingleton() ...

    spring中的FactoryBean代码示例

    在上面的示例中,我们实现了FactoryBean接口,并提供了getObject()方法来生成User对象。这样,我们可以通过getBean(id)方法获取User对象的实例,而不是UserFactory的实例。 FactoryBean的实现可以带来很多便捷,...

    精通Spring整合MyBatis:架构师的实践指南

    2. **FactoryBean**:Spring中的FactoryBean接口用于创建特定类型的bean。在Spring整合MyBatis时,FactoryBean扮演了重要角色,它负责生成MyBatis Mapper接口的动态代理实例。 3. **BeanDefinitionRegistry**:...

    Spring BeanFactory和FactoryBean区别解析

    FactoryBean接口对应Spring框架来说占有重要的地位,Spring本身就提供了70多个FactoryBean的实现。他们隐藏了实例化一些复杂的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型。 下面是一个...

    spring学习资料

    在Spring中,如果一个Bean实现了FactoryBean接口,那么默认情况下,当我们通过该Bean的名称获取Bean时,实际上获取的是由FactoryBean创建的对象,而不是FactoryBean自身。为了获取FactoryBean本身,可以在Bean名称前...

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

    在Spring框架中,`FactoryBean`是一个非常关键的接口,它允许我们自定义对象的创建方式,这在处理复杂依赖关系或需要特殊初始化逻辑时尤为有用。本篇将通过一个测试代码示例来深入解析`FactoryBean`的工作原理及其在...

    mybatis,mybatis-spring

    - MapperFactoryBean:实现了Spring的FactoryBean接口,为每个Mapper接口创建一个代理对象,调用Mapper接口的方法时,会自动执行对应的SQL。 4. **MyBatis-Spring的使用** - 配置:在Spring配置文件中添加...

    自定义xml标签

    // 其他FactoryBean接口实现 } ``` 在`ExampleBeanDefinitionParser`中,我们创建`ExampleDataSource`后,可以将它设置给`ExampleFactoryBean`,然后注册这个FactoryBean: ```java // 在parse方法中 ...

    spring中的BeanFactory与FactoryBean的讲解

    在上面的例子中,ProductFactory实现了FactoryBean接口,在配置文件中创建得到的对象,并不是ProductFactory对象,而是ProductFactory中getObject方法得到的对象。 小结: 1. Spring通过工厂bean支持我们参与到...

    java-aop&jdbcTempalte

    - Spring提供了一个FactoryBean接口,可以手动创建代理对象,并通过配置确定哪些方法应用哪种类型的增强。 4. **Spring传统AOP开发**: - 通过XML配置文件定义切面、通知和切入点表达式,Spring会自动创建代理类...

Global site tag (gtag.js) - Google Analytics