1、创建bean的方式有3种:
1》使用构造器创建bean,即设值注入、构造注入本质都是使用bean的构造器创建bean的。
2》使用静态工厂方法创建bean。
3》调用实例工厂方法创建bean。
2、使用静态工厂方法创建bean
使用静态工厂方法创建bean实例,<bean.../>元素需要指定如下两个属性:
class:值为静态工厂类
factory-method:该属性指定静态工厂方法生产bean实例。如果静态工厂方法需要参数,则使用<constructor-arg.../>元素传入。
举个例子:
Being.java
package com.lfy.bean; public interface Being { public void testBeing(); }
Cat.java
package com.lfy.impl; import com.lfy.bean.Being; public class Cat implements Being { private String msg; public void setMsg(String msg) { this.msg=msg; } @Override public void testBeing() { System.out.println(msg+",猫喜欢吃老鼠"); } }
Dog.java
package com.lfy.impl; import com.lfy.bean.Being; public class Dog implements Being { private String msg; public void setMsg(String msg) { this.msg=msg; } @Override public void testBeing() { System.out.println(msg+",狗爱啃骨头"); } }
BeingFactory.java
package com.lfy.factory; import com.lfy.bean.Being; import com.lfy.impl.Cat; import com.lfy.impl.Dog; /** * 静态工厂类 * @author lfy * */ public class BeingFactory { //返回Being实例的静态工厂方法 //arg参数决定返回哪个Being类的实例 public static Being getBeing(String arg) { if(arg.equalsIgnoreCase("dog")) { return new Dog(); }else { return new Cat(); } } }
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 --> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <!-- 一旦为<bean.../>元素指定了factory-method属性,spring就不再调用构造器来创建bean实例 --> <bean id="dog" class="com.lfy.factory.BeingFactory" factory-method="getBeing"> <!-- 配置静态工厂方法的参数 --> <constructor-arg value="dog"/> <property name="msg" value="我是狗"/> </bean> <bean id="cat" class="com.lfy.factory.BeingFactory" factory-method="getBeing"> <!-- 配置静态工厂方法的参数 --> <constructor-arg value="cat"/> <property name="msg" value="我是猫"/> </bean> </beans>
SpringTest.java
package com.lfy.main; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lfy.bean.Being; import com.lfy.impl.Cat; import com.lfy.impl.Dog; /** * 2、使用静态工厂方法创建bean * @author lfy * */ public class SpringTest { public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml"); Being b1=ctx.getBean("dog", Dog.class); b1.testBeing(); Being b2=ctx.getBean("cat", Cat.class); b2.testBeing(); } }
运行结果:
3、调用实例工厂方法创建bean
实例工厂方法与静态工厂方法只有一点不同:调用静态工厂方法只需要工厂类即可,而实例工厂方法则需要工厂实例。
配置实例工厂方法与静态工厂方法也只有一点不同:配置静态工厂方法使用class指定静态工厂类,而配置实例工厂方法则使用factory-bean指定工厂实例。
使用实例工厂方法创建bean实例,<bean.../>元素需要指定如下两个属性:
factory-bean:该属性值为工厂bean的id。
factory-method:该属性指定实例工厂的工厂方法。如果实例工厂方法需要参数,则使用<constructor-arg.../>元素传入。
以前面的静态工厂方法例子进行些许的修改:
将BeingFactory.java的getBeing(...)的static属性去掉,则得到的是实例工厂方法。
package com.lfy.factory; import com.lfy.bean.Being; import com.lfy.impl.Cat; import com.lfy.impl.Dog; /** * 静态工厂类 * @author lfy * */ public class BeingFactory { //返回Being实例的静态工厂方法 //arg参数决定返回哪个Being类的实例 public Being getBeing(String arg) { if(arg.equalsIgnoreCase("dog")) { return new Dog(); }else { return new Cat(); } } }
修改beans.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 --> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"> <bean id="beingFactory" class="com.lfy.factory.BeingFactory"/> <bean id="dog" factory-bean="beingFactory" factory-method="getBeing"> <constructor-arg value="dog"/> <property name="msg" value="我是狗"/> </bean> <bean id="cat" factory-bean="beingFactory" factory-method="getBeing"> <constructor-arg value="cat"/> <property name="msg" value="我是猫"/> </bean> </beans>
运行结果与静态工厂方法的一致。