Spring框架 aop操作的注解方法 基于aspectj的自动注解aop方法 抽取相同的value="execution(public void cn.itcast.f_aspect.CRUD.*())"

首先是在xml配置文件中配置好对象,然后开启aop的注解方法——即<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

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: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">
    <!-- 开启注解扫描——对象和属性 -->
    <context:component-scan base-package="com.swift"></context:component-scan>

    <bean id="book" class="com.swift.Book"></bean>
    <bean id="adviceBook" class="com.swift.AdviceBook"></bean>

    <!-- 开启aop注解方法 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    <!-- 这是xml 配置文件中aop操作的方法留下对比 
     <aop:config> <aop:pointcut expression="execution(* com.swift.Book.*())" id="pointcut1"/>
<aop:aspect ref="adviceBook"> <aop:before method="before" pointcut-ref="pointcut1"/>
<aop:after-returning method="after" pointcut-ref="pointcut1"/>
<aop:around method="around" pointcut-ref="pointcut1"/> </aop:aspect>
   </aop:config>
--> </beans>

上面有原来xml配置aop的方法,这时已经不用了,用作参考

被增强的类及方法,代码如下:

package com.swift;

public class Book {
    public String fun() {
        System.out.println("This is Book's fun()..............");
        return "This is Book's fun()..............";
    }
}

用于增强的类及方法,代码如下:

package com.swift;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class AdviceBook {
    @Before(value="execution(* com.swift.Book.*(..))")
    public String before() {
        System.out.println("This is AdviceBook's before()...............");
        return "This is AdviceBook's before()...............";
    }
    @AfterReturning(value="execution(* com.swift.Book.*(..))")
    public String after() {
        System.out.println("This is AdviceBook's after()...............");
        return "This is AdviceBook's after()...............";
    }
    @Around(value="execution(* com.swift.Book.*(..))")
    public String around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        
        System.out.println("This is AdviceBook's front()...............");
        
        proceedingJoinPoint.proceed();
        
        System.out.println("This is AdviceBook's end()...............");
        return "This is AdviceBook's around()...............";
    }
    
}

类的上边用@Aspect表示切面

方法前用@Before(value="表达式") 其中表达式与之前配置方法相同

最后测试类,代码如下:

package com.swift;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

import com.swift.Book;
@WebServlet("/test")
public class ServleTest extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public ServleTest() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("Served at: ").append(request.getContextPath());
        ApplicationContext context=new ClassPathXmlApplicationContext("aop.xml");
        Book book=(Book)context.getBean("book");
        //这个返回值,反复试验得出最后浏览上只输出This is AdviceBook's around().
        response.getWriter().append(book.fun());
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

其实就一句

response.getWriter().append(book.fun());

网页上返回值为around()中返回值,console控制台得到前后包围所有增强的输出。

如下图:

 =============================================================================================

重新整理上边内容

package cn.itcast.f_aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class Myadvice {
    
    @Before(value="execution(public void cn.itcast.f_aspect.CRUD.*())")
    public void before() {
        System.out.println("之前-->开启事务");
    }
    @Around(value="execution(public void cn.itcast.f_aspect.CRUD.*())")
    public void round(ProceedingJoinPoint proceedingJoinPoint) {
        System.out.println("之前-->开启事务");
        try {
            proceedingJoinPoint.proceed();
            System.out.println("没有异常,之后-->提交事务");
        } catch (Throwable e) {
            System.out.println("出现异常,之后--回滚事务");
        }finally {
            System.out.println("有无异常都执行,之后-->关闭事务");
        }
        
    }
    @AfterReturning(value="execution(public void cn.itcast.f_aspect.CRUD.*())")
    public void afterReturning() {
        System.out.println("没有异常,之后-->提交事务");
    }
    @After(value="execution(public void cn.itcast.f_aspect.CRUD.*())")
    public void after() {
        System.out.println("有无异常都执行,之后-->关闭事务");
    }
    @AfterThrowing(value="execution(public void cn.itcast.f_aspect.CRUD.*())")
    public void afterThrowing() {
        System.out.println("出现异常,之后--回滚事务");
    }
}

发现每句中的内容一样,如何抽取 value="execution(public void cn.itcast.f_aspect.CRUD.*())"



posted @ 2017-11-23 17:09  Advancing-Swift  阅读(563)  评论(0编辑  收藏  举报