除了可以用构造器创建Bean对象之外,还可以同对象工厂创建bean
工厂创建bean分两种情况
- 工厂类里创建对象的方法是static方法
- 工厂类里创建对象的方法是实例方法。
public interface Dog{}
public class GunDog implements Dog
{
private String name;
//省略getter和setter方法
}
public class PetDog implements Dog
{
private String name;
//省略getter和setter方法
}
工厂类里创建对象的方法是static方法时:
工厂:DogFactory
public class DogFactory
{
//注意下面的方法为static方法
public static Dog createDog(String type)
{
if (type.equalsIgnoreCase("pet"))
{
return new PetDog();
}
else
{
return new GunDog();
}
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!--petDog -> com.lyx.factory.DogFactory.createDog("pet");
petDog.setName("小小");
-->
<bean id="petDog" class="com.lyx.factory.DogFactory" factory-method="createDog" >
<constructor-arg value="pet"/>
<property name="name" value="小小"/>
</bean>
<bean id="gd" class="com.lyx.factory.DogFactory" factory-method="createDog" >
<constructor-arg value="abc"/>
<property name="name" value="旺财"/>
</bean>
</beans>
说明:
- id属性:需要创建的bean的id,所以getBean得到的不是工厂而是工厂创建的对象
- class属性:工厂类的路径
- factory-method:工厂类中的创建对象的方法名
- constructor-arg:为工厂类中方法传的参数
- property :调用返回对象的setter方法完成注入
工厂类里创建对象的方法是实例方法:
工厂:DogFactory
public class DogFactory
{
//注意下面的方法为实例方法
public Dog createDog(String type)
{
if (type.equalsIgnoreCase("pet"))
{
return new PetDog();
}
else
{
return new GunDog();
}
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- dogFactory -> new com.lyx.factory.DogFactory()-->
<bean id="dogFactory" class="com.lyx.factory.DogFactory"/>
<!--petDog -> dogFactory.createDog("pet");
petDog.setName("小小");
-->
<bean id="petDog" factory-bean="dogFactory" factory-method="createDog" >
<constructor-arg value="pet"/>
<property name="name" value="小小"/>
</bean>
<bean id="gd" factory-bean="dogFactory" factory-method="createDog" >
<constructor-arg value="abc"/>
<property name="name" value="旺财"/>
</bean>
</beans>
与第一个基本上一样区别是:
- 因为这个工厂类里的方法是实例方法,所以需要工厂对象来调用,所以bean不指定class而是一个工厂类的bean对象
- 很显然需要额外创建一个工厂bean
另外一种工厂类写法,利用接口创建工厂类:https://blog.youkuaiyun.com/java1592724884/article/details/107977675