org.springframework.beans.factory

FactoryBean

🌈官方地址

image-20221216223336630

  • 可以为本身就是工厂的对象实现org.springframework.beans.factory.FactoryBean接口
  • FactoryBean 接口是 Spring IoC 容器实例化逻辑的可插入点。
  • 如果您有复杂的初始化代码,最好用 Java 表示,而不是(可能)冗长的 XML,您可以创建自己的 FactoryBean,在该类中编写复杂的初始化,然后将自定义 FactoryBean 插入容器。
  • FactoryBean<T> 接口提供了三个方法:
    • T getObject(): 返回一个这个工厂创建的实例。 该实例可能会被共享,这取决于该工厂返回的是单例还是原型。
    • boolean isSingleton(): 如果此 FactoryBean 返回单例,则返回 true,否则返回 false。此方法的默认实现返回 true。
    • Class<?> getObjectType(): 返回由 getObject() 方法返回的对象类型,如果类型事先未知,则返回 null。

FactoryBean 概念和接口在 Spring Framework 中的许多地方使用。 FactoryBean 接口的 50 多个实现随 Spring 本身一起提供。

当您需要向容器询问实际的 FactoryBean 实例本身而不是它生成的 bean 时,在调用 ApplicationContext 的 getBean() 方法时,在 bean 的 id 前加上符号 (&)。

因此,对于给定的 id 为 myBean 的 FactoryBean,在容器上调用 getBean("myBean") 会返回 FactoryBean 的产品,而调用 getBean("&myBean") 会返回 FactoryBean 实例本身。

Example:

package cn.pickle;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author Pickle
 * @version V1.0
 * @date 2022/12/16 22:46
 */
public class Demo1 {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        final Object sqlSessionFactory = ctx.getBean("sqlSessionFactory");
        final Object sqlSessionFactoryBean = ctx.getBean("&sqlSessionFactory");
        System.out.println(sqlSessionFactory.toString());
        System.out.println(sqlSessionFactoryBean.toString());
    }
}

控制台输出

image-20221216232248400

posted @ 2022-12-16 23:26  破忒头头  阅读(244)  评论(0)    收藏  举报