Spring FactoryBean 是怎样工作的? 它与平凡 Bean 有什么区别? 它实用于哪些场景?

[复制链接]
发表于 2025-10-2 12:23:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
FactoryBean 是 Spring 框架中一个非常紧张的接口,它为 Spring IoC 容器提供了更机动的对象创建方式。
1. FactoryBean 的界说:
FactoryBean 是一个接口,它界说了三个方法:
  1. public interface FactoryBean<T> {
  2.     @Nullable
  3.     T getObject() throws Exception;
  4.     @Nullable
  5.     Class<?> getObjectType();
  6.     default boolean isSingleton() {
  7.         return true;
  8.     }
  9. }
复制代码

  • getObject(): 这是最紧张的方法。它负责创建并返回一个对象实例。这个对象实例可以是任何范例的对象,不肯定是 FactoryBean 本身的范例。
  • getObjectType(): 返回 getObject() 方法创建的对象的范例。假如无法在创建对象之前确定范例,可以返回 null。
  • isSingleton(): 指定 getObject() 方法返回的对象是否是单例。默以为 true,体现返回单例对象。
2. FactoryBean 与平凡 Bean 的区别:

  • 平凡 Bean: 当 Spring IoC 容器获取一个平凡 Bean 时,它直接返回 Bean 本身的实例。
  • FactoryBean: 当 Spring IoC 容器获取一个 FactoryBean 时,它有两种选择:

    • 获取 FactoryBean 本身的实例: 在 Bean 的名称前加上 & 符号,比方 &myFactoryBean。
    • 获取 FactoryBean 创建的对象: 直接使用 Bean 的名称,比方 myFactoryBean。 Spring 会调用 FactoryBean 的 getObject() 方法,并返回该方法创建的对象。

3. FactoryBean 的工作流程:

  • 设置: 在 Spring 设置文件(XML、JavaConfig 等)中界说一个 FactoryBean 的 Bean。
  • 容器启动: Spring IoC 容器启动时,会剖析设置文件,并创建 FactoryBean 的实例。
  • 获取 Bean: 当应用步调通过 getBean() 方法获取 FactoryBean 创建的对象时(留意,不是 &myFactoryBean):

    • Spring 查抄该 Bean 是否是一个 FactoryBean。
    • 假如是,Spring 调用 FactoryBean 的 getObject() 方法。
    • getObject() 方法负责创建对象实例,并返回该实例。
    • Spring 将 getObject() 方法返回的对象放入 Bean 容器中,并返回给应用步调。

  • 获取 FactoryBean 本身: 当应用步调通过 getBean("&myFactoryBean") 方法获取 FactoryBean 本身的实例时,Spring 直接返回 FactoryBean 的实例。
4. FactoryBean 的使用场景:
FactoryBean 重要用于以了局景:

  • 创建复杂对象: 当对象的创建逻辑比力复杂,必要多个步调、依赖多个其他 Bean、大概必要举行一些初始化利用时,可以使用 FactoryBean。
  • 创建署理对象: FactoryBean 可以用于创建署理对象,比方 AOP 中的署理对象。
  • 集成第三方库: 当必要将第三方库创建的对象集成到 Spring 容器中时,可以使用 FactoryBean。
  • 耽误初始化: FactoryBean 可以耽误对象的创建,直到真正必要使用该对象时才创建。
  • 动态创建对象: 可以根据差异情况返回差异对象。
5. 示例:
  1. // 假设有一个复杂的对象 MyComplexObject
  2. public class MyComplexObject {
  3.     private String property1;
  4.     private int property2;
  5.     public MyComplexObject(String property1, int property2) {
  6.         this.property1 = property1;
  7.         this.property2 = property2;
  8.     }
  9.     // ... getters and setters ...
  10. }
  11. // 创建一个 FactoryBean 来创建 MyComplexObject
  12. public class MyComplexObjectFactoryBean implements FactoryBean<MyComplexObject> {
  13.     private String property1;
  14.     private int property2;
  15.     public void setProperty1(String property1) {
  16.         this.property1 = property1;
  17.     }
  18.     public void setProperty2(int property2) {
  19.         this.property2 = property2;
  20.     }
  21.     @Override
  22.     public MyComplexObject getObject() throws Exception {
  23.         // 在这里可以进行复杂的初始化逻辑
  24.         return new MyComplexObject(property1, property2);
  25.     }
  26.     @Override
  27.     public Class<?> getObjectType() {
  28.         return MyComplexObject.class;
  29.     }
  30.     @Override
  31.     public boolean isSingleton() {
  32.         return true; // 或者 false,根据需要
  33.     }
  34. }
复制代码
  1. <!-- 在 Spring 配置文件中定义 FactoryBean -->
  2. <bean id="myComplexObject" class="com.example.MyComplexObjectFactoryBean">
  3.     <property name="property1" value="value1" />
  4.     <property name="property2" value="123" />
  5. </bean>
复制代码
  1. // 在应用程序中获取 MyComplexObject
  2. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. MyComplexObject myObject = (MyComplexObject) context.getBean("myComplexObject"); // 注意这里是 myComplexObject,而不是 &myComplexObject
  4. System.out.println(myObject.getProperty1()); // 输出: value1
  5. MyComplexObjectFactoryBean factoryBean = (MyComplexObjectFactoryBean) context.getBean("&myComplexObject");
复制代码
总结:
FactoryBean 是 Spring 框架提供的一种强大的对象创建机制。它通过 getObject() 方法,答应我们在开发过程中自界说对象的创建逻辑,从而实现了更机动的对象创建和管理。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表