Spring中的BeanFactory与FactoryBean

在学习Spring与Shiro时发现一个易混淆之处:

       Spring中提供一种简单的过滤器处理方案:它将具体的操作交给内部的Filter对象delegate去处理,而这个对象通过Spring IOC(BeanFactory)容器获取。

       而Shiro在与Spring结合使用时,在web.xml中配置代理过滤器 DelegatingFilterProxy,转发将请求交给从spring配置文件中的ShiroFilterFactoryBean类获取的过滤器对象处理。在利用上述处理方案的同时,与之不同的是,这里采用的是Spring的FactoryBean的方式获取这个对象。

       那么关键问题:Spring中的BeanFactoryFactoryBean有何区别,总结在此以作记录。

       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,那存在意义又是什么?


猜你喜欢

转载自blog.csdn.net/qq_39028580/article/details/79082610