😀前言
本章是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
- factory-bean 指定使用哪个实例工厂对象返回bean
- factory-method 指定使用实例工厂对象的哪个方法返回bean
- 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连支持一下,创造不易您们的支持是我的动力🤞