前言
- 依賴注入DI(Dependency Injection)的三種注入方法使用介紹
- set方法
- 構(gòu)造方法
- 注解法
使用set方法注入
如下圖中UseService文件依賴Userdao對(duì)象,可以通過(guò)setUserDao11函數(shù)設(shè)置注入
配置文件使用property標(biāo)簽配置注入內(nèi)容
注意:配置文件中name參數(shù)的值取至set方法后跟的內(nèi)容同時(shí)首字母小寫
例如:set方法名是setUserDao111,那么name的值就是userDao111。
使用有參構(gòu)造函數(shù)注入
有參構(gòu)造函數(shù)注入使用constructor-arg標(biāo)簽name是要注入的構(gòu)造函數(shù)的參數(shù)名
如果注入的內(nèi)容是引用類型苦始,就使用‘ref=’給對(duì)象賦值盈简,且對(duì)象的值必須是在配置文件中注冊(cè)過(guò)的的對(duì)象id,如本文中的userServiceId和userDaoId宴霸,如果注入內(nèi)容是普通數(shù)據(jù)類型驮瞧,就使用‘value=’賦值蒜埋,賦的值可以是任意值朗鸠,無(wú)需提前注冊(cè)卸例。
使用注解
使用注解方法時(shí)不需要在配置文件中添加各個(gè)要注入的內(nèi)容筷转,而是在配置文件中配置組件掃描即可,源文件也不在需要定義set方法,構(gòu)造方法悬而。
在配置文件中添加如下語(yǔ)句呜舒,即可讓spring掃描com.syx.dao包下的所有注解,否則spring無(wú)法識(shí)別你注解的內(nèi)容
<context:component-scan base-package="com.syx.dao"></context:component-scan>
具體注解方法如下:
// 使用Component添加id為userServiceId的注解相當(dāng)于配置文件執(zhí)行了
// <bean id="userServiceId" class="com.syx.dao.service.UserService"/>
@Component("userServiceId")
public class UserService {
// Autowired和Qualifier組合作用是按照名稱進(jìn)行注入笨奠,使用相當(dāng)于
// <constructor-arg name="userdaoparam" ref="userDaoId"></constructor-arg>
@Autowired
@Qualifier("userDaoId")
private UserDao userdaoparam;
// Value是按照值進(jìn)行注入袭蝗,相當(dāng)于
// <property name="test_a" value="13"></property>
// 注解中的值可以是${...}表達(dá)式
@Value("13")
private int test_a;
public void test() {
System.out.println("注入值是" + test_a);
userdaoparam.test();
}
}
常用配置文件注入標(biāo)簽使用示例
<bean id="userServiceId" class="com.syx.dao.service.UserService">
<property name="userDao11" ref="userDaoId"></property>
<!-- test_a 是int類型數(shù)據(jù)注入值100 -->
<property name="test_a" value="100"></property>
<!-- strList是List<String>集合,使用如下方法給集合添加兩個(gè)成員aaa和bbb -->
<property name="strList">
<list>
<value>aaa</value>
<value>bbb</value>
<!-- 如果集合List存儲(chǔ)的是引用類型數(shù)據(jù) 需改用ref標(biāo)簽賦值般婆,如下
<ref bean="userDaoId"></ref>
-->
</list>
</property>
<!-- userMap是Map<String, String>類型數(shù)據(jù) -->
<property name="userMap">
<map>
<entry key="adc" value="def"></entry>
<!-- 如果Map的鍵值對(duì)均為引用類型到腥,那么要使用如下標(biāo)簽進(jìn)行注入
<entry key-ref="adc" value-ref="def"></entry>
-->
</map>
</property>
<!-- properties是一個(gè)Properties類型數(shù)據(jù) -->
<property name="properties">
<props>
<prop key="adc">123456</prop >
<prop key="adc">fkgj</prop >
</props>
</property>
</bean>
注解詳解
- @Component和@Controller、@Service蔚袍、@Repository三個(gè)注解功能完全一致左电,只不過(guò)后三個(gè)一般分別用于web層,service層和dao層页响,更能起到表意作用。
- @Autowired用于字段的依賴注入段誊,當(dāng)spring容器中只有某類的一個(gè)bean時(shí)闰蚕,可以單獨(dú)使用。
@Qualifier結(jié)合@Autowired按名稱給字段注入
@Resource(name = “bean_id”)相當(dāng)于@Qualifier和@Autowired(“bean_id”)配合使用 - @Value 注入普通值屬性连舍,通常Value的值會(huì)使用${…}表達(dá)式
- @Scope 設(shè)置bean是僅創(chuàng)建單個(gè)對(duì)象還是可以創(chuàng)建多個(gè)對(duì)象没陡。
- @PostConstruct設(shè)置bean的初始化方法,作用等同于配置文件中的init-methond="…"
- @PreDestroy設(shè)置bean的銷毀方法,作用等同于配置文件的destory-methond="…"
總結(jié)
歡迎關(guān)注公眾號(hào):前程有光盼玄,領(lǐng)取一線大廠Java面試題總結(jié)+各知識(shí)點(diǎn)學(xué)習(xí)思維導(dǎo)+一份300頁(yè)pdf文檔的Java核心知識(shí)點(diǎn)總結(jié)贴彼! 這些資料的內(nèi)容都是面試時(shí)面試官必問(wèn)的知識(shí)點(diǎn),篇章包括了很多知識(shí)點(diǎn)埃儿,其中包括了有基礎(chǔ)知識(shí)器仗、Java集合、JVM童番、多線程并發(fā)精钮、spring原理猛铅、微服務(wù)彭则、Netty 與RPC 、Kafka仪或、日記幼东、設(shè)計(jì)模式臂容、Java算法、數(shù)據(jù)庫(kù)根蟹、Zookeeper脓杉、分布式緩存、數(shù)據(jù)結(jié)構(gòu)等等娜亿。