zoukankan      html  css  js  c++  java
  • 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.*())"



  • 相关阅读:
    学习笔记——Maven实战(九)打包的技巧
    学习笔记——Maven实战(八)常用Maven插件介绍(下)
    学习笔记——Maven实战(七)常用Maven插件介绍(上)
    学习笔记——Maven实战(六)Gradle,构建工具的未来?
    学习笔记——Maven实战(五)自动化Web应用集成测试
    在Google的GKE上创建支持Internal Load Balancer的Service
    Bash命令查找本机公网IP
    Google Cloud IAM中添加自定义域名
    Debian上启用Apache2服务
    Google Cloud VM上在线扩硬盘
  • 原文地址:https://www.cnblogs.com/qingyundian/p/7885872.html
Copyright © 2011-2022 走看看