8. 创建Bean的三种方式:
Spring支持的创建Bean的方式:
(1) 调用构造器创建Bean
(2) 调用静态工厂方法创建Bean
(3) 调用实例工厂方法创建Bean
8.1 使用构造器创建Bean实例:
class属性的值就是Bean实例的实现类。前面有很多相关实例,不再赘述。
8.2 使用静态工厂方法创建Bean:
使用静态工厂方法创建Bean时,class属性也必须指定,但此时class属性不指定Bean实例的实现类,而是静态工厂类。除此之外,还需要使用factory-method指定的静态工厂方法来创建,该方法必须是静态的。如果静态方法需要参数,则使用<constructor-arg.../>元素传入。
Being.java
package com.pmpa.ch03; public interface Being { public void speak(); }
Cat.java
package com.pmpa.ch03; public class Cat implements Being { private String info; public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } @Override public void speak() { // TODO Auto-generated method stub System.out.println(info + ",喵喵叫"); } }
Dog.java
package com.pmpa.ch03; public class Dog implements Being { private String info; public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } @Override public void speak() { // TODO Auto-generated method stub System.out.println(info + ",旺旺叫"); } }
beans03.xml
<bean id ="dog" class="com.pmpa.ch03.BeingStaticFactory" factory-method="getBeing"> <constructor-arg value="dog"/> <property name="info" value="我是狗" /> </bean> <bean id ="cat" class="com.pmpa.ch03.BeingStaticFactory" factory-method="getBeing"> <constructor-arg value="cat"/> <property name="info" value="我是猫" /> </bean>
BeanTest.java
System.out.println("-----------------------测试静态工厂创建Bean------------------------"); Being dog = ctx.getBean("dog", Being.class); Being cat = ctx.getBean("cat", Being.class); dog.speak(); cat.speak();
一旦为<bean.../>指定了 factory-method属性,Spring就不再调用构造器来创建Bean实例,而是调用工厂方法来创建Bean实例。
8.3 调用实例工厂方法创建Bean:
与静态工厂区别:调用静态工厂方法只需要使用工厂类即可,而调用实例工厂方法则需要工厂实例。在配置上,静态工厂方法使用class指定静态工厂类,而配置实例工厂方法则使用factory-bean指定工厂实例。
使用实例工厂方法时,配置Bean实例的<bean.../>元素无需class属性。
采用实例工厂方法创建Bean的<bean.../>元素需要指定2个属性:
(1) factory-bean : 工厂Bean的Id
(2) factory-bean : 该属性指定实例工厂的工厂方法。
(3) constrctor-bean :如果需要调用实例工厂方法时传参,使用该属性。
BeingInstanceFactory.java
package com.pmpa.ch03; public class BeingInstanceFactory { public Being getBeing(String arg) { if(arg.equalsIgnoreCase("dog")) { return new Dog(); } else { return new Cat(); } } }
方法getBeing不是静态方法,所以工厂是实例工厂,而不是静态工厂。
beans03.xml
<bean id="beinginstancefactory" class = "com.pmpa.ch03.BeingInstanceFactory"/> <bean id ="dog" factory-bean="beinginstancefactory" factory-method="getBeing"> <constructor-arg value="dog"/> <property name="info" value="我是狗" /> </bean> <bean id ="cat" factory-bean="beinginstancefactory" factory-method="getBeing"> <constructor-arg value="cat"/> <property name="info" value="我是猫" /> </bean>
运行结果与静态工厂创建的Bean一致。