spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象

简介: spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象

😀前言

本章是spring基于XML 配置bean系类中第4篇讲解spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉


💫spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象

😊通过静态工厂获取对象

在 spring 的 ioc 容器, 可以通过静态工厂获对象

重新在获取一个bean因为他们所指定的工厂是静态的只会执行一次 所以他们是同一个对象

//通过静态工厂获取bean
    //Java基础-静态和非静态
    @Test
    public void getBeanByStaticFactory() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Monster my_monster01 = ioc.getBean("my_monster01", Monster.class);
        Monster my_monster04 = ioc.getBean("my_monster04", Monster.class);
        System.out.println("my_monster01=" + my_monster01);
        System.out.println(my_monster01 == my_monster04);//true
    }

🍀应用实例

创建MyStaticFactory类
public class MyStaticFactory {
    private static Map<String, Monster> monsterMap;
    //使用 static代码块 进行初始化
    //在java基础的时候,讲过的
    static  {
        monsterMap = new HashMap<>();
        monsterMap.put("monster01", new Monster(100,"牛魔王","芭蕉扇"));
        monsterMap.put("monster02", new Monster(200,"狐狸精","美人计"));
    }
    //提供一个方法,返回Monster对象
    public static Monster getMonster(String key) {
        return monsterMap.get(key);
    }
}
修改 beans.xml
<!--配置monster对象,通过静态工厂获取
    1. 通过静态工厂获取/配置bean
    2. class 是静态工厂类的全路径
    3. factory-method 表示是指定静态工厂类的哪个方法返回对象
    4. constructor-arg value="monster02" value是指定要返回静态工厂的哪个对象
    -->
    <bean id="my_monster01"
          class="com.spring.factory.MyStaticFactory"
          factory-method="getMonster">
        <constructor-arg value="monster02"/>
    </bean>
    <bean id="my_monster04"
          class="com.spring.factory.MyStaticFactory"
          factory-method="getMonster">
        <constructor-arg value="monster02"/>
    </bean>

😀通过实例工厂获取对象

在 spring 的 ioc 容器, 可以通过实例工厂获对象

重新在获取一个bean因为他们所指定的工厂是非静态的调用一次执行一次所以他们不是同一个对象

//通过实例工厂获取bean
    @Test
    public void getBeanByInstanceFactory() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Monster my_monster02 = ioc.getBean("my_monster02", Monster.class);
        Monster my_monster03 = ioc.getBean("my_monster03", Monster.class);
        System.out.println("my_monster02=" + my_monster02);
        System.out.println("my_monster03=" + my_monster03);
        System.out.println(my_monster02 == my_monster03);//false
    }

🍀应用实例

创建MyInstanceFactory 类
public class MyInstanceFactory {
    private Map<String, Monster> monster_map;
    //通过普通代码块进行初始化
    {
        monster_map = new HashMap<>();
        monster_map.put("monster03", new Monster(300, "牛魔王~", "芭蕉扇~"));
        monster_map.put("monster04", new Monster(400, "狐狸精~", "美人计~"));
    }
    //写一个方法返回Monster对象
    public Monster getMonster(String key) {
        return monster_map.get(key);
    }
}
修改 beans.xml
  1. factory-bean 指定使用哪个实例工厂对象返回bean
  2. factory-method 指定使用实例工厂对象的哪个方法返回bean
  3. constructor-arg value=“monster03” 指定获取到实例工厂中的哪个monster
<!--配置2个实例工厂对象-->
    <bean class="com.spring.factory.MyInstanceFactory" id="myInstanceFactory"/>
    <bean class="com.spring.factory.MyInstanceFactory" id="myInstanceFactory2"/>
    <!--配置monster对象, 通过实例工厂
    解读
    1. factory-bean 指定使用哪个实例工厂对象返回bean
    2. factory-method 指定使用实例工厂对象的哪个方法返回bean
    3. constructor-arg value="monster03" 指定获取到实例工厂中的哪个monster
    -->
    <bean id="my_monster02" factory-bean="myInstanceFactory" factory-method="getMonster">
        <constructor-arg value="monster03"/>
    </bean>
    <bean id="my_monster03" factory-bean="myInstanceFactory2" factory-method="getMonster">
        <constructor-arg value="monster03"/>
    </bean>

🥰通过 FactoryBean 获取对象

在 spring 的 ioc 容器, 可以通过 FactoryBean 获取对象

