1 What is the IOC 踏志?
IOC(Inversion Of Control):即控制反轉丽猬,也被稱為依賴注入宿饱。控制反轉就是應用本身不負責依賴對象的創(chuàng)建和維護脚祟,將對象的創(chuàng)建和維護交給外部容器處理谬以。這樣應用的控制權就交給了外部容器,控制權的轉移就是控制反轉由桌,目的是為了獲得更好的維護性以及降低耦合度为黎。
2 Why use IOC ?
IOC 容器可以用來管理應用對象的配置和生命周期行您,配置每個對象的創(chuàng)建和銷毀铭乾,也可以配置每個 bean 是只有一個實例,還是每次需要時都生成一個新的實例(即singleton or prototype)娃循,以及它們是如何相互關聯(lián)的炕檩。
3 How to use IOC
3.1 環(huán)境搭建
【1】 導入 Spring 核心 jar 文件(最好使用版本 3.0+)
commons-logging-1.1.3.jar 日志
spring-beans-3.2.5.RELEASE.jar bean節(jié)點
spring-context-3.2.5.RELEASE.jar spring上下文節(jié)點
spring-core-3.2.5.RELEASE.jar spring核心功能
spring-expression-3.2.5.RELEASE.jar spring表達式相關表
【2】核心配置文件:applicationContext.xml / bean.xml
bean.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
【3】一個簡單的 IOC 容器的獲取
1 創(chuàng)建 User.class
class User{
private Integer id;
private String name;
setter .... getter
}
2 bean.xml 配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user" class="cn.acey1.User"></bean>
</beans>
3 獲取 IOC 容器中的 User 對象
public class test{
@Test
public void testAc() throws Exception {
// 得到IOC容器對象
ApplicationContext ac = new ClassPathXmlApplicationContext("cn/acey1/bean.xml");
// 從容器中獲取bean
User user = (User) ac.getBean("user");
System.out.println(user);
}
}
3.2 bean 節(jié)點的說明
在 IOC 容器中存在多個 bean ,每個 bean 都對應著一個對象捌斧,當需要獲取該對象時笛质,直接從 IOC 容器中取。bean 節(jié)點中的幾個屬性說明
<bean id=" "
class=" "
scope=“ ”
lazy-init=“ ”
init-method=“ ”
destroy-method=“ ”
/>
- id : 在 IOC 容器中每個 bean 都對應著一個標示即id
- class:id 對應的類
- scope:創(chuàng)建方式捞蚂,默認是 singleton
- singleton:單例经瓷,在容器啟動之前就創(chuàng)建 bean,在整個應用只有一個
- prototype:多例洞难,在用到對象的時候就創(chuàng)建,整個應用中存在多個
- lazy-init:是否延遲創(chuàng)建(只對 singleton 有效)揭朝,默認是 false
- false:不延遲創(chuàng)建队贱,在啟動的時候就創(chuàng)建
- true:延遲創(chuàng)建,在使用到的時候在創(chuàng)建
- init-method:在對象創(chuàng)建時執(zhí)行該方法潭袱,該方法必須在該類中存在
- destory-method :當容器銷毀時執(zhí)行的方法柱嫌,該方法必須在該類中存在
3.3 對象創(chuàng)建的幾種方式
【1】使用無參構造器
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user" class="cn.acey1.User"></bean>
</beans>
【2】使用有參構造器
User.class
public class User{
public User(int id , String name){
...
}
}
bean.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user" class="cn.acey1.User">
<constructor-arg index="0" type="int" value="100"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" value="Acey">
</constructor-arg>
</bean>
</beans>
【3】工廠類創(chuàng)建:靜態(tài)和非靜態(tài)
UserFactory.class
public class UserFactory{
//實例方法創(chuàng)建 User
public User getUser(){
return new User();
}
//靜態(tài)方法創(chuàng)建 User
public static User getStaticUser(){
return new User();
}
}
bean.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- #實例創(chuàng)建 -->
<!-- 先創(chuàng)建工廠 -->
<bean id="factory" class="cn.acey1.UserFactory"></bean>
<!-- 在創(chuàng)建user對象,用factory的實例方法 -->
<bean id="user" factory-bean="factory" factory-method="getUser"></bean>
<!-- #靜態(tài)方法創(chuàng)建 -->
<!--
class 指定的就是工廠類型
factory-method 一定是工廠里面的“靜態(tài)方法”
-->
<bean id="user" class="cn.acey1.UserFactory" factory-method="getStaticUser"></bean>
</beans>
3.4 對象關系依賴(依賴注入)
【1】通過構造函數(shù)注入
【2】通過 set 方法注入
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 基本類型注入 -->
<bean id="user" class="cn.acey1.User">
<property name="id" value="1">
<property name="name" value="Acey">
</bean>
<!-- 引用類型注入 -->
<bean id="str" class="java.lang.String">
<constructor-arg value="Acey"></constructor-arg>
</bean>
<bean id="user" class="cn.acey1.User">
<property name="name" ref="str">
</bean>
</beans>
【3】p 名稱空間注入(優(yōu)化) Spring3.0+支持
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="str" class="java.lang.String">
<constructor-arg value="Acey"></constructor-arg>
</bean>
<bean id="user" class="cn.acey1.User" p:ref-name="str"></bean>
</beans>
【4】注解
使用步驟:
- 引入 context 名稱空間
xmlns:context="http://www.springframework.org/schema/context"
- 開啟注解掃描
<context:component-scan base-package="cn.Acey"></context:component-scan>
- 使用注解
- @Component 把指定的對象加入 IOC 容器
- @scope("[ prototype / singleton]") 創(chuàng)建方式(多例/單例(default))
- @Repository 作用同 @Component屯换,一般在持久層使用
- @Service 作用同 @Component编丘,一般在業(yè)務層使用
- @Controller 作用同 @Component与学,一般在控制層使用
- @Resource 屬性注入
<!--持久層--!>
@Repository(value="userDao")
//等價于<bean id="userDao" class="cn.acey1.UserDao"></bean>
或者
@Repository //如果不指定 value 值,那么默認的 bean 名字為該類名嘉抓,其中類名的首字母小寫
public class UserDao{
...
}
<!--業(yè)務層--!>
@Service
public class UserService{
@Resource(name="userDao") //如果不指定 name 值索守,那么默認值就為屬性名
private UserDao userDao;
}
<!--控制 層--!>
@Controller
@scope("prototype")//多例模式
public class UserAction{
}
所有實例代碼地址 https://github.com/Aceysx/SpringDemo