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;
}
}