//通过FactoryBean获取bean
    @Test
    public void getBeanByFactoryBean() {
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Monster my_monster05 = ioc.getBean("my_monster05", Monster.class);
        System.out.println("my_monster05=" + my_monster05);
    }

🍀应用实例

创建 MyFactoryBean
public class MyFactoryBean implements FactoryBean<Monster> {
    //这个就是你配置时候,指定要获取的对象对应key
    private String key;
    private Map<String, Monster> monster_map;
    {   //代码块,完成初始化
        monster_map = new HashMap<>();
        monster_map.put("monster03", new Monster(300, "牛魔王~", "芭蕉扇~"));
        monster_map.put("monster04", new Monster(400, "狐狸精~", "美人计~"));
    }
    public void setKey(String key) {
        this.key = key;
    }
    @Override
    public Monster getObject() throws Exception {
        return monster_map.get(key);
    }
    @Override
    public Class<?> getObjectType() {//得到类型
        return Monster.class;
    }
    @Override
    public boolean isSingleton() {//这里指定是否返是单例
        return false;
    }
}
配置beans.xml
<!--配置monster对象,通过FactoryBean获取
    解读
    1. class 指定使用的FactoryBean
    2. key表示就是 MyFactoryBean 属性key
    3. value就是你要获取的对象对应key
    -->
    <bean id="my_monster05" class="com.spring.factory.MyFactoryBean">
        <property name="key" value="monster04"/>
    </bean>

😄总结

本篇消详细的讲解了spring中怎么通过静态工厂和动态工厂获取对象以及他们的区别

以及怎么通过 FactoryBean 获取对象

spring基于XML 配置bean系类

第一篇–>怎么通过类型来获取 bean以及为什么可以通过构造器配置 bean

第二篇–> 怎么通过通过 p 名称空间配置 bean以及怎么去引用/注入其它 bean 对象–ref和怎么去引用/注入内部 bean 对象

第三篇–> spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值


文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁

希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞


目录
相关文章
|
3月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
1月前
|
缓存 JavaScript Java
Spring之FactoryBean的处理底层源码分析
本文介绍了Spring框架中FactoryBean的重要作用及其使用方法。通过一个简单的示例展示了如何通过FactoryBean返回一个User对象,并解释了在调用`getBean()`方法时,传入名称前添加`&`符号会改变返回对象类型的原因。进一步深入源码分析,详细说明了`getBean()`方法内部对FactoryBean的处理逻辑,解释了为何添加`&`符号会导致不同的行为。最后,通过具体代码片段展示了这一过程的关键步骤。
Spring之FactoryBean的处理底层源码分析
|
1月前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
40 1
|
1月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
110 2
|
1月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
29 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
1月前
|
XML 缓存 Java
Spring FactoryBean 的常见使用场景总结
FactoryBean 是 Spring 框架中的一个重要接口,用于自定义 Bean 的创建逻辑。常见使用场景包括: 1. **复杂 Bean 的创建**:如数据源配置。 2. **延迟实例化**:按需创建资源密集型对象。 3. **动态代理**:为 Bean 创建 AOP 代理。 4. **自定义配置**:根据特定配置创建 Bean。 5. **第三方库集成**:利用 FactoryBean 封装外部库的创建过程。
|
3月前
|
安全 Java C#
Spring创建的单例对象,存在线程安全问题吗?
Spring框架提供了多种Bean作用域,包括单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)、全局会话(GlobalSession)等。单例是默认作用域,保证每个Spring容器中只有一个Bean实例;原型作用域则每次请求都会创建一个新的Bean实例;请求和会话作用域分别与HTTP请求和会话绑定,在Web应用中有效。 单例Bean在多线程环境中可能面临线程安全问题,Spring容器虽然确保Bean的创建过程是线程安全的,但Bean的使用安全性需开发者自行保证。保持Bean无状态是最简单的线程安全策略;
|
6月前
|
存储 Java 数据库
Spring的使用-Bean对象的储存和获取/Bea对象的作用域与生命周期
Spring的使用-Bean对象的储存和获取/Bea对象的作用域与生命周期
|
设计模式 前端开发 Java
Spring Bean对象生命周期
Spring Bean对象生命周期
412 0
|
存储 Java Spring
【Spring原理探索】深入认识对象生命周期之BeanPostProcessor
【Spring原理探索】深入认识对象生命周期之BeanPostProcessor
137 0
【Spring原理探索】深入认识对象生命周期之BeanPostProcessor