Spring中bean的注入方式

一、 說在前面

	<!-- 這裏的class是使用反射創建的類對象,相當於HelloWorld helloWorld = new HelloWorld(); -->
	<bean id="helloWorld" class="com.at.beans.HelloWorld">
		<property name="name" value="spring"></property>
	</bean>
class:bean全類名 , 通過反射的方式在IOC容器中創建bean的實例 ,所以要求在HelloWorld的bean中必須有一個無參的構造器。

id:標識容器的bean ,唯一的 。 然後通過id的值來獲取bean的實例。

package com.at.beans;

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

public class TestHelloWorld {

	public static void main(String[] args) {
		
		//1、創建spring的IOC容器對象
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		
		//2、從IOC容器中獲取bean實例
		HelloWorld helloWorld=(HelloWorld)context.getBean("helloWorld");
		
		//3、調用方法
		helloWorld.hello();
	}
}

ApplicationContext 實際上就是一個接口,代表ioc容器,它有兩個主要的實現類:
ClassPathXmlApplicationContext:從 類路徑下加載配置文件
FileSystemXmlApplicationContext: 從文件系統中加載配置文件


二、 兩種DI的方式

(一)屬性注入

	<bean id="dept" class="com.at.beans.Dept">
		<property name="id" value="1"></property>
		<property name="name" value="信息科技部"></property>
	</bean>
屬性注入方式,要求屬性提供set方法。上面提供的是普通屬性注入,如果要注入對象屬性,使用下面的方式

	 <bean id="user" class="com.at.beans.User">
    	 	<property name="id" value="1" />
     	 	<property name="username" value="luoyepiaoxue2014"></property>
    	 	<property name="dept" ref="dept"></property>
         </bean>

我們看到第三個屬性dept,是一個Dept類型的屬性,可以通過ref來引用已定義好的Dept類型。


除了使用ref引用外部定義好的對象,也可以在user內部聲明一個Dept對象

	<bean id="user" class="com.at.beans.User">
    	<property name="id" value="1" />
    	<property name="name" value="luoyepiaoxue2014"></property>
    	<property name="dept">
        	<bean class="com.at.beans.Dept">
            	<property name="id" value="1"/>
            	<property name="name" value="信息科技部"></property>
      	    </bean>
   	     </property>
	</bean>

測試函數

	ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
	User user=(User)context.getBean("user");
        System.out.println(user.getUsername());
	System.out.println(user.getDept().getName());

輸出結果:

五月 18, 2017 3:47:41 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@ea211cf: startup date [Thu May 18 15:47:41 CST 2017]; root of context hierarchy
五月 18, 2017 3:47:41 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
luoyepiaoxue2014
信息科技部

(二)構造器注入

假設有一個Car類

package com.at.beans;

public class Car {

	private String brand;
	private String company;
	private double price;
	private int maxSpeed;
	public Car(String brand, String company, double price) {
		super();
		this.brand = brand;
		this.company = company;
		this.price = price;
	}
	@Override
	public String toString() {
		return "Car [brand=" + brand + ", company=" + company + ", price="
				+ price + ", maxSpeed=" + maxSpeed + "]";
	}
	
	
}
構造器注入如下

	<bean id="car" class="com.at.beans.Car">
		<constructor-arg value="Audi"></constructor-arg>
		<constructor-arg value="shanghaidazhong"></constructor-arg>
		<constructor-arg value="200000"></constructor-arg>
	</bean>
運行結果如下:

五月 18, 2017 7:13:07 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@ea211cf: startup date [Thu May 18 19:13:07 CST 2017]; root of context hierarchy
五月 18, 2017 7:13:07 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
Car [brand=Audi, company=shanghaidazhong, price=200000.0, maxSpeed=0]

但是,假設有兩個這樣的構造方式,如下所示

	public Car(String brand, String company, double price) {
		super();
		this.brand = brand;
		this.company = company;
		this.price = price;
	}
	
	public Car(String brand, String company, int maxSpeed) {
		super();
		this.brand = brand;
		this.company = company;
		this.maxSpeed = maxSpeed;
	}
在applicationContext.xml中配置如下

	<bean id="car" class="com.at.beans.Car">
		<constructor-arg value="Audi"></constructor-arg>
		<constructor-arg value="shanghaidazhong"></constructor-arg>
		<constructor-arg value="200000"></constructor-arg>
	</bean>
	
	<bean id="car2" class="com.at.beans.Car">
		<constructor-arg value="Audi"></constructor-arg>
		<constructor-arg value="shanghaidazhong"></constructor-arg>
		<constructor-arg value="220"></constructor-arg>
	</bean>
使用如下的測試函數

package com.at.beans;

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

public class TestHelloWorld {

	public static void main(String[] args) {
		
		//1、創建spring的IOC容器對象
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		
		Car cat = (Car) context.getBean("car");
		System.out.println(cat);
		
		Car cat2 = (Car) context.getBean("car2");
		System.out.println(cat2);
		
	}
}
測試的結果如下

五月 18, 2017 7:33:35 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@315fb94a: startup date [Thu May 18 19:33:35 CST 2017]; root of context hierarchy
五月 18, 2017 7:33:35 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
Car [brand=Audi, company=shanghaidazhong, price=200000.0, maxSpeed=0]
Car [brand=Audi, company=shanghaidazhong, price=220.0, maxSpeed=0]

分析結果中的情況,調用的都是public Car(String brand, String company, double price)這個構造函數,那麼怎麼調用public Car(String brand, String company, int maxSpeed)這個函數呢,這個時候就需要使用到了type屬性。

	<bean id="car" class="com.at.beans.Car">
		<constructor-arg value="Audi"></constructor-arg>
		<constructor-arg value="shanghaidazhong"></constructor-arg>
		<constructor-arg value="200000" type="double"></constructor-arg>
	</bean>
	<bean id="car2" class="com.at.beans.Car">
		<constructor-arg value="Audi"></constructor-arg>
		<constructor-arg value="shanghaidazhong"></constructor-arg>
		<constructor-arg value="220" type="int"></constructor-arg>
	</bean>
這個時候就出現了預想的結果了

五月 18, 2017 7:42:56 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@37dc299: startup date [Thu May 18 19:42:56 CST 2017]; root of context hierarchy
五月 18, 2017 7:42:56 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
Car [brand=Audi, company=shanghaidazhong, price=200000.0, maxSpeed=0]
Car [brand=Audi, company=shanghaidazhong, price=0.0, maxSpeed=220]


By luoyepiaoxue2014

微博地址: http://weibo.com/luoyepiaoxue2014 點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章