spring-第六篇之創建bean的3種方式


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>

    運行結果與靜態工廠方法的一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM