引言
當下最火的架構,莫不是Spring全家桶了,而Spring架構在業務層有兩個非常重要的思想,IOC和AOP. 這邊,我先記錄下我對Spring架構IOC的一些了解.
簡單介紹
老規矩,看一下百度百科.

其實說明白了 ,就是通過配置,将以前手動new對象的執行個體化過程,交給Spring 架構.當項目啟動的時候,Spring架構中的,管理所有Bean的Spring容器會啟動,幫我們自動初始化建立我們所需要的Bean,這邊就稱為IOC.當我們要調用對象的時候,直接注入即可.
**重點内容:**IOC底層其實就是反射!!!
IOC控制反轉實作
一般分為兩步:
1.配置檔案
我這邊簡單舉例說明:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 将dao交給spring管理 -->
<bean id=userDao class="cn.ding.spring.UserDaoImpl">
</beans>
2.引用
DI依賴注入的實作
IoC:是一個大的思想,将某件事情(對象建立權利等)的控制前交給第三方管理。
DI:還是IoC的思想,将對象依賴注入權利交給第三方管理。
簡單舉例來說,就是Service通過IOC建立,而Service 裡面的DAO 通過DI注入進去.
Spring工廠
ApplicationContext直譯為應用上下文,是用來加載Spring架構配置檔案,來建構Spring的工廠對象,它也稱之為Spring容器的上下文對象,也稱之為Spring的容器。
ApplicationContext 隻是BeanFactory(Bean工廠,Bean就是一個java對象) 一個子接口.
前面一直說我們把建立對象的權利交給了Spring工廠,那麼Spring工廠又是什麼呢?
這時候不禁想問,為什麼不用BeanFactory直接操作呢?
其實ApplicationContext對BeanFactory做了一些擴充
- 事件傳遞
- Bean自動裝配
- 各種不同應用層的Context實作
Spring工廠的兩種擷取方式
- 如果applicationContext.xml 在 src下, ClassPathXmlApplication讀取
- 如果applicationContext.xml 在WEB-INF下,FileSystemXmlApplicationContext讀取
IOC裝配Bean—XML方式講解
執行個體化bean有四種方式:
1. 無參數構造器 (最常用)
2. 第二種 靜态工廠方法
3. 執行個體工廠方法
4. FactoryBean方式。(源碼底層用的多)
* BeanFactory和FactoryBean的差別?*
BeanFactory(ApplicationContext):是一個工廠(其實是建構了一個spring上下文的環境,容器),用來管理和擷取很多Bean對象,
FactoryBean:是一個Bean生成工具,是用來擷取一種類型對象的Bean,它是構造Bean執行個體的一種方式。
Bean的作用域
注意:在spring中預設值是singleton(單例),也就是說一個spring容器中,隻能有一個對象的執行個體.
Bean的注入
簡單來說,bean的注入就是給一個對象指派.有三種方式:
-
第一種:構造器參數注入
我們舉一個執行個體: new Car(Sring id,Sring name,Double price),以下是applicationContext.xml的寫法:
Spring(一)---IOC思想 -
第二種:setter方法屬性注入(setter方法的規範-JavaBean規範),這邊舉一個執行個體:
new Person(Integer id,String name,Car car),配置如下:
Spring(一)---IOC思想 -
第三種:接口注入
這個就不放出執行個體了,有興趣的朋友可以留言,或者自己去查找相關資料~
spEL表達式
spEL(Spring Expression Language)是一種表達式語言,它是spring3.x版本的新特性。
它的作用是:支援在運作時操作和查詢對象,其文法類似統一的EL語言,但是SpEL提供了額外的功能,功能更強大。
文法: #{…} , 引用另一個Bean 、屬性、 方法
SpEL表達式的使用功能比較多,Bean操作相關的通常有:
1. #{beanid} 引用Bean(具體對象)
2. #{beanId.屬性} 引用Bean的屬性
3. #{beanId.方法(參數)} 調用Bean的方法
IOC容器裝配Bean—基于注解的配置方式
掃描機制
這邊想要引用注解,必須開啟包掃描,讓spring架構知道,哪些包下面有注解需要去掃描
<context:componet-scan base-package="xxx.xxx"/>
依賴注入的注解
1.簡單類型的注入: @Value:适用于簡單類型注入
@Value=("jack")
String name;
2.複雜類型注入:
注解實作屬性依賴注入,将注解加在setXxx方法上 或者 屬性定義上 !(任選其一,省代碼了)
Spring和web內建
可以發現 如果每次程式運作,我們都手動去new ClassPathXmlApplicationContext(),然後獲得Bean,很麻煩. 而且spring容器是一個大對象,建立的時候要占用許多資源,是以,我們應該将其綁定到web Servlet 容器中,讓Web容器來管理Spring容器的建立和銷毀。
其實這個操作對我們來說非常簡單,就是在web.xml中配置一個Spring 容器的監聽器,當web Servlet 啟動,自動幫我們一次性建立spring 容器,初始化所有的Bean對象.當web Servlet 關閉,關閉掉我們的spring容器即可.
總結
相信通過這篇文章 ,大家也能像我一樣對Spring 容器,IOC 思想有了初步的認識.我上傳了部分資料,關于Spring 基礎和源碼,大家如果需要可以自行下載下傳.
連結: https://pan.baidu.com/s/1pNspgin 密碼: zg97