設計模式(五) 注解方式實現AOP


1.1、

    Aop  aspect object programming  面向切面編程

                    功能: 讓關注點代碼與業務代碼分離!

            關注點,

                  重復代碼就叫做關注點;

            切面,

                   關注點形成的類,就叫切面()

                   面向切面編程,就是指 對很多功能都有的重復的代碼抽取,再在運行的時候往業務方法上動態植入“切面類代碼”。

            切入點,

                  執行目標對象方法,動態植入切面代碼。

                  可以通過切入點表達式,指定攔截哪些類的哪些方法; 給指定的類在運行的時候植入切面類代碼。

 

代碼示例如下:

UserDao  目標對象

 

package com.murong.aop;

import org.springframework.stereotype.Component;

/**
 * 目標對象
 */
@Component // 加入IOC容器
public class UserDao
{
    public void save()
    {
        System.out.println("-----核心業務:保存!!!------");
    }
}

 

Aop  切面類

package com.murong.aop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 *切面類
 */
@Component // 加入IOC容器
@Aspect
public class Aop
{
    @Pointcut("execution(* com.murong.aop.UserDao.*(..))")//切入點
    public  void testPointCut(){

    }
    @Before("testPointCut()")
    public void begin()
    {
        System.out.println("事務開啟123");
    }//關注點代碼

    @After("testPointCut()")
    public void end()
    {
        System.out.println("事務結束456");
    }//關注點代碼
}

ApplicationContext  sping配置文件

<?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: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/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd"
       default-autowire="byType">

    <!-- 開啟注解掃描 -->
    <context:component-scan base-package="com.murong.aop"></context:component-scan>

    <!--開啟注解掃描-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>



</beans>

App  測試類

package com.murong.aop;

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

public class App
{
    private ApplicationContext ac = new ClassPathXmlApplicationContext("com/murong/aop/applicationContext");
    @Test
    public void test()
    {
        UserDao dao = (UserDao) ac.getBean("userDao");
        dao.save();
    }
}

使用總結:

步驟:

1) 先引入aop相關jar文件 aspectj  aop優秀組件)

spring-aop-3.2.5.RELEASE.jar   【以spring3.2版本jar為例

aopalliance.jar   spring2.5源碼/lib/aopalliance

aspectjweaver.jar   spring2.5源碼/lib/aspectj】或【aspectj-1.8.2\lib

aspectjrt.jar   spring2.5源碼/lib/aspectj】或【aspectj-1.8.2\lib

注意: 用到spring2.5版本的jar文件,如果用jdk1.7可能會有問題。

需要升級aspectj組件,即使用aspectj-1.8.2版本中提供jar文件提供。

2 bean.xml中引入aop名稱空間(文件頭引入)

  

3) 開啟aop注解

    如上圖。

4) 使用注解

@Aspect 指定一個類為切面類

@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")  指定切入點表達式

@Before("pointCut_()") 前置通知: 目標方法之前執行

@After("pointCut_()") 后置通知:目標方法之后執行(始終執行)

@AfterReturning("pointCut_()")     返回后通知: 執行方法結束前執行(異常不執行)

@AfterThrowing("pointCut_()") 異常通知:  出現異常時候執行

@Around("pointCut_()") 環繞通知: 環繞目標方法執行

 


免責聲明!

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



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