天天看點

Spring(一)---IOC思想

引言

當下最火的架構,莫不是Spring全家桶了,而Spring架構在業務層有兩個非常重要的思想,IOC和AOP. 這邊,我先記錄下我對Spring架構IOC的一些了解.

簡單介紹

老規矩,看一下百度百科.

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.引用

Spring(一)---IOC思想

DI依賴注入的實作

Spring(一)---IOC思想

IoC:是一個大的思想,将某件事情(對象建立權利等)的控制前交給第三方管理。

DI:還是IoC的思想,将對象依賴注入權利交給第三方管理。

簡單舉例來說,就是Service通過IOC建立,而Service 裡面的DAO 通過DI注入進去.

Spring工廠

ApplicationContext直譯為應用上下文,是用來加載Spring架構配置檔案,來建構Spring的工廠對象,它也稱之為Spring容器的上下文對象,也稱之為Spring的容器。

ApplicationContext 隻是BeanFactory(Bean工廠,Bean就是一個java對象) 一個子接口.

前面一直說我們把建立對象的權利交給了Spring工廠,那麼Spring工廠又是什麼呢?

Spring(一)---IOC思想

這時候不禁想問,為什麼不用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(一)---IOC思想

注意:在spring中預設值是singleton(單例),也就是說一個spring容器中,隻能有一個對象的執行個體.

Bean的注入

簡單來說,bean的注入就是給一個對象指派.有三種方式:

Spring(一)---IOC思想
  1. 第一種:構造器參數注入

    我們舉一個執行個體: new Car(Sring id,Sring name,Double price),以下是applicationContext.xml的寫法:

    Spring(一)---IOC思想
  2. 第二種:setter方法屬性注入(setter方法的規範-JavaBean規範),這邊舉一個執行個體:

    new Person(Integer id,String name,Car car),配置如下:

    Spring(一)---IOC思想
  3. 第三種:接口注入

    這個就不放出執行個體了,有興趣的朋友可以留言,或者自己去查找相關資料~

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

繼續閱讀