Spring入門(四)之AOP

        Spring的AOP,即面向切面編程。aop,一般用於公共的代碼的設置,比如日誌記錄、事務處理等,下面以日記記錄爲例,簡單介紹下,如何配置aop。項目代碼已放入GitHub上:https://github.com/qiuxinfa/spring-study註解版AOP點這裏

1.pom.xml在原有的基礎上,添加aspectj依賴:

        <!--添加aop依賴aspectj-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

2.創建一個業務類:PersonServiceImpl.java

public class PersonServiceImpl{
    public void addPerson() {
        System.out.println("------- addPerson() --------");
    }

    public void getPerson() {
        System.out.println("------- getPerson() --------");
    }
}

3.創建一個切面類:LogAop.java

public class LogAop {

    public void logBefore(){
        System.out.println("方法開始,記錄日誌。。。");
    }

    public void logAfter(){
        System.out.println("方法結束,記錄日誌。。。");
    }
}

4.配置aop,詳細說明,在代碼中,完整配置如下:

<?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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                          http://www.springframework.org/schema/beans/spring-beans.xsd
                          http://www.springframework.org/schema/aop
                          http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--創建目標類,注意:class是實現類的全限定類名,不是接口的,因爲接口不能實例化-->
    <bean id="personServiceImpl" class="com.qxf.service.impl.PersonServiceImpl"></bean>
    <!--創建切面類,這裏就是配置日誌了  -->
    <bean id="myLog" class="com.qxf.aop.LogAop"></bean>

    <!--配置aop,關於切入點表達式:

        第一個*:表示 任意修飾符 任意返回值
        第二個*:表示 任意方法
        參數列表中的2個點:表示 任意參數

     合起來就是:PersonServiceImpl類中所有方法
    -->
    <aop:config>
        <!-- 切入點表達式 -->
        <aop:pointcut expression="execution(* com.qxf.service.impl.PersonServiceImpl.*(..))" id="myPointCut"/>
        <aop:aspect ref="myLog">
            <!-- 配置前置通知,注意 method 的值要和 對應切面的類方法名稱相同 -->
            <aop:before method="logBefore" pointcut-ref="myPointCut"></aop:before>
            <!-- 配置後置通知,注意 method 的值要和 對應切面的類方法名稱相同 -->
            <aop:after-returning method="logAfter" pointcut-ref="myPointCut"/>
        </aop:aspect>
    </aop:config>

</beans>

5.測試

(1)測試代碼

public class AopTest {
    public static void main(String[] args) {
        //加載配置文件,啓動容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //從容器中獲取bean
        PersonServiceImpl personService = context.getBean("personServiceImpl", PersonServiceImpl.class);
        personService.addPerson();
        personService.getPerson();
        //關閉容器
        context.close();
    }
}

(2)測試結果

可以看到,每個方法調用前後,都會執行公共的代碼,進行日誌記錄,這就是aop了。

 

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