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>
運行結果與靜態工廠方法的一致。