马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
FactoryBean 是 Spring 框架中一个非常紧张的接口,它为 Spring IoC 容器提供了更机动的对象创建方式。
1. FactoryBean 的界说:
FactoryBean 是一个接口,它界说了三个方法:- public interface FactoryBean<T> {
- @Nullable
- T getObject() throws Exception;
- @Nullable
- Class<?> getObjectType();
- default boolean isSingleton() {
- return true;
- }
- }
复制代码
- 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. 示例:- // 假设有一个复杂的对象 MyComplexObject
- public class MyComplexObject {
- private String property1;
- private int property2;
- public MyComplexObject(String property1, int property2) {
- this.property1 = property1;
- this.property2 = property2;
- }
- // ... getters and setters ...
- }
- // 创建一个 FactoryBean 来创建 MyComplexObject
- public class MyComplexObjectFactoryBean implements FactoryBean<MyComplexObject> {
- private String property1;
- private int property2;
- public void setProperty1(String property1) {
- this.property1 = property1;
- }
- public void setProperty2(int property2) {
- this.property2 = property2;
- }
- @Override
- public MyComplexObject getObject() throws Exception {
- // 在这里可以进行复杂的初始化逻辑
- return new MyComplexObject(property1, property2);
- }
- @Override
- public Class<?> getObjectType() {
- return MyComplexObject.class;
- }
- @Override
- public boolean isSingleton() {
- return true; // 或者 false,根据需要
- }
- }
复制代码- <!-- 在 Spring 配置文件中定义 FactoryBean -->
- <bean id="myComplexObject" class="com.example.MyComplexObjectFactoryBean">
- <property name="property1" value="value1" />
- <property name="property2" value="123" />
- </bean>
复制代码- // 在应用程序中获取 MyComplexObject
- ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- MyComplexObject myObject = (MyComplexObject) context.getBean("myComplexObject"); // 注意这里是 myComplexObject,而不是 &myComplexObject
- System.out.println(myObject.getProperty1()); // 输出: value1
- MyComplexObjectFactoryBean factoryBean = (MyComplexObjectFactoryBean) context.getBean("&myComplexObject");
复制代码 总结:
FactoryBean 是 Spring 框架提供的一种强大的对象创建机制。它通过 getObject() 方法,答应我们在开发过程中自界说对象的创建逻辑,从而实现了更机动的对象创建和管理。
|