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()方法的返回值为准!
相关推荐
通过FactoryBean在获取目标类的时间我们将增强的代理类给返回,使得我们调用方法的时间使用的代理类来增强,如果需要继续使用未代理的对象,则直接@Autowired 注入使用.
本篇文章主要介绍了Spring中的FactoryBean,如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean
spring源码解析之FactoryBean相关测试代码demo,文章中也有相关代码
主要介绍了spring中FactoryBean中的getObject()方法实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
主要介绍了spring中的FactoryBean代码示例,涉及FactoryBean的实现等相关内容,具有一定参考价值,需要的朋友可以了解下。
Spring中的FactoryBean.rar
spring FactoryBean的小样本,如何在运行时在两个bean之间进行切换。
主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
这篇代码主要适用于我的博客,用来帮助理解Spring配置文件+FactoryBean的实例化过程。注意,这里是FactoryBean,而不是BeanFactory,下载资源要看清楚哈。
spring-2 演示了外部配置文件的引入(connection),spel(spring el)表达式 ,静态工厂方式及实例工厂方式及factorybean方式创建bean, spring的生命周期及BeanPostProcessor的使用,注解方式创建bean 及使用...
Spring介绍 1. Spring 2. 使用spring的主要目的 3. Spring的模块 Ejb容器(以前是) Ioc容器(现在的控制权) 控制反转Ioc(Invertion of control)依赖注入(Dependency Injection) ...13. 接口FactoryBean的使用
主要给大家介绍了关于Spring中BeanFactory与FactoryBean接口的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了深入了解Spring中的FactoryBean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Spring BeanFactory和FactoryBean区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Spring和MyBatis的整合是Java...Spring使用FactoryBean来创建特定类型的bean,例如MyBatis的Mapper接口的动态代理实例。BeanDefinitionRegistry则用于注册这些动态生成的bean,确保它们可以被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代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Bean、通过 FactoryBean 配置 Bean、通过注解配置 Bean、泛型依赖注入、AOP 基础、前置通知、后置通知、返回通知、异常通知、环绕通知、切面的优先级、切点表达式、使用 XML 文件的方式配置 AOP、使用 JdbcTemplate ...
3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕...