前提在使用Spring集成中,我们可以使用Spring提供的FactoryBean接口来实现Spring容器通过工厂来实例化对象。
Spring规范的标准Bean工厂接口。实现了FactoryBean接口的实例只能作为工厂类存在:
1,
public T getObject() throws Exception {}
2,
public Class<?> getObjectType() {}
3,
public boolean isSingleton() {}
下面是代码配置:
首先我们要实例化的对象:
package com.sg.spring.study.day1.create;
public class Session {
public void save() {
System.out.println("save session ....");
}
}
需要产生实例的工厂:
package com.sg.spring.study.day1.create;
import org.springframework.beans.factory.FactoryBean;
public class SessionFactoryBean implements FactoryBean<Session> {
//创建实例
@Override
public Session getObject() throws Exception {
System.out.println("创建session的逻辑...");
return new Session();
}
@Override
public Class<?> getObjectType() {
return Session.class;
}
//判断实例化时 是否使用单例模式
@Override
public boolean isSingleton() {
return true;
}
}
spring配置文件如下:
<bean id="session" class="com.sg.spring.study.day1.create.SessionFactoryBean"/>
测试 :
@Test
public void test1() {
// Resource resource = new ClassPathResource("application.xml");
// BeanFactory factory = new XmlBeanFactory(resource);
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
Session session = ctx.getBean("session", Session.class);
System.out.println(session.getClass());
//打印如下:
//创建session的逻辑...
//class com.sg.spring.study.day1.create.Session
//session.save();
}
我们还可以直接获取工厂类型:
@Test
public void test1() {
// Resource resource = new ClassPathResource("application.xml");
// BeanFactory factory = new XmlBeanFactory(resource);
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
Object obj = ctx.getBean("&session");
System.out.println(obj.getClass());
//打印如下:
//class com.sg.spring.study.day1.create.SessionFactoryBean
//session.save();
}
注意:
1,我们在配置文件中配置的是factory,但得到的是工厂产生的bean的实例。
2,通过session得到的是bean的实例,通过&session得到的是工厂的实例。
在spring中,很多对象都是使用了FactoryBean的方式来得到bean的实例,比如:Session,Transcation,EntityManager等。
使用FactoryBean的好处:我们只需在配置文件中通过一条配置就可以得到工厂方法实例和其生产bean的实例,而不需要像实例bean工厂那样配置两个bean。另外,bean工厂创键的bena实例的生命周期范围就交给了spring去管理,而不需要我们的factory自己来实现,
缺点:和Spring API集成