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

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

个人主页:尘觉主页

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

在csdn获奖荣誉: csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣  端午大礼包获得者

欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦

文章目录

  • spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象
    • 通过静态工厂获取对象
      • 应用实例
        • 创建MyStaticFactory类
        • 修改 beans.xml
    • 通过实例工厂获取对象
      • 应用实例
        • 创建MyInstanceFactory 类
        • 修改 beans.xml
    • 通过 FactoryBean 获取对象
      • 应用实例
        • 创建 MyFactoryBean
        • 配置beans.xml
    • 总结

spring中怎么通过静态工厂和动态工厂获取对象以及怎么通过 FactoryBean 获取对象_第1张图片

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


    
        
    

    
        
    

通过实例工厂获取对象

在 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


    
    
    
    
        
    

    
        
    

通过 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

  
    
        
    

总结

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

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

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

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

热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力

你可能感兴趣的:(#,spring,spring,java,后端,笔记,spring,boot,java-ee,junit)