一、 說在前面
<!-- 這裏的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 點擊打開鏈接