`

Spring FactoryBean 使用

 
阅读更多

Spring FactoryBean 使用

Entity:

 

package cn.rayoo.spring.factorybean;

public class Car {

	private String brand;

	private int speed;

	private Double price;
	
	private long id = System.currentTimeMillis();
	

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getBrand() {
		return brand;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}

	public Car() {
	}

	public Car(String brand, int speed, Double price) {
		this.brand = brand;
		this.speed = speed;
		this.price = price;
	}

}

 FactoryBean:

 

 

package cn.rayoo.spring.factorybean;

import org.springframework.beans.factory.FactoryBean;

public class CarFactoryBean implements FactoryBean<Car> {

	public Car getObject() throws Exception { // 得到返回实体对象
		String[] infos = carInfo.split(",");

		Car car = new Car();

		car.setBrand(infos[0]);
		car.setSpeed(Integer.parseInt(infos[1]));
		car.setPrice(Double.parseDouble(infos[2]));

		return car;
	}

	public Class<Car> getObjectType() { // 得到返回实体类型
		return null;
	}

	public boolean isSingleton() { // 得到返回实体是否是单例模式
		return true;
	}

	private String carInfo;

	public String getCarInfo() {
		return carInfo;
	}

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

}

 ApplicationContext.xml:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"
	default-lazy-init="true">

	<!-- scope="singleton/prototype" -->
	<bean id="car1" class="cn.rayoo.spring.factorybean.CarFactoryBean"
		p:carInfo="红旗CB01,100,56.00" />

</beans>

 Junit Test:

 

package cn.rayoo.spring.test;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.rayoo.spring.factorybean.Car;
import cn.rayoo.spring.factorybean.CarFactoryBean;

public class FactoryBeanTest {

	@Test
	public void testCarFactoryBean() {
		try {
			final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
			final Random random = new Random();
			ExecutorService executorService = Executors.newFixedThreadPool(4);
			for (int i = 0; i < 100000; i++) {
				executorService.execute(new Runnable() {
					public void run() {
						try {
							Car car = (Car) ctx.getBean("car1");
							System.out.println(car.getId() + " " + " " + car.getBrand());
							// 以下方式可以获取CarFactoryBean,但不可以用于获取car1对象
							// CarFactoryBean factoryBean = (CarFactoryBean) ctx.getBean("&car1");
							// System.out.println(factoryBean.getObject().getId() + " " + " " + factoryBean.getObject().getBrand());
							Thread.sleep(46 * random.nextInt(5));
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				});
			}
			Thread.sleep(1000 * 4);
			ctx.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

其中: 配置文件的 scope="singleton/prototype" 配置 会覆盖掉 cn.rayoo.spring.factorybean.CarFactoryBean.isSingleton() 方法的返回值, 所以是否单例以配置文件为准, 配置文件如果没有声明, 则以FactoryBean.isSingleton()方法的返回值为准!

 

 

 

 

分享到:
评论

相关推荐

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

    通过FactoryBean在获取目标类的时间我们将增强的代理类给返回,使得我们调用方法的时间使用的代理类来增强,如果需要继续使用未代理的对象,则直接@Autowired 注入使用.

    详解Spring中的FactoryBean

    本篇文章主要介绍了Spring中的FactoryBean,如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean

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

    spring源码解析之FactoryBean相关测试代码demo,文章中也有相关代码

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

    主要介绍了spring中FactoryBean中的getObject()方法实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    spring中的FactoryBean代码示例

    主要介绍了spring中的FactoryBean代码示例,涉及FactoryBean的实现等相关内容,具有一定参考价值,需要的朋友可以了解下。

    Spring中的FactoryBean.rar

    Spring中的FactoryBean.rar

    SpringFactoryBean:spring FactoryBean的样本,在运行时在两个bean之间进行更改

    spring FactoryBean的小样本,如何在运行时在两个bean之间进行切换。

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

    主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    FactoryBean代码最简实现

    这篇代码主要适用于我的博客,用来帮助理解Spring配置文件+FactoryBean的实例化过程。注意,这里是FactoryBean,而不是BeanFactory,下载资源要看清楚哈。

    spring4示例代码

    spring-2 演示了外部配置文件的引入(connection),spel(spring el)表达式 ,静态工厂方式及实例工厂方式及factorybean方式创建bean, spring的生命周期及BeanPostProcessor的使用,注解方式创建bean 及使用...

    spring的详细介绍

    Spring介绍 1. Spring 2. 使用spring的主要目的 3. Spring的模块 Ejb容器(以前是) Ioc容器(现在的控制权) 控制反转Ioc(Invertion of control)依赖注入(Dependency Injection) ...13. 接口FactoryBean的使用

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

    主要给大家介绍了关于Spring中BeanFactory与FactoryBean接口的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    深入了解Spring中的FactoryBean

    主要介绍了深入了解Spring中的FactoryBean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    spring如何通过FactoryBean配置Bean

    主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Spring BeanFactory和FactoryBean区别解析

    主要介绍了Spring BeanFactory和FactoryBean区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

    Spring和MyBatis的整合是Java...Spring使用FactoryBean来创建特定类型的bean,例如MyBatis的Mapper接口的动态代理实例。BeanDefinitionRegistry则用于注册这些动态生成的bean,确保它们可以被Spring容器识别和管理。

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的...

    Spring基于ProxyFactoryBean创建AOP代理

    主要介绍了Spring基于ProxyFactoryBean创建AOP代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

    Bean、通过 FactoryBean 配置 Bean、通过注解配置 Bean、泛型依赖注入、AOP 基础、前置通知、后置通知、返回通知、异常通知、环绕通知、切面的优先级、切点表达式、使用 XML 文件的方式配置 AOP、使用 JdbcTemplate ...

    Spring 2.0 开发参考手册

    3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕...

Global site tag (gtag.js) - Google Analytics