1. 程式人生 > >Spring基礎(imooc)

Spring基礎(imooc)

-a 切面 直接 實體 -c private 一行代碼 做的 imp

Spring基礎

Keywords

控制反轉IOC:程序員不自己去new實例,而是交由Spring去構建實例,並且統一放在IOC容器當中由Spring進行管理。

依賴註入DI:即註入,由Spring將構建出的實例註入到需要使用這個對象的類當中。

要讓實例被構建並被交給Spring的IOC容器統一管理的幾種實現方式:(大序號表示實例的構建方式,小序號代表bean的註入方式)

一、Spring註入方式:通過在xml當中定義bean,並且配置加載ApplicationsContext的方式,分為兩種,在xml當中定義了bean元素,並在其中設置了id屬性以及class屬性。

a) 在使用到這個bean的類中加入同名屬性,並且寫出setter方法。

b) 在使用這個bean的類中加入同名屬性,並且在這個類的構造器當中,有對這個屬性的賦值操作

二、采用註解方式與自動掃描:例如直接在java代碼當中使用SpringMVC框架下的:@Component元註解或者其定義的三大註解 @Service(用於Service層) @Controller(用於Controller類) @Repository(用於Dao層),之後不需要在xml當中顯式的配置bean了,直接配置一個掃描,Spring會自動去構建這些類的實例

a) 使用@Autowired註解,直接從IOC容器當中拿到實例,@Autowired使用的三種方式

i. 在成員變量上

ii. 在setter函數上,函數內部對成員變量賦值

iii. 在構造器上使用,構造器對成員變量賦值

b) @Required只能放在setter上

c) @Resource註解:使用規則基本上與@Autowired相同,@Resource 註解的特點是根據bean的id進行匹配,而@Autowired可以根據bean的類型進行匹配,詳見第12點

三、註解方式:避免繁瑣的XML配置,直接在java代碼當中使用註解。包括@Configuration @Bean @Import @DependsOn。@Bean通常搭配@Configuration使用,等價於XML當中的bean元素與beans元素的配置項,代碼如下

此時如果沒有指定@Bean的name屬性,則默認是函數名為這個bean的id

配置文件的引入,引入主要分為了在xml中定義bean的方式和在java代碼中使用註解,詳見第10點

1 內容梗概

Spring框架圖

核心容器:

Bean

Core核心包和工具

Context上下文

SpEL (Spring表達式)

2 框架

3 接口、IOC容器

接口的概念

一個例子,Junit測試

4 IOC容器的初始化

IOC容器的初始化:ApplicationContext本身就是保存bean對象的容器,故容器本身的初始化,就是通過一系列的配置,將ApplicationContext進行初始化。

而配置ApplicationContext有三種方式:

一、使用classpath

二、使用本地文件系統中某個文件地址

三、(SpringMVC)web應用中用servlet類或者Listener類來初始化IOC容器

5 XML中定義Bean的註入與在XML當中自動裝配

即容器在啟動後會開始加載bean的配置,並完成bean的初始化。當bean被構建出來之後,將這些bean賦值到需要使用到的類當中去,這個過程就是註入 。

常用的兩種註入方式詳解:

設值註入:此時在InjectionServiceImpl這個類當中,必須有屬性 injectionDAO ,同時也要有該屬性的set方法,此時這個XML做的事情是創建一個InjectionDAOImpl類的對象並通過set賦值給injectionDAO屬性

必須在InjectionServiceImpl當中有一個injectionDAO的屬性

並且通過InjectionServiceImpl的構造器,進行InjectionDAO類型的賦值,將這個對象賦值給屬性injectionDAO

自動裝配

即在beans元素當中添加一個屬性,default-autowire=”byName”。此時就不用在bean的定義當中定義嵌套加入property這個元素了,所有的嵌套bean加在將會自動完成

自動裝配的幾種方式

6 Resources(針對資源文件的統一接口)

ResourceLoader


所有的 ApplicationContext都實現了 ResourceLoader 接口,故只要獲取到一個ApplicationContext體系的類就可以使用這個 getResource()這個函數了

使用getResource函數時的幾種前綴

這裏,直接實現 ApplicationContextAware接口,這裏面有 ApplicationContext的setter函數,所以可以直接註入 ApplicationContext的對象 applicationContext,可以用它來調用getResource()函數

以上就是通過 aware接口來調用 getResource() 函數的方法

7 使用註解方式來構建Bean

jdk1.5之後,使用註解可以將Bean註入到上下文的IOC容器中

Spring下將Bean註入到容器中:

@Service @Repository @Controller

以上三種都是由元註解@Component定義得到的,放在類之上

而@Autowired則是放在類的內部的屬性之上,表示從IOC容器中獲取到註入的Bean,並使用

基礎典型配置

自動檢測時的配置

Spring下,annotation-config 和 component-scan的不同:

