Spring中AOP和IOC深入理解


                                    spring框架

 

  Spring框架是由於軟件開發的復雜性而創建的。Spring使用的是 基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限於服務器端的開發。從 簡單性、可測試性和松耦合性的角度而言,絕大部分Java應用都可以從Spring中受益。
◆目的:解決企業應用開發的復雜性
◆功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能
◆范圍:任何Java應用
Spring是一個輕量級 控制反轉(IoC)和 面向切面(AOP)的容器框架。

Spring IOC:

  控制反轉(Inversion of Control,IOC),也被稱為依賴注入(Dependency Injection,DI),是面向對象編程中的一種設計理念

  依賴注入(spring只有set訪問器注入和構造注入):

  1.set訪問器注入(打印機例子)

  01.架構

  

02.引入的Jar包

03.接口及其實現類代碼

package cn.ink;
/*
 * 墨盒接口
 */
public interface Ink {
    public String getColor();
}
package cn.ink;
/*
 * 灰色墨盒類
 */
public class GrayInk implements Ink{

    @Override
    public String getColor() {
        // TODO Auto-generated method stub
        return "灰色墨盒";
    }

}
package cn.ink;
/*
 * 彩色墨盒類
 */
public class ColorInk implements Ink{

    @Override
    public String getColor() {
        // TODO Auto-generated method stub
         return "彩色墨盒";
    }

}
package cn.paper;
/*
 * 紙張接口
 */
public interface Paper {
       public String getContent();
    
}
package cn.paper;
/*
 * A4紙張
 */
public class A4Paper implements Paper{

    @Override
    public String getContent() {
        // TODO Auto-generated method stub
        return  "一張淡定的A4紙";
    }

}
package cn.paper;
/*
 * B5紙張類
 */
public class B5Paper implements Paper{

    @Override
    public String getContent() {
        // TODO Auto-generated method stub
        return  "一張淡定的B5紙";
    }

}
package cn.printer;
/*
 * 打印機類
 */
import cn.ink.Ink;
import cn.paper.Paper;

public class Print {
        private Ink ink;
        private Paper paper;
         public void print(){
                System.out.println("用"+ink.getColor()+"在"+paper.getContent()+"上打印內容");
            }
        public Ink getInk() {
            return ink;
        }
        public void setInk(Ink ink) {
            this.ink = ink;
        }
        public Paper getPaper() {
            return paper;
        }
        public void setPaper(Paper paper) {
            this.paper = paper;
        }
        
}

04.Application.xml配置

<?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">

     <bean id="colorInk" class="cn.ink.ColorInk"/>
   <bean id="grayInk" class="cn.ink.GrayInk"/>
   <!--對Paper的初始化 -->
   <bean id="paper" class="cn.paper.A4Paper"/>
    <!-- 對打印機進行配置-->
    <bean id="printer" class="cn.printer.Print">
       <property name="ink" ref="colorInk"></property> 
       <property name="paper" ref="paper"></property>   
    </bean>
      
    </beans>
    

 

05.測試類

package cn.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.printer.Print;

public class PrintExam {
    @Test
    public void testprint(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Print printer = (Print)context.getBean("printer");
        printer.print();
        
    }

        
    
}

 

  2.接口注入

  3.構造注入

IOC定義和優點

IOC(Inverse of Control)控制反轉是Spring容器的內核,AOP,聲明式事務等功能都是在此基礎上開花結果的。所謂IOC,就是通過容器來控制業務對象之間的依賴關系,而非傳統實現中,由代碼直接控制。這也就是“控制反轉”概念所在;控制權由應用代碼轉到了外部容器,控制權的轉移,就是反轉。控制權轉移帶來的好處就是降低了業務對象之間的依賴程度

二.Spring AOP:

關於為什么要使用AOP,下面這個例子可以很好的解釋。首先,按照軟件重構思想的理念,如果多個類中出現相同的代碼,應該考慮定義一個共同的抽象類,將這些相同的代碼提取到抽象類當中去。比如Horse、Pig、Camel這些對象都有run()、eat()方法,通過引入一個包含這兩個方法抽象的Animal父類,Horse、Pig、Camel就可以通過集成Animal復用到run()和eat()方法。通過引入父類消除多個類中的重復代碼的方式在大多數情況下是可行的,但世界並非永遠這么簡單,比如下面所示的景區管理業務類。

作者:郭無心
鏈接:http://www.zhihu.com/question/19993030/answer/77125144
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。

import com.smart.dao.ViewPointDao;
import com.smart.dao.ViewSpaceDao;
import com.smart.domain.ViewSpace;

/**
 * 景區管理的服務類
 */
public class ViewSpaceService {

    private TransactionManager transManager;
    private PerformanceMonitor pmonitor;
    private ViewSpaceDao viewSpaceDao;
    private ViewPointDao viewPointDao;

    /**
     * 新增一個旅游景區
     *
     * @param viewSpace
     */
    public void addViewSpace(ViewSpace viewSpace) {
        pmonitor.start();
        transManager.beginTransaction();
        viewSpaceDao.addViewSpace(viewSpace);
        transManager.endTransaction();
        pmonitor.end();
    }


    /**
     * 刪除某個景點
     *
     * @param pointId
     */
    public void deleteViewPoint(int pointId) {
        pmonitor.start();
        transManager.beginTransaction();
        viewPointDao.deleteViewPoint(pointId);
        transManager.endTransaction();
        pmonitor.end();
    }

}

其中pmonitor是方法性能監視代碼,它在方法調用前啟動,在方法調用返回前結束,並在內部記錄性能監視的結果信息。其中transManager的代碼是事務開始和事務提交的代碼,我們發現我們的業務代碼淹沒在重復化非業務性的代碼之中,性能監視和事務管理這些非業務性代碼葛藤纏樹搬包圍着業務性代碼。此時我們就不能通過抽象父類的方式消除以上的重復性代碼,因為這些邏輯依附在業務類方法的流程中,它們不能夠轉移到其他地方去。於是產生了AOP這種思想.

  優點:AOP主要是提供另外一種編程思路,可以把類似的行為抽離出來統一處理。

總結補充:

   IOC是解耦,提供一種構造對象的方式,使得一種功能能有多種實現,且不構成依賴。spring 的IOC的缺點:占用內存多、構造對象慢、啟動慢。springAOP是提供一種基於spring框架的切面編程企業級解決方案,雖然這個已經很強大,但是依然還是沒有aspectj強大,比如:目前還不支持流程切面。織入慢執行效率低、不支持new關鍵字創建的對象的切入,必須使用bean factory織入。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM