Java依賴注入的三種方式


Spring通過DI(依賴注入)實現IOC(控制反轉),常用的注入方式主要有三種:構造方法注入,setter注入,基於注解的注入。

構造方法注入
構造器注入:保證了一些必要的屬性在Bean實例化時就設置,並且確保了bean實例在實例化后就可以使用.

1.在類中,不用為屬性設置setter方法,只需提供構造方法即可
2.在構造文件中配置該類bean,並配置構造器,在配置構造器中用

//ApplicationContext.xml
<bean id="action" class="com.action.UserAction">
    <constructor-arg index ="0" name="name" value="Murphy"></constructor-arg>
</bean>

提供構造方法

public class UserAction {
 private  String name;
   public UserAction(String name) {
         this.name = name;
    }
}

  

setter注入
    1.根據property標簽的name屬性的值去找對應的setter方法.
       例如: name= “aa” 對應的就是setAa方法.
    2.由於屬性注入具有可選性和靈活性高的優點,是實際上最常用的注入方式.
    3.屬性注入要求bean提供一個默認的構造函數,並為需要注入的屬性提供對應的setter方法.spring先調用bean默認的構造函數實例化bean對象,然后通過反射機制的方法調用setter方法注入屬性值.
    4.還有一點需要注意:如果通過set方法注入屬性,那么spring會通過默認的空參構造方法來實例化對象,所以如果在類中寫了一個帶有參數的構造方法,一定要把空參數的構造方法寫上,否則spring沒有辦法實例化對象,導致報錯。

 //ApplicationContext.xml
<bean id="action" class="com.action.UserAction">
       <property name="name" value="Murphy"/>
</bean>

提供setting方法

public class UserAction {
      private String name;
   public String getName() {
        return name;
    }   
   public void setName(String name) {
        this.name = name;
    } 
 }

  

注解注入
 @Autowired(構造,接口,方法)
自動裝配,默認根據類型注入
—屬性Required

     1.@Autowired(required=true):當使用@Autowired注解的時候,其實默認就是@Autowired(required=true),表示注入的時候,該bean必須存在,否則就會注入失敗
     2.@Autowired(required=false):表示忽略當前要注入的bean,如果有直接注入,沒有跳過,不會報錯。
     3.required屬性含義和@Required一樣,只是@Required只適用於基於XML配置的setter注入方式,只能打在setting方法上。

public class AutowiredAction {

	private String name;
	private List<String> list;
	
	@Autowired
	private AutowiredAction(String name) {
		this.name=name;
	}
	
	public String getName() {
		return name;
	}

	@Autowired
	public void setName(String name) {
		this.name = name;
	}
	
	@Autowired(required = true)
	private void initName(String name,List<String> list) {
		this.name = name;  
        this.list = list;
	}

}

  接口

public interface AutowiredIn {

	@Autowired
	 void initName(String name,Integer age);
}

  @Resource 默認按照名稱裝配
      可以標注在字段或屬性的setter方法上。默認按照字段的名稱去Spring容器中找依賴對象,如果沒有找到,退回到按照類型查找
      如果配置了屬性name
      那么只能按照名稱找依賴對象

public class ResourceAction {

	@Resource(name="name")
	private String name;
	
	@Resource
	private List<String> list;
	
	
	public String getName() {
		return name;
	}
	@Resource
	public void setName(String name) {
		this.name = name;
	}
	
	public List<String> getList() {
		return list;
	}
	public void setList(List<String> list) {
		this.list = list;
	}
	
}

  


免責聲明!

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



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