在学习Spring与Shiro时发现一个易混淆之处:
Spring中提供一种简单的过滤器处理方案:它将具体的操作交给内部的Filter对象delegate去处理,而这个对象通过Spring IOC(BeanFactory)容器获取。
而Shiro在与Spring结合使用时,在web.xml中配置代理过滤器 DelegatingFilterProxy,转发将请求交给从spring配置文件中的ShiroFilterFactoryBean类获取的过滤器对象处理。在利用上述处理方案的同时,与之不同的是,这里采用的是Spring的FactoryBean的方式获取这个对象。
那么关键问题:Spring中的BeanFactory与FactoryBean有何区别,总结在此以作记录。
BeanFactory
静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)
实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)
而Spring IOC容器能够自动new对象,对象的创建交给spring管理,就是使用BeanFactory来实例化、配置和管理对象,它只是一个接口,里面有一个getBean()方法。一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,如:ClassPathXmlApplicationContext
ApplicationContext ctx = new ClassPathXmlApplicationContext("config.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
FactoryBean
本人理解:Spring中有两种类型的bean,一种是普通的bean,即BeanFactory方式创建;另外一种是由FactoryBean方式创建。有所不同的是,在从IOC容器中获取bean的时候,普通的bean返回该类型的一个对象,而FactoryBean方式返回的是该 FactoryBean对象的getObject方法所返回的对象。需要实现FactoryBean<T>接口:
import org.springframework.beans.factory.FactoryBean;
public class CarFactoryBean implements FactoryBean<Car> {
// 返回bean实例
@Override
public Car getObject() throws Exception {
return new Car("BMW", 500000);
}
// 返回bean的类型
@Override
public Class<?> getObjectType() {
return Car.class;
}
// 返回这个bean是否为单例bean
@Override
public boolean isSingleton() {
return true;
}
}
疑问:两者都是创建Bean,那存在意义又是什么?