Spring中AOP和IOC深刻理解

                                    spring框架

 

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

Spring IOC:spring

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

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

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

  01.架構app

  

02.引入的Jar包框架

03.接口及其實現類代碼dom

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配置ide

<?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織入。

相關文章
相關標籤/搜索