本次配置均基于xml文件进行配置,以往我们配置bean总是直接在class中指明该类即可,但如果通过工厂类的工厂方法来创建的对象,该如何进行依赖注入呢?下面给大家进行一个演示。
一、工厂类
AnimalFactory工厂:
package cool.gjh.zoo;
/**
* 动物工厂
* <p>
* 盛产动物
* </p>
* @author ACE_GJH
*/
public class AnimalFactory {
/**
* 根据动物名获取动物实例
*
* @param name 动物名
* @return 动物实例
*/
public static Animal getAnimalByName(String name){
switch (name){
case "Cat":return new Cat();
case "Dog":return new Dog();
default:throw new RuntimeException("The animal does not exist.");
}
}
}
Animal接口:
package cool.gjh.zoo;
/**
* 动物接口
*
* @author ACE_GJH
*/
public interface Animal {
/**
* 叫
*/
void speak();
}
Cat类:
package cool.gjh.zoo;
/**
* 猫
* @author ACE_GJH
*/
public class Cat implements Animal {
/**
* 叫
*/
@Override
public void speak() {
System.out.println("Miao Miao...");
}
}
Dog类:
package cool.gjh.zoo;
/**
* 狗
* @author ACE_GJH
*/
public class Dog implements Animal {
/**
* 叫
*/
@Override
public void speak() {
System.out.println("Wang Wang...");
}
}
二、配置工厂类
<!-- 工厂类Bean -->
<bean class="cool.gjh.zoo.AnimalFactory" factory-method="getAnimalByName" id="cat">
<constructor-arg value="Cat"/>
</bean>
<bean class="cool.gjh.zoo.AnimalFactory" factory-method="getAnimalByName" id="singleDog">
<constructor-arg value="Dog"/>
</bean>
三、注入bean
测试类:
@Autowired
private Animal singleDog;
@Autowired
private Animal cat;
/**
* 测试注入Bean
*/
@Test
public void testJavaDITest(){
singleDog.speak();
cat.speak();
}
测试结果:
注意注入时的变量名和配置文件中工厂bean的id保持一致