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