zoukankan      html  css  js  c++  java
  • Spring(十)AspectJ

    AspectJ是一个面向切面的框架,他扩展了Java

    使用AspectJ实现AOP有两种形式:

    一种是通过注解,一种是通过XML

    第一种:

    接口

    package demo19;
    
    /**
     * Created by mycom on 2018/3/12.
     */
    public interface IUserService {
        public void select();
        public void update();
        public void insert();
        public void delect();
    }

    实现类

    package demo19;
    
    /**
     * Created by mycom on 2018/3/12.
     */
    public class UserServiceimpl implements IUserService {
        public void select() {
            /*int i=2/0;*/
            System.out.println("select  ok!");
        }
    
        public void update() {
            System.out.println("update  ok!");
        }
    
        public void insert() {
            System.out.println("insert  ok!");
        }
    
        public void delect() {
            System.out.println("delect  ok!");
        }
    }

    MyAspect类

    package demo19;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    
    /**
     * Created by mycom on 2018/3/12.
     */
    @Aspect
    public class MyAspect {
        @Pointcut(value = "execution(* demo19.*.update(..))")
        public void update(){
    
        }
    
        @Pointcut(value = "execution(* demo19.*.insert(..))")
        public void insert(){
    
        }
    
    
        @Before("execution(* demo19.*.insert(..))")
        public void myBefore(){
            System.out.println("before===");
        }
    
        /*@AfterReturning("execution(* demo19.*.select(..))")
        public void myAfter(){
            System.out.println("after===");
        }*/
        //环绕增强
        @Around("update()||insert()")
        public void myAround(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("before=====");
            joinPoint.proceed();
            System.out.println("after===");
        }
    
        @AfterThrowing(value = "execution(* demo19.*.select(..))",throwing = "error")
        public void myThrows(Exception error){
            System.out.println("出现异常了"+error);
        }
    
        @After("execution(* demo19.*.select(..))")
        public void myFinally(){
            System.out.println("最终增强");
        }
    }

    配置文件

    <?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"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           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
             http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
    ">
        <!--1.目标对象-->
        <bean id="service" class="demo19.UserServiceimpl"></bean>
    
        <!--2.增强/通知-->
        <bean id="beforeAdvice" class="demo19.MyAspect"></bean>
    
        <!--自动代理-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    
    </beans>

    测试类

    //Aspectj增强   基于注解版的增强
        @Test
        public void t3() {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextAspectj.xml");
            IUserService service =(IUserService) context.getBean("service");
    //        try {
    //            service.select();
    //        }catch (Exception  ex){
    //            ex.printStackTrace();
    //        }
    //        service.delect();
            service.insert();
            service.update();
        }

    第二种:

    接口和实现类和上一种相同,MyAspect类不同

    package demoAspectj;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Pointcut;
    
    /**
     * Created by mycom on 2018/3/12.
     */
    public class MyAspectj {
        // 前置通知
        public void before(){
            System.out.println("前置通知方法before()");
        }
        public void before(JoinPoint jp){
            System.out.println("前置通知方法before()jp="+jp);
        }
    
        // 后置通知
        public void afterReturing(){
            System.out.println("后置通知方法");
        }
        public void afterReturing(String result){
            System.out.println("后置通知方法 result = " + result);
        }
    
    
        // 环绕通知
        public void around(ProceedingJoinPoint pjp) throws Throwable{
            System.out.println("环绕通知方法,目标方法执行之前");
            // 执行目标方法
            Object result = pjp.proceed();
            System.out.println("环绕通知方法,目标方法执行之后");
        }
    
        // 异常通知
        public void afterThrowing(){
            System.out.println("异常通知方法");
        }
    
    
        // 最终通知
        public void after(){
            System.out.println("最终通知方法");
        }
    }

    配置文件

    <?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"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           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
             http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
    ">
        <!--1.目标对象-->
        <bean id="service" class="demoAspectj.UserServiceImpl"></bean>
    
        <!--2.增强/通知-->
        <bean id="myAspectj" class="demoAspectj.MyAspectj"></bean>
    
    
        <!-- aop配置 -->
        <aop:config>
            <aop:pointcut expression="execution(* demoAspectj.*.select(..))" id="doFirstPointcut"/>
            <aop:pointcut expression="execution(* demoAspectj.*.update(..))" id="doSecondPointcut"/>
            <aop:pointcut expression="execution(* demoAspectj.*.insert(..))" id="doThirdPointcut"/>
            <aop:aspect ref="myAspectj">
                <aop:before method="before" pointcut-ref="doFirstPointcut"/>
                <aop:after-returning method="afterReturing" pointcut-ref="doSecondPointcut"/>
                <aop:around method="around" pointcut-ref="doThirdPointcut" />
            </aop:aspect>
        </aop:config>
    
    
    </beans>

    测试方法

    @Test
        public void t2(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContextAspect.xml");
            IUserService service =(IUserService) context.getBean("service");
            service.select();
            service.update();
            service.insert();
        }
  • 相关阅读:
    Maven学习--- 搭建多模块企业级项目
    Spring @Transactional ——事务回滚
    Spring事务异常回滚,捕获异常不抛出就不会回滚
    JVM调优总结(一)-- 堆和栈的基本概念
    Java中常见数据结构:list与map -底层如何实现
    hadoop 2.7.1安装和配置
    Hadoop基本开发环境搭建(原创,已实践)
    Hadoop下添加节点和删除节点
    iOS应用之间跳转
    iOS开发技巧
  • 原文地址:https://www.cnblogs.com/my-123/p/8552229.html
Copyright © 2011-2022 走看看