Spring依賴注入

菜雞03號發表於2016-09-13

<span style="font-size:18px;">xmlns:context="http://www.springframework.org/schema/context"</span>

1.依賴注入的理解:控制反轉又名依賴注入,原來當生產一個類的物件的時候需要我們主動來建立(NEW),當引入Spring後當我們需要一個類時不再需要我們來主動建立(new)而是由Spring為我們建立;這樣我們對物件建立的控制關係就轉為Spring對物件建立的控制,因此稱作控制反轉


2.Spring的幾種注入方式

1>使用屬性的setter方法注入

2>使用構造器注入

3>使用註解注入


一、使用屬性的setter方法注入

介面

<span style="font-size:18px;">public interface PersonService {
	public void  eat();
}
</span>
實現類
<span style="font-size:18px;">public class PersonServiceImpl  implements PersonService{
	private String food;
	
   @Override
   public void eat(){
	   System.out.println(food);
   }

public String getFood() {
	return food;
}

public void setFood(String food) {
	this.food = food;
}</span>
XML配置
<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd">
  <bean id="person" class="org.mary.bean.PersonServiceImpl">
  <property name="food" value="iceCream"></property>
  </bean>
</beans></span>
測試
<span style="font-size:18px;">public class Test {
  public  static void main(String []args){
	  ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
	  PersonService ps=ctx.getBean("person", PersonServiceImpl.class);
	  ps.eat();
  }
}
</span>
二.構造器注入
<span style="font-size:18px;">public interface BaseDao {
   public void save();
}
</span>

<span style="font-size:18px;">public class BaseDaoImpl implements BaseDao {
  
	@Override
	public void save(){
		System.out.println("save");
	}
}
</span>

<span style="font-size:18px;">public interface BaseService {
   
	public void save();
}</span>

<span style="font-size:18px;">public class BaseServiceImpl implements BaseService {
     private String name;
     private BaseDao baseDao;
     
     
     public BaseServiceImpl(BaseDao baseDao,String name){
    	 this.baseDao=baseDao;
    	 this.name=name;
     }

	public String getName() {
		return name;
	}

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

	public BaseDao getBaseDao() {
		return baseDao;
	}

	public void setBaseDao(BaseDao baseDao) {
		this.baseDao = baseDao;
	}
     
	@Override
    public void save(){
   	  baseDao.save();
   	  System.out.println(name);
    } 
	
}
</span>

XML配置
<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd">
  <bean id="baseDao" class="org.mary.bean.BaseDaoImpl"/>
  <bean id="baseSerivce" class="org.mary.bean.BaseServiceImpl">
    <constructor-arg index="0"  ref="baseDao"/>
    <constructor-arg index="1" value="豬"/>
  </bean>
</beans></span>

Test
<span style="font-size:18px;">public class Test {
		public static void main(String []args){
			ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
			BaseService bs=ctx.getBean("baseSerivce", BaseServiceImpl.class);
			bs.save();
		}
}
</span>

三.註解方式

@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource預設按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
  @Resource裝配順序
  1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常
  2. 如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常
  3. 如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常
  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配; 
這裡僅僅使用@Resource進行舉例:

程式碼和上面的相同,僅僅是PersonServiceBean.java變了:

<span style="font-size:18px;">public interface BaseDao {
	public void save();
}
</span>

<span style="font-size:18px;">public class BaseDaoImpl implements BaseDao{
	
	@Override
	public void save(){
		System.out.println("save");
	}
}</span>

<span style="font-size:18px;">public interface BaseService {
		
	public void save();
}
</span>

<span style="font-size:18px;">public class BaseServiceImpl implements BaseService{
	
	@Resource(name="baseDao")private BaseDao baseDao;
	public void BaseServiceImpl(BaseDao baseDao){
		this.baseDao=baseDao;
	}
	@Override
	public void save(){
		baseDao.save();
	}
}</span>

Xml配置
<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.springframework.org/schema/beans"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/context      
      http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <context:annotation-config/>
   <bean id="baseDao"  class="org.mary.bean.BaseDaoImpl"/>
   <bean id="baseService" class="org.mary.bean.BaseServiceImpl"/>
</beans></span>
XML中增加的內容如下
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context      
      http://www.springframework.org/schema/context/spring-context-3.0.xsd
<context:annotation-config/>開啟註解掃描




Test類
<span style="font-size:18px;">public class Test {
	public static void main(String []args){
		
		ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
		BaseService bs=ctx.getBean("baseService", BaseServiceImpl.class);
		bs.save();
	}
}
</span>








相關文章