Spring Bean 注入 1 - 構造方法注入,屬性注入,自動裝配


1.代碼結構圖

xxx

2.bean代碼

package com.xxx.bean;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午1:25
 * To change this template use File | Settings | File Templates.
 */
public abstract class People {
    protected String name;
    protected int age;
    protected Pet pet;

    public abstract String speak();

    @Override
    public String toString() {
        return "I am " + name + ", I'm " + age +
                " years old. And I have a pet named " + pet.getName();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Pet getPet() {
        return pet;
    }

    public void setPet(Pet pet) {
        this.pet = pet;
    }
}

package com.xxx.bean;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午1:28
 * To change this template use File | Settings | File Templates.
 */
public class Chinese extends People {
    public Chinese(String name, int age, Pet pet) {
        this.name = name;
        this.age = age;
        this.pet = pet;
    }

    public Chinese() {
    }

    @Override
    public String speak() {
        return "I can speak Chinese";
    }
}

package com.xxx.bean;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午2:14
 * To change this template use File | Settings | File Templates.
 */
public class American extends People {
    private List<Pet> petList;

    @Override
    public String speak() {
        return "I can speak English!";
    }

    public List<Pet> getPetList() {
        return petList;
    }

    public void setPetList(List<Pet> petList) {
        this.petList = petList;
    }
}

package com.xxx.bean;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午1:26
 * To change this template use File | Settings | File Templates.
 */
public abstract class Pet {
    protected String name;
    public abstract String bark();

    @Override
    public String toString() {
        return "My name is " + name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

package com.xxx.bean;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午1:28
 * To change this template use File | Settings | File Templates.
 */
public class Dog extends Pet {
    public Dog() {
    }

    public Dog(String name) {
        this.name = name;
    }

    @Override
    public String bark() {
        return "Wang wang";
    }
}

package com.xxx.bean;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午1:29
 * To change this template use File | Settings | File Templates.
 */
public class Cat extends Pet {
    public Cat() {
    }

    @Override
    public String bark() {
        return "miao";
    }
}

 

3.applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 構造方法注入示例 -->
    <!-- scope參數表示bean的作用域,如下 -->
    <!-- singleton,默認值,一個bean只有一個實例 -->
    <!-- prototype,每次調用創建一個實例 -->
    <!-- request,每次http請求對應一個實例,僅在Spring MVC上下文有效 -->
    <!-- session,每個session對應一個實例,僅在Spring MVC上下文有效 -->
    <!-- global-session,每個全局session對應一個實例,盡在Portlet上下文有效 -->
    <bean id="chineseA" class="com.xxx.bean.Chinese" scope="prototype">
        <constructor-arg value="Li Lei"/>
        <constructor-arg value="15"/>
        <constructor-arg ref="dogA"/>
    </bean>

    <bean id="dogA" class="com.xxx.bean.Dog">
        <constructor-arg value="Bobby"/>
    </bean>

    <!-- 工廠方法注入示例 -->
    <!-- 如果bena的類型是一個單例模式類 -->
    <!-- 那么注入這個類的方法則是使用其工廠方法生成實例 -->
    <!--<bean id="staticClass" -->
          <!--class="com.xxx.bean.StaticClass"-->
          <!--factory-method="getInstance" />-->

    <!-- 屬性注入示例 -->
    <!-- 使用p前綴,直接引入屬性或屬性引用 -->
    <bean id="chineseB" class="com.xxx.bean.Chinese" scope="prototype"
            p:pet-ref="catA">
        <property name="name" value="Han Meimei" />
        <property name="age" value="18" />
        <!--<property name="pet" ref="catA" />-->
    </bean>

    <bean id="catA" class="com.xxx.bean.Cat"
          p:name="Kitty" />

    <!-- 集合注入示例 -->
    <!-- 集合注入包括List,Set,Map,Properties -->
    <!-- 此處以List為例子,其他不詳寫 -->
    <bean id="americanA" class="com.xxx.bean.American" scope="prototype">
        <property name="name" value="Michael Johnson" />
        <property name="age" value="28" />
        <property name="pet" ref="dogB" />
        <property name="petList">
            <list>
                <ref bean="dogA" />
                <ref bean="catA" />
            </list>
        </property>
    </bean>

    <bean id="dogB" class="com.xxx.bean.Dog"
          p:name="Cookie" />
</beans>

 

 

4.測試代碼及結果

package com.xxx.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午1:51
 * To change this template use File | Settings | File Templates.
 */
public class ConstructInjectTest {
    /**
     * Spring的3種應用上下文介紹
     * ClassPathXmlApplicationContext-從運行時加載類路徑下讀取XML配置
     * FileSystemXmlApplicationContext-從文件系統讀取XML配置文件(絕對路徑)
     * XmlWebApplicationContext-從Web應用下讀取XML配置文件
     */
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        People chinese = (People) ctx.getBean("chineseA");
        Pet dog = chinese.getPet();
        System.out.println(chinese);
        System.out.println(chinese.speak());
        System.out.println(dog);
        System.out.println(dog.bark());
    }
}

I am Li Lei, I'm 15 years old. And I have a pet named Bobby
I can speak Chinese
My name is Bobby
Wang wang

 

package com.xxx.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午2:13
 * To change this template use File | Settings | File Templates.
 */
public class PropInjectTest {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        People chinese = (People) ctx.getBean("chineseB");
        Pet dog = chinese.getPet();
        System.out.println(chinese);
        System.out.println(chinese.speak());
        System.out.println(dog);
        System.out.println(dog.bark());
    }
}

I am Han Meimei, I'm 18 years old. And I have a pet named Kitty
I can speak Chinese
My name is Kitty
miao

 

package com.xxx.bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created with IntelliJ IDEA.
 * User: zhenwei.liu
 * Date: 13-7-18
 * Time: 上午2:23
 * To change this template use File | Settings | File Templates.
 */
public class CollectionInjectTest {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        American american = (American) ctx.getBean("americanA");
        Pet dog = american.getPet();
        System.out.println(american);
        System.out.println(american.speak());
        System.out.println(dog);
        System.out.println(dog.bark());
        System.out.println(american.getPetList());
    }
}

I am Michael Johnson, I'm 28 years old. And I have a pet named Cookie
I can speak English!
My name is Cookie
Wang wang
[My name is Bobby, My name is Kitty]

 

自動裝配配置

    <!-- 自動裝配示例 -->
    <!-- autowire屬性表示自動裝配bean中的所有屬性,也可以和手動裝配混合使用 -->
    <!-- byName表示裝配屬性名與bean id相同的bean -->
    <!-- byType表示裝配類型與bean class類型相同的bean -->
    <!-- constructor表示按照構造方法裝配,裝配規則與byType相同 -->
    <!-- autodetect表示先使用constructor裝配,如果沒有與構造方法匹配的參數,在使用byType裝配 -->
    <!-- 當使用byType有多個符合條件的bean時,可以設置primary=true,表示有多個符合條件bean時使用此bean -->
    <!-- 如果不想讓某個bean成被裝配,可以設置autowire-candidate=false -->
    <bean id="autoChinese" class="com.xxx.bean.Chinese"
          autowire="byName" >
        <property name="name" value="#{chineseA.name}" />
    </bean>

    <!-- 可以在 beans 標簽中配置全局自動裝配 default-autowire="byType" -->

 


免責聲明!

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



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