Spring IOC學習筆記

java 反射機制是IOC的底層實現,IOC是spring容器的內核,AOP,聲明式事務管理都是在此基礎上發展的。

IOC:某一接口具體實現類的選擇控制權從調用類中移除,轉交第三方決定,DI是依賴注入,是和IOC一樣的:
DI:讓調用類對某一接口實現類的依賴關係由第三方注入,以移除調用類對某一接口實現的依賴。
Eg:在演員,劇本,角色中 ,本來演員是直接依賴角色和劇本的,用IOC之後,也就是多出來一個導演,他直接選角色,這樣可
分離劇本和演員。


所謂依賴注入就是指:在運行期間,有外部容器動態地將依賴對象注入到組件中
IOC三種注入方法(屬性注入,構造器注入,接口注入)
  1. setter方法注入,也叫屬性注入方法,是指在類中定義所有演員的setget方法,這樣當某一集是其他角色是可以通過這種方法很好的得到。
<span style="font-size:18px;"><bean id ="用來調用的" class="com.test.spring.Person">
        <property name="name" value="LYW"/>
        <property name="age" value="21"/>
    </bean></span>

<span style="font-size:18px;">public class Direct{   //導演類
     public void direct()
           角色  geli = new 劉德華();  //指定角色的扮演者
           劇本 juben = new 劇本(geli); //注入具體扮演者到劇本
            ..................}}</span>


  1. 使用構造器注入
<span style="font-size:18px;"><bean id="person" class="com.test.spring.Person
        <constructor-arg name="name" value="LYW" />
         <constructor-arg name="age" value="21" />
      </bean></span>

<span style="font-size:18px;">public class Direct{   //導演類
     public void direct()
           角色  geli = new 劉德華();  //指定角色的扮演者
           劇本 juben = new 劇本(); //注入具體扮演者到劇本
           juben.setGeli(geli);//set注入方式
            ..................}}</span>


3.接口注入:將調用類所依賴的方法抽取到一個接口中,調用類通過實現對應的接口提供相應的方法。
     
<span style="font-size:18px;">public interface ActorArrange{  void injectGeLi(GeLi geli) ;}
     public class 劇本implements ActorArrange{   在這裏邊實現injectGeLi方法。}
       public class Direct{   //導演類
     public void direct()
           角色  geli = new 劉德華();  //指定角色的扮演者
           劇本 juben = new 劇本(); 
            jubne.injectGeLi(geli);
            ..................}}</span>

通常,這種方式效果和屬性注入沒有區別,而且還多出來一個接口類,所以不建議使用。


資源加載
spring 設計了一個Resource接口,提供更強的訪問底層資源的能力。有了這個類可以將配置文件寫在任何位置。
  該接口主要的方法:
           boolean exists(): //    資源是否存在
          boolean isOpen()://資源是否打開
          URL getURL()throws IOEXception,File getFile();InputStream getInputStream();getFileName()
該接口對應不同的實現類:
          AbstractResource 接口------->實現類有----》ByteArrayResource  ClassPathResource(類路徑的方式)  FileSystemResource(絕對路徑進行訪問)   ServletContextResource (相對於web根目錄的方式)  UrlResources
..........
還有就是用資源地址表達式

classpath:    -->表示從類路徑中加載,和classpath:/是等價的
classpath*:--->假設有多個相同的jar在一個包中,用這種方法會加載包寫所有的文件,上邊的只會加載第一個
file:      --->使用URLResource從文件系統中加載
http://  ftp:  //--->從WebFTP
沒有前綴的,直接寫:---》根據applicationContext具體實現類採用類對應的Resource


BeanFactory 和ApplicationContext

spring通過配置文件描述bean與bean之間的依賴關係,利用Java語言的反射機制能實例bean並且建立依賴關係,
spring除了這些還提供 了bean實例的緩存,生命週期的管理。bean實例代理,事件發佈,資源轉載等高級服務。


bean工廠,也叫IOC容器(com.springframework.beans.factory.BeanFactory)是spring框架最核心的接口,他提供了高級IOC的配置機制。
BeanFactory使管理不同類型的Java對象成爲可能。BeanFactory面向spring本身
應用上下文也叫spring容器:(com.springframework.context.ApplicationContext),建立在BeanFactory的基礎上,提供更多的面向應用的功能,國際化支持和框架事務。面向的是開發者。

BeanFactory:
BeanFactory接口最常用的實現是:XMLBeanFactory。最主要的方法是:getBean(String name);
BeanDefinitionRegister:spring配置文件中每一個《bean》節點元素在spring容器裏都通過一個BeanDefinition對象表示,它描述了bean的配置信息。而這個類提供了想容器手工註冊BeanDefinition的方法。

初始化BeanFactory


XMLBeanFactory是通過Resource裝載spring配置信息並啓動IOC容器。通過BeanFactory啓動容器時,並不會初始化配置文件中定義的bean,初始化動作發生在第一次調用,對於單例的bean來說,BeanFactory會緩存beans實例,所以第二次調用的時候獲取bean是直接從IOC容器緩存中獲取。
Spring在DefaultSingletonBeanFactory類中提供了一個用於緩存單例bean的緩存器,用HashMap實現的。

