天天看点

Spring之FactoryBean与BeanFactory

BeanFactory与FactoryBean

Spring定义了两个与Bean生产相关的接口,他们分别是BeanFactory和FactoryBean。

这两个接口的实现都可以生产bean对象,那么他们有什么不一样呢?

BeanFactory:以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂。

FactoryBean:  以Bean结尾,表示它只是一个普通的bean,具备自己生产自己的能力。

Spring在初始化对象时通过这两个接口的实现类来完成,其中Spring底层通过BeanFactory来实现。

如果我们需要通过自己的方式向Spring容器中注入对象,那么我们可以选择有以下几种选择:

方式一:实现一个简单的bean,然后通过配置文件或者注解注入Spring容器;

方式二:实现一个bean,并且实现FactoryBean接口,然后通过配置文件注入;

其中,方式一实际采用的就是BeanFactory方式初始化并添加到Spring容器中的,而方式二则采用的是FactoryBean的方式初始化并添加到Bean容器中。

很显然,通过方式二实现getObject方法时,我们可以添加一些必要的业务逻辑,并且根据需要进行灵活的变通,因此,我们在面临这种需要添加业务逻辑或者需要灵活变通的情况时就可以选择使用FactoryBean来向Spring容器中添加对象。

       FactoryBean示例

接下来,我们借用Shiro过滤器注入Spring容器的例子来介绍FactoryBean的使用过程。

       Shiro的认证与授权均需要通过过滤器来完成,因此Shiro如果需要让Spring来管理Shiro的过滤器,那么就需要将过滤器注入Spring容器中。因此Shiro定义了一个ShiroFilterFactoryBean类,并且实现了接口FactoryBean,此时ShiroFilterFactoryBean就可以通过实现getObject方法来向Spring容器中注入对象。

步骤一:实现一个bean,并且实现接口FactoryBean

Spring之FactoryBean与BeanFactory

步骤二:实现FactoryBean的方法getObejct

Spring之FactoryBean与BeanFactory
Spring之FactoryBean与BeanFactory

第三步:在Spring配置文件中添加bean

Spring之FactoryBean与BeanFactory

备注:配置文件中定义的shiroFilter并非ShiroFilterFactoryBean示例,而是其getObject方法返回的实例,也就是SpringShiroFilter类的实例对象。