Spring AOP 淺析

AOP (Aspect-Oriented Programming,面向切面的編程),它是能夠經過預編譯方式和運行期動態代理實如今不修改源代碼的狀況下給程序動態統一添加功能的一種技術。它是一種新的方法論,它是對傳統OOP編程的一種補充。spring

OOP是關注將需求功能劃分爲不一樣的而且相對獨立,封裝良好的類,並讓它們有着屬於本身的行爲,依靠繼承和多態等來定義彼此的關係,屬於縱向擴展;express

AOP是但願可以將通用需求功能從不相關的類當中分離出來,可以使得不少類共享一個行爲,一旦發生變化,沒必要修改不少類,而只須要修改這個行爲便可。屬於橫向擴展編程

例如:幾乎全部的業務類中都會有記錄日誌的代碼,可是記錄日誌的代碼嚴格意義上講又不屬於這些對象的行爲,同時也會產生大量的重複代碼,此時應該考慮將記錄日誌的代碼提煉出來,引入AOP。spring-mvc

新建一個切面類mvc

package com.test.ssm.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class TestAspect {
 
    public void doBefore(JoinPoint jp) {
        System.out.println("TestAspect doBefore  結束執行方法 :" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
    }

   public void doAfter(JoinPoint jp) {
        System.out.println("TestAspect doAfter  開始執行方法 :" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());
    }

}

包含兩個方法,doBefore和doAfter,分別在注入的方法執行開始和執行結束時運行spa

新建一個aop.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" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.0.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
                            http://www.springframework.org/schema/aop
                            http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
                            http://www.springframework.org/schema/aop/spring-aop.xsd ">
    <aop:config>
        <aop:aspect id="TestAspect" ref="aspectBean">
            <aop:pointcut id="businessService" expression="execution(* com.test.ssm.aop.service.*.*(..))" />
            <aop:before pointcut-ref="businessService" method="doBefore"/>
            <aop:after pointcut-ref="businessService" method="doAfter"/>
        </aop:aspect>
    </aop:config>
    <bean id="aspectBean" class="com.test.ssm.aop.TestAspect" />
    <bean id="bService" class="com.test.ssm.aop.service.BServiceImpl"></bean>
</beans>

在aop.xml中,將TestAspect和BServiceImpl連個類注入到Spring日誌

package com.test.ssm.aop.service;

public class BServiceImpl {

    public void doSomeThing(String _msg) {
        System.out.println("BServiceImpl doSomeThing msg : " + _msg);
    }
}

在須要調用BServiceImpl的地方使用:code

ApplicationContext ctx = new ClassPathXmlApplicationContext("aop.xml") ;
BServiceImpl ss = ctx.getBean(BServiceImpl.class);
ss.doSomeThing("dsfds");

運行結果以下:xml

image

能夠看到,執行BServiceImpl的doSomeThing方法時,aop自動會注入改方法,並記錄方法執行開始和結束的日誌。

相關文章
相關標籤/搜索