Spring FactoryBean 是创建 复杂的bean,一般的bean 直接用xml配置即可,如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean
例子如下:
1:创建一个Car类(是为了简便)一般不能直接给出Car类,如果是这样直接注入就可以或者Car对象了,这里只是为了简便。
- <span style="font-size: 10px;">package com.myapp.core.factorybean;
- public class Car {
- private String make;
- private int year;
- public String getMake() {
- return make;
- }
- public void setMake(String make) {
- this.make = make;
- }
- public int getYear() {
- return year;
- }
- public void setYear(int year) {
- this.year = year;
- }
- }</span><span style="font-size: 24px;">
- </span>
package com.myapp.core.factorybean;
public class Car {
private String make;
private int year;
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
2:一个FactoryBean的实现拥有创建car
- package com.myapp.core.factorybean;
- import org.springframework.beans.factory.FactoryBean;
- public class MyCarFactoryBean implements FactoryBean<Car>{
- private String make;
- private int year;
- public void setMake(String make) {
- this.make = make;
- }
- public void setYear(int year) {
- this.year = year;
- }
- @Override
- public Car getObject() throws Exception {
- // TODO Auto-generated method stub
- //Here is a complex car object created
- // wouldn't be a very useful FactoryBean
- // if we could simply instantiate the object!
- Car car = new Car();
- if(year != 0){
- car.setYear(this.year);
- }
- if("make".equals(make)){
- car.setMake("we are making bla bla bla");
- }else{
- car.setMake(this.make);
- }
- return car;
- }
- @Override
- public Class<?> getObjectType() {
- // TODO Auto-generated method stub
- return Car.class;
- }
- @Override
- public boolean isSingleton() {
- // TODO Auto-generated method stub
- return false;
- }
- }
package com.myapp.core.factorybean; import org.springframework.beans.factory.FactoryBean; public class MyCarFactoryBean implements FactoryBean<Car>{ private String make; private int year; public void setMake(String make) { this.make = make; } public void setYear(int year) { this.year = year; } @Override public Car getObject() throws Exception { // TODO Auto-generated method stub //Here is a complex car object created // wouldn't be a very useful FactoryBean // if we could simply instantiate the object! Car car = new Car(); if(year != 0){ car.setYear(this.year); } if("make".equals(make)){ car.setMake("we are making bla bla bla"); }else{ car.setMake(this.make); } return car; } @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return Car.class; } @Override public boolean isSingleton() { // TODO Auto-generated method stub return false; } }
以上中创建car太简单了,如果太简单就没有必要用FactoryBean创建了,可以写的复杂些。
3:Person 引用一个car
- package com.myapp.core.factorybean;
- public class Person {
- private Car car;
- public Car getCar() {
- return car;
- }
- public void setCar(Car car) {
- this.car = car;
- }
- public String toString(){
- return car.getMake()+"::::"+car.getYear();
- }
- }
package com.myapp.core.factorybean; public class Person { private Car car; public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public String toString(){ return car.getMake()+"::::"+car.getYear(); } }
4:配置引用xml格式:
- <bean id="car" class="com.myapp.core.factorybean.MyCarFactoryBean">
- <property name="make" value="makeing car"/>
- <property name="year" value="123"/>
- </bean>
- <bean id="person" class="com.myapp.core.factorybean.Person">
- <property name="car" ref="car"/>
- </bean>
<bean id="car" class="com.myapp.core.factorybean.MyCarFactoryBean"> <property name="make" value="makeing car"/> <property name="year" value="123"/> </bean> <bean id="person" class="com.myapp.core.factorybean.Person"> <property name="car" ref="car"/> </bean>
5:编写测试类测试:
- package com.myapp.core.factorybean;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class MainTest {
- public static void main(String[] args) {
- ApplicationContext context = new ClassPathXmlApplicationContext("resource/others.xml");
- Person person = (Person)context.getBean("person");
- // Car car = (Car)context.getBean("car");
- // System.out.println(car);
- System.out.println(person);
- }
- }
package com.myapp.core.factorybean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("resource/others.xml"); Person person = (Person)context.getBean("person"); // Car car = (Car)context.getBean("car"); // System.out.println(car); System.out.println(person); } }
测试结果 makeing car::::123
利用FactoryBean创建car成功
只是为了说明思想。因为这个接口太重要了。在Spring中有很多类实现了改接口over
相关推荐
Spring Bean Factory, Bean definition 结构图;processOn
embedmongo-spring.zip,用于embeddemongospring的builder和spring factory bean用于“embedded”mongodb的工厂bean
通过实例工厂方法和静态工厂方法实例化spring bean的例子。
Spring教程 1 名词解释 2 Spring框架概述 3 Spring是什么? 3 Spring的历史 4 Spring的使命(Mission Statement) 4 Spring受到的批判 4 Spring包含的模块 5 总结 6 Spring的IoC容器 6 用户注册的例子 7 ...
Bean Factory ApplicationContext Web Context Spring 高级特性 Web 应用与 MVC Spring MVC Spring MVC指南 基于模板的Web表示层技术 Web 应用中模板技术与 JSP 技术的对比 输入验证与数据绑定 异常处理...
Spring教程 1 Spring框架概述 3 Spring是什么? 3 Spring的历史 4 Spring的使命(Mission Statement) 4 Spring受到的批判 4 Spring包含的模块 5 总结 6 Spring的IoC容器 6 用户注册的例子 7 面向接口编程 8 (用户...
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.interceptor.TransactionInterceptor#0': Error setting property values; nested ...
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userController' defined in ServletContext resource [/WEB-INF/springMVC-servlet.xml]: Error ...
spring 自定义 FactoryBean 样例工程,可以通过这个工程通过实现FactoryBean来扩展Spring容器
6 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 7 8 9 <value>/WEB-INF/jdbc.properties 10 11 12 </bean> 13 14 它配置了以下功能:...
String FACTORY_BEAN_PREFIX = "&"; //这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。 Object getBean(String name) throws BeansException; //这里根据bean的名字和Class类型来...
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Instantiation of bean failed; nested exception is org....
主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
·调用实例工厂方法创建bean 时,必须使用factory-bean 属性来确定工厂bean。 而静态工厂方法则使用class 元素确定静态工厂类。 其相同之处如下: ·都需使用factory-method属性指定产生bean 实例的工厂方法。 ...
> Spring bean factory 负责管理在 spring 容器中被创建的 bean 的生命周期。Bean 的生命 周期由两组回调(call back)方法组成。 > 初始化之后调用的回调方法。 > 销毁之前调用的回调方法。 > Spring 框架提供了...
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" p:dataSource-ref="dataSourceProxy"> <value>classpath:SqlMapConfig.xml</value> </property> </bean...
实例工厂 <bean bean-factory="" factory-method=""> 管理对象 对象关系DI 构造器注入 set注入 生命周期 scope:prototype/singleton init-method destroy-method API BeanFactory:使用这个工厂...
- Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1e7d503: defining beans [accountBizImpl,accountDaoImpl,baseMapperDaoImpl,org.springframework....
ConnectionFactoryUtils.ResourceFactory ConnectionHandle ConnectionHolder ConnectionHolder ConnectionProxy ConnectionSpecConnectionFactoryAdapter ConnectorServerFactoryBean ConsoleListener ...