控制反轉IOC:程序員不本身去new實例,而是交由Spring去構建實例,而且統一放在IOC容器當中由Spring進行管理。java
依賴注入DI:即注入,由Spring將構建出的實例注入到須要使用這個對象的類當中。程序員
要讓實例被構建並被交給Spring的IOC容器統一管理的幾種實現方式:(大序號表示實例的構建方式,小序號表明bean的注入方式)web
1、Spring注入方式:經過在xml當中定義bean,而且配置加載ApplicationsContext的方式,分爲兩種,在xml當中定義了bean元素,並在其中設置了id屬性以及class屬性。app
a) 在使用到這個bean的類中加入同名屬性,而且寫出setter方法。框架
b) 在使用這個bean的類中加入同名屬性,而且在這個類的構造器當中,有對這個屬性的賦值操做函數
2、採用註解方式與自動掃描:例如直接在java代碼當中使用SpringMVC框架下的:@Component元註解或者其定義的三大註解 @Service(用於Service層) @Controller(用於Controller類) @Repository(用於Dao層),以後不須要在xml當中顯式的配置bean了,直接配置一個掃描,Spring會自動去構建這些類的實例工具
a) 使用@Autowired註解,直接從IOC容器當中拿到實例,@Autowired使用的三種方式測試
i. 在成員變量上ui
ii. 在setter函數上,函數內部對成員變量賦值this
iii. 在構造器上使用,構造器對成員變量賦值
b) @Required只能放在setter上
c) @Resource註解:使用規則基本上與@Autowired相同,@Resource 註解的特色是根據bean的id進行匹配,而@Autowired能夠根據bean的類型進行匹配,詳見第12點
3、註解方式:避免繁瑣的XML配置,直接在java代碼當中使用註解。包括@Configuration @Bean @Import @DependsOn。@Bean一般搭配@Configuration使用,等價於XML當中的bean元素與beans元素的配置項,代碼以下
此時若是沒有指定@Bean的name屬性,則默認是函數名爲這個bean的id
配置文件的引入,引入主要分爲了在xml中定義bean的方式和在java代碼中使用註解,詳見第10點
Spring框架圖
核心容器:
Bean
Core核心包和工具
Context上下文
SpEL (Spring表達式)
接口的概念
一個例子,Junit測試
IOC容器的初始化:ApplicationContext自己就是保存bean對象的容器,故容器自己的初始化,就是經過一系列的配置,將ApplicationContext進行初始化。
而配置ApplicationContext有三種方式:
1、使用classpath
2、使用本地文件系統中某個文件地址
3、(SpringMVC)web應用中用servlet類或者Listener類來初始化IOC容器
即容器在啓動後會開始加載bean的配置,並完成bean的初始化。當bean被構建出來以後,將這些bean賦值到須要使用到的類當中去,這個過程就是注入 。
經常使用的兩種注入方式詳解:
設值注入:此時在InjectionServiceImpl這個類當中,必須有屬性 injectionDAO ,同時也要有該屬性的set方法,此時這個XML作的事情是建立一個InjectionDAOImpl類的對象並經過set賦值給injectionDAO屬性
必須在InjectionServiceImpl當中有一個injectionDAO的屬性
而且經過InjectionServiceImpl的構造器,進行InjectionDAO類型的賦值,將這個對象賦值給屬性injectionDAO
自動裝配
即在beans元素當中添加一個屬性,default-autowire=」byName」。此時就不用在bean的定義當中定義嵌套加入property這個元素了,全部的嵌套bean加在將會自動完成
自動裝配的幾種方式
ResourceLoader
全部的 ApplicationContext都實現了 ResourceLoader 接口,故只要獲取到一個ApplicationContext體系的類就可使用這個 getResource()這個函數了
使用getResource函數時的幾種前綴
這裏,直接實現 ApplicationContextAware接口,這裏面有 ApplicationContext的setter函數,因此能夠直接注入 ApplicationContext的對象 applicationContext,能夠用它來調用getResource()函數
以上就是經過 aware接口來調用 getResource() 函數的方法
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內有效
Autowired比Required更經常使用
特色:既能夠用在成員變量上;又能夠用在set函數上
@Autowired使用的三種方式:
1 放在成員變量上,直接注入
2 成員先聲明,以後設置一個set函數,在set函數上使用@Autowired
3 在構造器內,對成員變量賦值,而且在構造器上用@Autowired進行定義
除了常見的Component元註解定義的三種註解外,其餘的接口也能夠經過註解的方式定義
對於接口類型,其實現類若是被@Component等關鍵字定義以後,則此時,若是存在接口自己的一個集合類,則會順序注入該接口全部實現類的對象。List和Map皆是
若是須要順序,則還可在實現類上採用關鍵字@Order進行注入,規定實現類對象被注入的順序,例如
@Order(1)
@Order(2)
bean的名稱=@Bean去注入的方法的名稱
即,此時的bean的name爲:myService
.
XML中定義bean的方式
java代碼中使用註解的方式
使用@Configuration註解,將ConfigFile構建爲bean
此時,只須要在xml的配置中指明 properties 靜態文件的位置便可
使用 @ImportResource和@Value註解進行資源文件讀取,註解方式
一個小坑:注意在使用@Value注入值的時候,若是是@Value(「${username}」),此時取的是當前操做系統的操做者名。爲了區分因此通常使用@Value(「${jdbc.username}」)
@Resource 和@Autowired均可以寫在setter上或者寫在字段上
兩者不一樣之處在於:
l @Autowired屬於Spring,默認按照類型裝配
l @Resource屬於J2EE,按照名稱進行裝配
按照名稱查找和經過類型查找的不一樣點
private UserDao userdao
名稱查找:經過該userdao屬性名稱在容器中查找id爲userdao的bean
類型查找:在容器中查找類型爲UserDao類型的bean的實體
@Resource註解在字段上和在setter函數上的注入規則
1 @Resource()在字段上:
2 @Resource在setter上
private UserDao userdao
@Resource
private void setUserDao(Dao dao){
this.userdao=dao;
}
此時,首先查找是否存在名字爲userdao的bean;若是沒有,則繼續查找IOC容器中是否存在類型爲Dao的bean,而並非屬性自己的類型
Aware的方式是若是你的類中須要Spring框架自己的一些資源,這時你確定不可以本身去初始化那些資源而後經過屬性注入或者構造器注入的方式進行依賴注入,因此Spring提供了這種方式由Spring框架爲你注入
Spring提供各類Aware接口。常見的有:
BeanFactoryAware
BeanNameAware
ApplicationContextAware
BeanClassLoaderAware
穿插在各個子功能模塊當中的切面,在修改代碼時,不須要深刻到各個模塊中修改源碼,省事
申明pointcut
執行全部的方法
單一的方法匹配
通知的配置
前置通知
後置通知
throwing指定可被傳遞的異常屬性的參數名
最終通知
將切面定義一個父類接口,而且配置該實現類
Pointcut的實現類之一
afterthrowing 和 after只能執行一個
afterreturning通常是方法結束前的最後一行代碼,不管方法是否正常結束,不管是否拋出異常都會執行after當中的代碼
全部基於配置文件的aspect只支持單例模式