使用Spring的FactoryBean创建和获取Bean对象方式
作者:catoop
Spring的FactoryBean创建和获取Bean对象
在Spring框架中,FactoryBean接口提供了一种强大的机制来创建复杂的bean实例。
本文将基于提供的代码示例,详细介绍如何通过FactoryBean创建bean对象,并展示如何获取这些bean实例以及它们所属的FactoryBean实例。
示例代码类
- 定义 MyBean 接口。
首先,我们定义一个简单的接口MyBean,它包含一个show方法:
public interface MyBean { /** * 显示信息 */ void show(); }
- 实现 MyFactoryBean 类。
我们实现FactoryBean接口来创建MyBean类型的实例。
在这个例子中,MyFactoryBean负责创建并返回实现了MyBean接口的对象:
@Component public class MyFactoryBean implements FactoryBean<MyBean> { // 这个 myBean 成员变量,在本文中可以忽略,我自己用作其他用途使用的 private MyBean myBean; @Override public MyBean getObject() throws Exception { System.err.println("getObject"); if(myBean == null) { myBean = new MyBean() { @Override public void show() { System.err.println("MyFactoryBean.show"); } }; } return myBean; } @Override public Class<?> getObjectType() { return MyBean.class; } }
这里,MyFactoryBean使用了匿名内部类的方式实现了MyBean接口,并重写了show方法。其中定义了一个 myBean 成员变量,这个可以忽略,我自己用作其他用途使用的。
从Spring容器中获取实例对象
为了从Spring容器中获取MyFactoryBean生成的bean实例或MyFactoryBean本身,我们需要先获取 ApplicationContext
实例本身,下面代码中的 SpringContextHolder.getApplicationContext()
是我自己定义好的工具类,假设通过它获取到 ApplicationContext
对象。
以下是获取工厂类自身实例 和 工厂类产生的具体 Bean实例的具体方法:
1、获取由FactoryBean创建的具体bean实例:
// 通过工厂类的名称获取 MyBean myBean = (MyBean) SpringContextHolder.getApplicationContext().getBean("myFactoryBean"); // 通过Bean类型获取(如果你有多个工厂,都生产MyBean,请不要使用MyBean.class获取,它会同时执行你的多个工厂类) MyBean myBean = SpringContextHolder.getApplicationContext().getBean(MyBean.class);
2、获取产生Bean实例的具体工厂类FactoryBean自身的实例:
如果你想直接操作FactoryBean(例如,进行一些配置调整),你可以通过在bean名称前加上&
作为前缀来获取FactoryBean的实例,这是 Spring 内置的命名规则:
// 通过工厂类的名称和&符号获取 MyFactoryBean factoryBean = (MyFactoryBean) SpringContextHolder.getApplicationContext().getBean("&myFactoryBean"); // 通过工厂类class MyFactoryBean factoryBean = SpringContextHolder.getApplicationContext().getBean(MyFactoryBean.class);
单例和多实例
通过重写方法 isSingleton()
控制返回值来决定该工厂类每次都返回一个实例,还是每次都返回单例的bean(默认值是 true,单实例模式)。
注意:工厂类自身还是单例的,我们一般我们不会为工厂类设置 prototype
,只是在需要的时候重写 isSingleton()
方法返回 false
来实现多例。
总结
通过上述步骤,我们不仅能够轻松地从Spring容器中获取由FactoryBean创建的bean实例,还能获取到这个FactoryBean的实例本身。这种灵活性使得FactoryBean成为了处理复杂bean创建逻辑的强大工具。无论你是需要定制化bean的创建过程,还是希望对bean的生命周期有更精细的控制,FactoryBean都能满足你的需求。
通过这种方式,开发者可以更加灵活地管理和操作Spring中的bean实例,提高代码的可维护性和扩展性。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。