ApplicationContext:
ApplicationContext的主要實現類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext前者默認從類路徑加載配置文件,後者從文件系統加載。
ApplicationContext的初始化和BeanFactory的區別:前者要實例化所有單例bean,後者使用的時候纔會實例化

spring支持用註解的方式配置。
@Configuration//表示是一個配置信提供類
@Bean(name="Car") //定義一個bean

spring爲基於註解的配置提供了專門的AnnotationConfigApplicationContext類。

WebApplicationContext是專門爲WEb應用準備的,它允許從web根目錄的路徑中轉載配置文件並完成初始化工作。可以從他中獲得ServletContext的引用。
spring爲WebApplicationContext中的bean提供了三個新的作用域:request,session,global session 而在非WEB下,只有singleton和prototype。

初始化:和上邊兩個不同,因爲WebApplicationContext需要ServletContext實力,所以必須在有web容器的情況下進行實例。
解決的辦法是:在web.xml中配置自啓動的servlet或者定義問容器監聽類(ServletContextListener)
spring分別提供了用於啓動WebApplicationContext的Servlet和web容器監聽器:
<span style="font-size:18px;"><context-param>
     <param-name>contextConfigLocation</>
     <param-value>/WEB_INF/taotaoao.xml</>
</>
<listener>
     <listener-class>aor.springframework.web.context.ContextLoaderListener</>
</></span>




Bean作用域

BeanFactory中bean的生命週期:也會經歷實例化,設置屬性值和返回實例:
如果在<bean scope="prototype">/會將bean返回給調用者,調用者自己管理。
<bean scope="singleton">//容器自己管理,當容器關閉時,將會觸發觸發視頻日你個對其進行管理。

bean 的 配置方式有三種:
基於XMl的,基於註解的,基於java 類的。

Bean的基本配置
<bean id="only" class="">
注意上邊的ID必須是唯一的,而且命名的時候不能出現特殊符號
<bean name="#first,second,third" class>
這種方法可以用多個名字,而且可重複,當重複的時候 返回的是最後聲明的那個,可以出現?等其他字符

注意:javabean關於屬性命名有一個特殊的規定:spring鎖配置中的屬性名都是以小寫字母開頭,要用大寫的話要必須保證要麼前兩個字母是小寫,要麼前兩個字母都大寫
否則會 報錯
<span style="font-size:18px;"><bean id ="" calss="">
     <property name="name" value="guwen">
     <property name="car" ><ref bean =""/></>
       <property>
          <list>
               <value>屬性</><value>屬性2</><value>屬性3</>         
          </>
          <set>
                <value>看包</><value>看包2</><value>看包3</>        
          </>
          <map>
               <entry>
                    <key>hah</><value>hsh</>
               </entry>
          </map>
</property></span>



 自動裝配
<bean id="" class="" autowire="byName/byType/constructor/autodetect">

bean的作用域
singleton:在IOC容器中僅存在一個bean實例,以單例存在,默認情況下,ApplicationContext在加載的時候會實例化所有的bean,
                然後緩存,要想不這樣用     <lazy-init="true">
prototype:每次從容器中調用bean時都返回一個新的實例。
request:每次http請求都會創建一個新的bean,該作用域僅適用於WEBApplicationcontext
session;同一個Http session 共享一個bean,不同http session是不同的bean,該作用域僅適用於WEBApplicationcontext
globalSession:同一個全局Session共享一個bean,該作用域僅適用於WEBApplicationcontext
@Scope可以顯示的在配置作用範圍,

基於註解的配置:

1.使用註解定義bean
@Component,被spring識別,將pojo轉化爲容器管理的bean
在這個的上邊還可以有下面三個:
@Repository:對於DAO實現類的註解
@Service:對Service實現類的註解
@Controller:對Controller實現類的註解

自動裝配bean:
@Autowired進行自動注入,有一個屬性是required:默認是沒有找到bean就拋出NoSuchBeanDefinitionException,要想不拋出用required=false
@Qualifier :指定注入bean的名稱,當有兩個bean時,返回Qualifier中的名稱的bean
@Resource:要求提供一個bean名稱的屬性:
@Inject:和Autowired類似,按照類型匹配注入bean,只是沒有required屬性

基於Java類的配置信息:
javaConfig:是spring的一個子項目,它可以通過Java類的方法提供bean的定義信息;
@Configuration
public class Test{
     @Bean
     public UserDao userDao(){}
     @Bean.......
}

IOC工作流程:
1.ResourceLoader從存儲介質中加載spring的配置信息,並使用Resource表示這個配置文件的資源
2.BeanDefinitionReader讀取Resource所指向的配置文件資源,然後將配置文件中每一個<bean>解析爲一個BeanDefinition對象,並保存到                     BeanDefinitionRegister註冊表中。
3.掃描BeanDefinitionRegister註冊表中的信息,使用Java反射機制自動識別bean工廠處理器的bean,並且進行加工(完成含有佔位符的標籤解析,完成屬性的配置)
4.spring容器從註冊表中取出加工後的BeanDefinition,並進行實例化


下一篇寫AOP,安啦..............

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章