Spring註解方式和配置文件方式的混用

1.註解方式和配置文件方式的混用:
    1.配置文件方式 : 用於配置對象的創建 
        <beans>
            <!--開啓掃描-->
            <context:component-scan base-package="需要掃描註解的包名"></context:component-scan>
            <!--配置對象-->
            <bean id="對象在框架中的名稱" class="要被創建對象那個類的全類名"></bean>            
        </beans>
    2.註解方式 : 用於搭建對象之間的引用關係 @Resource(name="被引用對象的名字")
    
2.aop的實現方式動態代理:
    1.使用JDK動態代理,針對有接口的情況,
    2.使用cglib動態代理,針對沒有接口的情況;

3.代理工廠類做的事情:
    當你給動態代理工廠一個需要被代理的對象 target 時,動態代理工廠用Proxy的API給你動態創建一個代理對象proxy,並且會同時給
    這個代理對象綁定了一個invoke()方法(ps:這個invoke()方法是在一個 Invocation 類中定義的),這個invoke方法有何特
    點呢? 1.因爲代理對象 proxy 是工廠給你的,這個invoke()方法也是工廠給你綁定的,所以,這個invoke()方法可以監聽到你在
    什麼時候,調用了這個代理 proxy 的哪個方法 method(),所以一旦你調用代理的某個方法,馬上就會被invoke()方法監聽到,它可以馬上
    獲得當前被調用的方法 method() 的對象 Method,以及調用方法的代理對象 proxy ,還有你調用方法時傳入的參數 Object[] params ;
    當然,此時你也可以獲得被代理的對象 target(實際操作中是讓代理工廠實現了Invocation接口,那麼invoke()方法也在代理類中,所以在創
    建代理類時通過構造傳參,將對象target傳過去),那麼此時此刻,你可以在invoke(),方法中直接 用你獲得的method對象,傳入被代理的對象
    target 和 參數 params,這樣就完成了通過代理對象 proxy 調方法,實現了 目標對象 target 的相應方法被調用,但是,但是,如果你一旦
    在invoke()方法中寫點兒其他東西,比如說:你在 Method 對象invoke之前或者之後 做了一些其他的操作,那麼這就意味着,此時此刻,你用
    代理調用方法,不僅意味着目標對象target的相應方法被調用,而且同時執行了其他操作,這個就是動態代理實現了功能的增強;
    
    
4.在spring框架中 , 屬性注入方式:
    1.在xml中配置:
        1.屬性注入<property name="" name=""(或者ref="")></property> ,需要bean類有setter,getter方法
            ps:可以用P名稱空間來替代,看起來更簡潔,但是相對不夠直觀,用得不多;
        2.構造方法注入 <constructor-arg index="0" value=""></constructor-arg>
                       <constructor-arg index="1" value=""></constructor-arg>, 需要有相應構造方法;
            ps:可以用C名稱空間來替代,看起來更簡潔,但是相對不夠直觀,用得不多;    
            
    2.註解方式配置(如果修飾屬性,可以不用提供setter ,getter方法)
        1.簡單屬性注入: @value(值)
        2.針對屬性是bean類型的注入:        
            1.@autowired() 默認是按類型匹配 ,可以和    @Qualifier(value="") 配合使用;在類型有多個匹配時,按名稱匹配
            2.@Resource(name="") 按名稱匹配;
        3.注意:@Value @Autowired它們可以修飾屬性,也可以修飾setter方法,如果寫在屬性上,就不需要提供setter方法。    

5.bean註冊到spring容器(工廠)管理中(註解方式):
    1.首先要開啓註解掃描: 我們在applicationContext.xml文件中使用了一個標籤    <context:annotation-config />,
        它代表的是可以使用spring的註解,但是我們在類上添加的註解,spring不知道位置。要解決這個問題,
        我們可以使用<context:component-sacn base-package=””>

    2.@Component    
    3.在spring2.5後爲@Component添加了三個衍生的註解
        @Repository 用於DAO層
        @Service 用於service層
        @Controller  用於表現層
        
        
6.Spring在web開發中的應用
    1.在web項目中要使用spring需要導入一個jar包    
    2.在web.xml文件中配置Listener
        這個ContextLoaderListener它實現了ServletContextListener
        在這個listener中,當服務器啓動時,將ApplicationContext對象,其實是它的一個實現類
        WebApplicationContext,對象存入到了ServletContext中。
    3.我們還需要在web.xml文件中配置applicationContext.xml文件的位置
        默認情況下會在WEB-INF目錄 下查找applicationContext.xml
        如果applicationContext.xml文件不是在默認位置,我們可以在web.xml文件中配置    

        Classpath:applicationContext.xml 它代表的是在當前工程的類路徑下(可以理解成是在src)下來查找applicationContext.xml文件。
        contextConfigLocation它是在listener中聲明的一個常量,描述的就是spring配置文件的位置。
        
        
7. ssh三大框架整合之後的流程 (網上搜的)
 1. 服務器啓動,啓動時加載web.xml,通過spring監聽器加載對應的spring配置,將配置(或配置)好的bean實例化,放入到spring容器之中。
 2. 在加載spring配置文件時,會對應的加載spring配置文件中的hibernate映射文件,
 3. 瀏覽器端發送請求,通過struts2的過濾器(cleanUpFilter..DispatcherFilter核心),找到對應的actionMapper,判斷請求是否爲action請求
 4. 如果是action請求,便會在struts2-spring容器中查找對應名字的action實例(如果不是action實例,便會直接調用jsp等其他資源作爲響應)。
 5.action實例會調用Action類中對應的方法,該方法中會調用對應的service中的業務邏輯方法來響應,action會找到spring容器中對應的service實例,
    通過setter方法來注入到action中。
 6.同樣,service實例中需要的dao也會以同樣的方式注入到service中。之後完成對應的數據庫操作。
 當然在中間會調用struts2的攔截器,這個攔截器調用的時機沒有變化。
 可以根據自己的理解來敘述。

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