先說,annotation-config的工作模式:其本身是不管類的註入的,即使用者需要首先通過某種方式將類註入到IOC容器當中(例如使用XML配置的方式,或者其他註入方式)。之後使用這個配置,對已經註入的Bean進行下一步的管理,用於“激活”Bean,讓已經註入了的Bean開始工作

而說到component-scan的工作方式,其本身有著和annotation-config一樣的作用,同時它還需要掃描指定包下的類,看是否存在由元註解 @Component定義的類,如果有,則將其也同時註入到IOC容器當中

搭配過濾器使用掃描

Bean的作用域(Scope)

1.singleton單例模式,

  全局有且僅有一個實例

2.prototype原型模式,

  每次獲取Bean的時候會有一個新的實例

3.request

request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效

8 Autowired註解

Autowired比Required更常用

特點:既可以用在成員變量上;又可以用在set函數上

@Autowired使用的三種方式:

1 放在成員變量上,直接註入

2 成員先聲明,之後設置一個set函數,在set函數上使用@Autowired

3 在構造器內,對成員變量賦值,並且在構造器上用@Autowired進行定義

除了常見的Component元註解定義的三種註解外,其他的接口也可以通過註解的方式定義

對於接口類型,其實現類如果被@Component等關鍵字定義之後,則此時,如果存在接口本身的一個集合類,則會順序註入該接口所有實現類的對象。List和Map皆是

如果需要順序,則還可在實現類上采用關鍵字@Order進行註入,規定實現類對象被註入的順序,例如

@Order(1)

@Order(2)

9 @Bean註解的使用

bean的名稱=@Bean去註入的方法的名稱

即,此時的bean的name為:myService

.

10 配置文件的引入

XML中定義bean的方式

java代碼中使用註解的方式

使用@Configuration註解,將ConfigFile構建為bean

此時,只需要在xml的配置中指明 properties 靜態文件的位置即可

使用 @ImportResource和@Value註解進行資源文件讀取,註解方式

一個小坑:註意在使用@Value註入值的時候,如果是@Value(“${username}”),此時取的是當前操作系統的操作者名。為了區分所以一般使用@Value(“${jdbc.username}”)

11 @Bean和@Scope

12 @Resource與@Autowired

@Resource 和@Autowired都可以寫在setter上或者寫在字段上

二者不同之處在於:

l @Autowired屬於Spring,默認按照類型裝配

l @Resource屬於J2EE,按照名稱進行裝配

按照名稱查找和通過類型查找的不同點

private UserDao userdao

名稱查找:通過該userdao屬性名稱在容器中查找id為userdao的bean

類型查找:在容器中查找類型為UserDao類型的bean的實體

@Resource註解在字段上和在setter函數上的註入規則

1 @Resource()在字段上:

  1. 先使用字段名匹配到bean,查找到bean則註入,類型不匹配則報異常,註入失敗
  2. 如果字段名沒有匹配到bean,則Spring會嘗試采用字段類型匹配,找到則進行註入,但是,可能由於字段類型是一個接口,此時會有多個匹配,返回多個bean的異常,註入失敗

2 @Resource在setter上

  1. 同樣還是先使用屬性名字進行bean的匹配,查找到bean則註入,如果類型不匹配則此時有異常,註入失敗
  2. 這一點有所不同,如果屬性名沒有匹配到bean,則Spring采用類型匹配,但是此時根據的是屬性名入參的類型,找到bean則進行註入。同理,如果本身是接口類型,則可能找到多個匹配,此時直接返回多個bean的異常,註入失敗

private UserDao userdao

@Resource

private void setUserDao(Dao dao){

this.userdao=dao;

}

此時,首先查找是否存在名字為userdao的bean;如果沒有,則繼續查找IOC容器中是否存在類型為Dao的bean,而並不是屬性本身的類型

13 Aware

Aware的方式是如果你的類中需要Spring框架本身的一些資源,這時你肯定不能夠自己去初始化那些資源然後通過屬性註入或者構造器註入的方式進行依賴註入,所以Spring提供了這種方式由Spring框架為你註入

Spring提供各種Aware接口。常見的有:

BeanFactoryAware

BeanNameAware

ApplicationContextAware

BeanClassLoaderAware

Spring AOP

1 概念

穿插在各個子功能模塊當中的切面,在修改代碼時,不需要深入到各個模塊中修改源碼,省事

2 基於aspect配置的切面

3 切入點pointcut

申明pointcut

執行所有的方法

單一的方法匹配

4 advice 通知的應用

通知的配置

前置通知

後置通知

throwing指定可被傳遞的異常屬性的參數名

最終通知

5 Introductions應用

將切面定義一個父類接口,並且配置該實現類

6 Advisor

7 AOP API

Pointcut的實現類之一

afterthrowing 和 after只能執行一個

afterreturning一般是方法結束前的最後一行代碼,無論方法是否正常結束,無論是否拋出異常都會執行after當中的代碼

所有基於配置文件的aspect只支持單例模式

Spring基礎(imooc)