程序中的之間的關係,不用代碼控制,而徹底是由容器來控制。在運行階段,容器會根據配置信息直接把他們的關係注入到組件中spring
強調程序依賴關係由Spring容器控制ide
之前的開發場景中,咱們每每經過硬編碼的形式維護依賴關係。這種方式使得功能模塊間耦合度極高(緊耦合),不易維護學習
使用依賴注入後,依賴關係及實例化由Spring容器幫咱們維護,並注入到須要使用的功能模塊中測試
強調程序間依賴關係由Spring容器在程序運行時注入依賴關係Beanthis
程序間的依賴關係徹底由Spring容器管理(註解,XML配置)。使得系統模塊間依賴度和耦合度有效下降,易維護,可擴展,鬆耦合編碼
/**
* Created by Administrator on 2017/1/16/016.
* 構造器注入示例
*
*/spa
public class BraveKnight implements Knight {xml
private Quest quest;對象
public BraveKnight(Quest quest) {接口
this.quest = quest;
}
@Override
public void embarkOnQuest() {
quest.embark();
}
}
構造器依賴注入配置文件
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
XML配置建立SlayDragonQuest對象(Spring託管)
constructor-arg:構造方法注入參數屬性
value:屬性值(此配置中使用Spring表達式語言將System.out傳入到構造器)
-->
<bean id="quest" class="springinaction.chapter1.SlayDragonQuest">
<constructor-arg value="#{T(System).out}"/>
</bean>
<!--
XML配置建立BraveKnight對象(Spring託管)
constructor-arg:構造方法注入參數屬性(SlayDragonQuest對象)
ref:引用Bean注入對象(經過已聲明bean的id查找並注入)
-->
<bean id="knight" class="springinaction.chapter1.BraveKnight">
<constructor-arg ref="quest"/>
</bean>
</beans>
測試類
/**
* Created by Administrator on 2017/1/16/016.
* 構造器依賴注入測試類
*/
public class KnightMain {
public static void main(String[] args) throws Exception
{
/**
*加載配置文件獲取Spring上下文對象
*/
ApplicationContext context=new ClassPathXmlApplicationContext("conf/chapter1/IoCDemo.xml");
/**
*Spring上下文對象根據id建立Bean
*/
BraveKnight knight=(BraveKnight)context.getBean("knight");
/**
*調用Bean對應方法
*/
knight.embarkOnQuest();
}
}
注意事項:
構造方法傳入參數爲依賴接口
配置文件中依賴接口<bean></bean>構造方法依賴注入參數(constructor-arg),引用(ref)值爲聲明Bean的標識(id)
/**
* Created by Administrator on 2017/1/17/017.
* Set方法注入示例
*/
public class BraveKnightTestSet implements Knight {
private Quest quest;
public Quest getQuest() {
return quest;
}
public void setQuest(Quest quest) {
this.quest = quest;
}
@Override
public void embarkOnQuest() {
quest.embark();
}
Set方法配置文件
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
XML配置建立SlayDragonQuest對象(Spring託管)
constructor-arg:構造方法注入參數屬性
value:屬性值(此配置中使用Spring表達式語言將System.out傳入到構造器)
-->
<bean id="quest" class="springinaction.chapter1.SlayDragonQuest">
<constructor-arg value="#{T(System).out}"/>
</bean>
<!--
XML配置建立BraveKnight對象(Spring託管)
property:set方法注入參數屬性(SlayDragonQuest對象),name的vakue與Bean對應PropertyName一致
ref:引用Bean注入對象(經過已聲明bean的id查找並注入)
-->
<bean id="knightSet" class="springinaction.chapter1.BraveKnightTestSet">
<property name="quest" ref="quest"/>
</bean>
</beans>
測試類
/**
* Created by Administrator on 2017/1/17/017.
*/
public class BraveKnightTestSetMain {
public static void main(String[] args)
{
/**
*使用ClassPathXmlApplicationContext加載應用上下文
*/
ApplicationContext context=new ClassPathXmlApplicationContext("conf/chapter1/IocSetDemo.xml");
BraveKnightTestSet knightTestSet=(BraveKnightTestSet)context.getBean("knightSet");
knightTestSet.embarkOnQuest();
}
}
注意事項
須要爲注入屬性提供setXXX()方法
配置文件中<bean></bean>添加<property name=」xxx」 ref(value)=」xxx」/>
其中name爲依賴屬性名稱
Ref爲引用Bean標識(id)
Value爲實際依賴值
/**
* Created by Administrator on 2017/1/18/018.
* 靜態工廠
*/
public class AnimalStaticFactor {
/**
*
* @param type:動物類型
* @return Animal
*/
public static Animal getAnimal(String type)
{
if("cat".equalsIgnoreCase(type))
{
return new Cat();
}
else
{
return new Dog();
}
}
}
靜態工廠依賴注入實例類
/**
* Created by Administrator on 2017/1/18/018
* 靜態工廠依賴注入實例.
*/
public class Cat implements Animal {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public void sayHello() {
System.out.println(message+",瞄~瞄");
}
}
靜態工廠依賴注入實例類
/**
* Created by Administrator on 2017/1/18/018.
* 靜態工廠依賴注入示例
*/
public class Dog implements Animal {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public void sayHello() {
System.out.println(message+",汪~汪");
}
}
靜態工廠依賴注入配置文件
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置AnimalFactor的getAnimal方法,使其建立Cat對象
class:工廠類
factor-method:靜態工廠方法
constructor-arg value:靜態工廠參數
property name:Cat實例須要注入的屬性
-->
<bean id="catFactor" class="springinaction.chapter1.AnimalStaticFactor" factory-method="getAnimal">
<constructor-arg value="cat"/>
<property name="message" value="貓貓"/>
</bean>
<!--
配置AnimalFactor的getAnimal方法,使其建立Dog對象
class:工廠類
factor-method:靜態工廠方法
constructor-arg value:靜態工廠參數
property name:Dog實例須要注入的屬性
-->
<bean id="dogFactor" class="springinaction.chapter1.AnimalStaticFactor" factory-method="getAnimal">
<constructor-arg value="dog"/>
<property name="message" value="狗狗"/>
</bean>
</beans>
靜態工廠測試類
/**
* Created by Administrator on 2017/1/18/018.
*/
public class AnimalStaticFactorTest {
public static void main(String[] args){
/**
*使用ClassPathXmlApplicationContext加載應用上下文
*/
ApplicationContext context=new ClassPathXmlApplicationContext("conf/chapter1/IocStaticFactorDemo.xml");
/**
*經過上下文對象建立標識爲catFactor的Bean並調用方法
*/
Animal cat=context.getBean("catFactor",Animal.class);
cat.sayHello();
/**
*經過上下文對象建立標識爲dogFactor的Bean並調用方法
*/
Animal dog=context.getBean("dogFactor",Animal.class);
dog.sayHello();
}
}
注意事項
工廠類須要提供靜態方法生成實例Bean(實現特定接口),返回值爲接口類型
配置文件中class指向接口徹底名
Factor-method指定返回接口類型方法(實際返回的是根據參數創造的接口實現類)
依賴注入參數(constructor-arg)爲靜態工廠返回接口類型靜態方法依賴的參數
<property name=」xxx」 ref(value)=」xxx」/>
其中name爲依賴屬性名稱
Ref爲引用Bean標識(id)
Value爲實際依賴值
/**
* Created by Administrator on 2017/1/18/018.
*實例工廠
*/
public class AnimalFactor {
/**
*
* @param type:動物類型
* @return 根據動物類型建立的動物實例對象
*/
public Animal getAnimal(String type)
{
if("cat".equalsIgnoreCase(type))
{
return new Cat();
}
else
{
return new Dog();
}
}
}
實例工廠依賴注入實例類
/**
* Created by Administrator on 2017/1/18/018
* 實例工廠依賴注入實例.
*/
public class Cat implements Animal {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public void sayHello() {
System.out.println(message+",瞄~瞄");
}
}
實例工廠依賴注入實例類
/**
* Created by Administrator on 2017/1/18/018.
* 實例工廠依賴注入示例
*/
public class Dog implements Animal {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public void sayHello() {
System.out.println(message+",汪~汪");
}
}
實例工廠配置文件
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--聲明動物工廠類,id標識爲animalFactor-->
<bean id="animalFactory" class="springinaction.chapter1.AnimalFactor"/>
<!--聲明建立Cat的Bean,標識爲catFactor
factor-bean:引用AnimalFactor
factor-method:AnimalFactor類生成Animal實例Bean的方法
property name:Cat類依賴注入屬性名稱
property value:Cat類依賴注入屬性值
-->
<bean id="catFactor" factory-bean="animalFactory" factory-method="getAnimal">
<constructor-arg value="cat"/>
<property name="message" value="貓貓"/>
</bean>
<!--
聲明建立Dog的Bean,標識爲dogFactor
factor-bean:引用AnimalFactor
factor-method:AnimalFactor類生成Animal實例Bean的方法
property name:Dog類依賴注入屬性名稱
property value>Dog類依賴注入屬性值
-->
<bean id="dogFactor" factory-bean="animalFactory" factory-method="getAnimal">
<constructor-arg value="dog"/>
<property name="message" value="狗狗"/>
</bean>
</beans>
實例工廠測試類
/**
* Created by Administrator on 2017/1/18/018.
*/
public class AnimalFactorTest {
public static void main(String[] args){
/**
*使用ClassPathXmlApplicationContext加載應用上下文,建立上下文對象
*/
ApplicationContext context=new ClassPathXmlApplicationContext("conf/chapter1/IocStaticFactorDemo.xml");
/**
*使用上下文對象根據標識catFactor創造並實例化Bean,並調用方法
*/
Animal cat=context.getBean("catFactor",Animal.class);
cat.sayHello();
/**
*使用上下文對象根據標識dogFactor創造並實例化Bean,並調用方法
*/
Animal dog=context.getBean("dogFactor",Animal.class);
dog.sayHello();
}
}
注意事項
工廠類須要提供非靜態方法生成實例Bean(實現特定接口),返回值爲接口類型。
因須要使用實例工廠建立實例Bean,需在配置文件中聲明實例工廠Bean
依賴注入參數(constructor-arg)爲靜態工廠返回接口類型靜態方法依賴的參數
<property name=」xxx」 ref(value)=」xxx」/>
其中name爲依賴屬性名稱
Ref爲引用Bean標識(id)
Value爲實際依賴值
本章主要對IoC,DI概念進行了介紹,使用簡單示例說明了依賴注入的使用方式方法
經過Spring容器獲取實例Bean相關:
同一配置文件與不一樣配置文件的狀況下
下一節將對Spring AOP和Aspects相關內容進行學習