概念
Spring IOC(Inversion of Control):控制反轉;在傳統的程序設計過程中,當一個程序需要調用另外一個程序來完成功能的時候,通常是調用者來創建被調用者的實例,雖然這樣很簡單也很好理解,但是程序間的耦合性很高,會導致程序越來越臃腫。在Spring中創建被調用者不再是調用者自己來完成,而是利用java的反射機制,通過配置文件或註解來創建實例,因此被稱爲控制反轉。其中創建被調用者的工作由Spring來完成,注入調用者被稱爲依賴注入。
注入方式
1.使用構造方法提供
-
這種注入方式,調用者需要有默認的構造函數
-
xml
<bean id="" class="\調用者路徑\" >
屬性
<constructor-arg name="" value="\被調用者路徑\"></constructor-arg>
</bean>
2.使用set方法提供
- 需要在調用者中有被調用者的set方法,如:
private IAccountDao accountDao;
public void setAccountDao(IAccountDao accountDao) {
this.accountDao = accountDao;
}
- set方法注入
<bean id ="" class "\調用者路徑\">
<property name="" value="\被調用者路徑\"></property>
</bean>
3.註解注入
- 在xml中只需配置Spring創建容器時要掃描的包
<context:componet-scan base-packge=""></context:componet-scan>
創建bean的三種方式
1.使用默認函數
<bean id="" class=""></bean>
2.使用普通工廠的方法
當我們想調用的類存在於jar包中,無法通過修改源碼的方式來提供默認構造函數,此時可以利用一個工廠類。
public class InstanceFactory {
public IAccountService getAccountService(){
return new AccountServiceImpl();
}
}
xml配置
<bean id = "instanceFactory" class = "工廠類路徑"></bean>
<bean id ="" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
3.使用靜態工廠中的靜態方法
public class StaticFactory {
//方法名與xml配置文件中的要一致
public static IAccountService getAccountService() {
return new AccountServiceImpl();
}
}
<bean id="" class="工廠類的路徑" factory-method="getAccountService"></bean>
能注入的數據有三類
1.基本類型和String
<bean id="" class="com.xwj.service.impl.AccountServiceImpl2">
<property name="name" value="Test"></property>
<property name="age" value="19"></property>
</bean>
2.其他bean類型(在配置過程中或註解配置過的bean)
<bean id="" class="com.xwj.service.impl.AccountServiceImpl2">
<property name="birthday" ref="now"></property>
</bean>
3.複雜類型和集合類型
<bean id="accountService3" class="com.xwj.service.impl.AccountServiceImpl3">
<property name="myStrs" >
<array>
<value>AAA</value>
<value>BB</value>
<value>C</value>
</array>
</property>
<property name="myList" >
<list>
<value>AAA</value>
<value>BB</value>
<value>C</value>
</list>
</property>
<property name="mySet" >
<set>
<value>AAA</value>
<value>BB</value>
<value>C</value>
</set>
</property>
<property name="myMap" >
<map>
<entry key="testA" value="AAA"></entry>
</map>
</property>
<property name="myPros" >
<props>
<prop key="testA">ccc</prop>
<prop key="testB">bbb</prop>
</props>
</property>
</bean>
使用註解注入常見的註解
1.@Component(value=“指定id”)
- 作用:把當前類對象存入到Spring容器中。
- 常見的繼承類有@Service,@Controller,@Repository
2.用於注入數據:
- Autowired
- 作用:自動按照類型注入,當容器中有唯一的bean對象類型和要注入的變量類型匹配,就可以注入成功。
- 出現的位置:變量、方法
- @Qualifier
- 作用:在按照類型注入的基礎上,在按照名稱注入,不能單獨給類成員實現注入,但可以給方法參數實現注入
- 屬性:value:用於指定注入bean的id
- @Resource
- 作用:直接按照bean的id注入,可以單獨使用
- 屬性:name:用於指定bean的id
- 以上的三個註解只能對其他的bean類型實現注入,基本類型和String無法使用上述註解實現注入,複雜類型和集合類型必須使用XML實現
- @Value
- 作用:用於注入基本類型和String類型的數據
- 屬性:value:用於指定數據的值
- @Scope
- 作用:用於指定bean的作用範圍
- 屬性:value :singleton(單例),prototype(多例)