依賴注入DI(Dependency Injection)的三種注入方法使用介紹
set方法
構造方法
注解法
1、使用set方法注入
如下圖中UseService檔案依賴Userdao對象,可以通過setUserDao11函數設定注入
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csoXSU1UNJR1Ty0keYhnRzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcuEDO5IzM0QTM0EzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
配置檔案使用property标簽配置注入内容
注意:配置檔案中name參數的值取至set方法後跟的内容同時首字母小寫
例如:set方法名是setUserDao111,那麼name的值就是userDao111。
2、使用有參構造函數注入
有參構造函數注入使用constructor-arg标簽name是要注入的構造函數的參數名
如果注入的内容是引用類型,就使用‘ref=’給對象指派,且對象的值必須是在配置檔案中注冊過的的對象id,如本文中的userServiceId和userDaoId,如果注入内容是普通資料類型,就使用‘value=’指派,賦的值可以是任意值,無需提前注冊。
3、使用注解注入
使用注解方法時不需要在配置檔案中添加各個要注入的内容,而是在配置檔案中配置元件掃描即可,源檔案也不在需要定義set方法,構造方法。
在配置檔案中添加如下語句,即可讓spring掃描com.syx.dao包下的所有注解,否則spring無法識别你注解的内容
具體注解方法如下:
// 使用Component添加id為userServiceId的注解相當于配置檔案執行了
// <bean id="userServiceId" class="com.syx.dao.service.UserService"/>
@Component("userServiceId")
public class UserService {
// Autowired和Qualifier組合作用是按照名稱進行注入,使用相當于
// <constructor-arg name="userdaoparam" ref="userDaoId"></constructor-arg>
@Autowired
@Qualifier("userDaoId")
private UserDao userdaoparam;
// Value是按照值進行注入,相當于
// <property name="test_a" value="13"></property>
// 注解中的值可以是${...}表達式
@Value("13")
private int test_a;
public void test() {
System.out.println("注入值是" + test_a);
userdaoparam.test();
}
}
---------分界線----------以下是作為一個配置類常用的注解------------------
// 标志該類是spring的核心配置類
@Configuration
// 配置元件掃描包
// 相當于配置檔案中的<context:component-scan base-package="com.syx.dao"></context:component-scan>
@ComponentScan("com.syx.dao")
// 加載資源配置檔案jdbc.properties
// 相當于配置檔案中的 <context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("claspath:jdbc.properties")
// 加載其他配置類,可加載多個,使用逗号分隔
// 相當于配置檔案中的 <import resource="xxx"/>
@Import({XXXX.class, YYY.class, ZZZ.class})
public class SpringConfig {
@Value("${jdbc.driver}")
private String driver;
// Spring 會把目前方法的傳回值以指定名稱dataSourceName存儲到容器中
@Bean("dataSourceName")
public DataSource getDataSource() {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.SetDriverClass(driver);
...
...
...
return dataSource;
}
}
4、常用配置檔案注入XML标簽使用示例
<bean id="userServiceId" class="com.syx.dao.service.UserService">
<property name="userDao11" ref="userDaoId"></property>
<!-- test_a 是int類型資料注入值100 -->
<property name="test_a" value="100"></property>
<!-- strList是List<String>集合,使用如下方法給集合添加兩個成員aaa和bbb -->
<property name="strList">
<list>
<value>aaa</value>
<value>bbb</value>
<!-- 如果集合List存儲的是引用類型資料 需改用ref标簽指派,如下
<ref bean="userDaoId"></ref>
-->
</list>
</property>
<!-- userMap是Map<String, String>類型資料 -->
<property name="userMap">
<map>
<entry key="adc" value="def"></entry>
<!-- 如果Map的鍵值對均為引用類型,那麼要使用如下标簽進行注入
<entry key-ref="adc" value-ref="def"></entry>
-->
</map>
</property>
<!-- properties是一個Properties類型資料 -->
<property name="properties">
<props>
<prop key="adc">123456</prop >
<prop key="adc">fkgj</prop >
</props>
</property>
<!-- 配置元件掃描包 當類中使用注解時需要配置此标簽掃描注解 -->
<context:component-scan base-package="com.syx.dao"></context:component-scan>
<!-- 加載其他配置檔案 -->
<import resource="">
</bean>
5、注解詳解
1、@Component和@Controller、@Service、@Repository三個注解功能完全一緻,隻不過後三個一般分别用于web層,service層和dao層,更能起到表意作用。
2、@Autowired用于字段的依賴注入,當spring容器中隻有某類的一個bean時,可以單獨使用。
@Qualifier結合@Autowired按名稱給字段注入
@Resource(name = “bean_id”)相當于@Qualifier和@Autowired(“bean_id”)配合使用
3、@Value 注入普通值屬性,通常Value的值會使用${…}表達式
4、@Scope 設定bean是僅建立單個對象還是可以建立多個對象。
5、@PostConstruct設定bean的初始化方法,作用等同于配置檔案中的init-methond="…"
相關函數執行順序:
注解類構造函數Constructor -> @Autowired -> @PostConstruct
6、@PreDestroy設定bean的銷毀方法,作用等同于配置檔案的destory-methond="…"
用法見第三小節示例