zoukankan      html  css  js  c++  java
  • Spring-AOP

    导入maven依赖

    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.0.0.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    

    编写service接口

    public interface UserService {
        void add();
        void delete();
        void update();
        void selete();
    }
    

    service实现类

    public class UserServiceImpl implements UserService {
    @Override
    public void add() {
        System.out.println("添加用户");
    }
    @Override
    public void delete() {
        System.out.println("删除用户");
    }
    @Override
    public void update() {
        System.out.println("修改用户");
    }
    @Override
    public void selete() {
        System.out.println("查询用户");
    }
    

    }

    编写日志

    public class Log implements MethodBeforeAdvice {
        //method 要执行的目标对象方法
        //args 参数
        //target 目标对象
        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
        }
    }
    

    //这个与前者多了一个return 返回值
    public class AfterLog implements AfterReturningAdvice {
        //returnValue:返回值
        @Override
        public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
            System.out.println("执行了"+method.getName()+"返回的结果为"+returnValue);
        }
    }
    

    编写appliactionContext.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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--1.注册bean-->
        <bean id="userService" class="com.rzk.service.UserServiceImpl"/>
        <bean id="log" class="com.rzk.log.Log"/>
        <bean id="afterlog" class="com.rzk.log.AfterLog"/>
        <bean id="interlog" class="com.rzk.log.InterLog"/>
        <!--方式一  使用原生Spring API接口-->
        <!--配置aop-->
        <aop:config>
        <!--切入点 execution:表达式, execution(要执行的位置  * 修饰符 * 返回值 * 类名 * 方法名 * 参数),  UserServiceImpl.*(意思是这个类下所有的方法), 方法还有不一样的参数(..)-->
        <aop:pointcut id="pointcut" expression="execution(* com.rzk.service.UserServiceImpl.*(..))"/>
    
        <!--执行环绕增加! advice-ref:引用上面的 bean的log,pointcut-ref切入到 pointcut这个方法里面-->
        <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
        </aop:config>
    </beans>
    

    第二种自定义aop实现方式

    新建一个diy类

    package com.rzk.diy;
        public class DiyPointCut {
        public void before(){
            System.out.println("=========方法执行前=========");
        }
        public void after(){
            System.out.println("=========方法执行后=========");
        }
    }
    

    在applicationContext.xml加入

        <!--第二种方法比较明确:指定哪个类,进行切入-->
    <bean id="diy" class="com.rzk.diy.DiyPointCut"/>
    <aop:config>
        <!--自定义切面  ref  要引用的类-->
        <aop:aspect ref="diy">
            <!--切入点-->
            <aop:pointcut id="point" expression="execution(* com.rzk.service.UserServiceImpl.*(..))"/>
            <!--通知:也就是要执行什么方法   这里method里面的before就是上面注册bean里面的方法-->
            <aop:before method="before" pointcut-ref="point"/><!--在 point之后执行该方法-->
            <aop:after method="after" pointcut-ref="point"/>
        </aop:aspect>
    </aop:config>
    

    第三种注解aop实现方式

    新建类

    @Aspect//标注这个类是切面
    public class AnnotationPointCut {
    @Before(" execution(* com.rzk.service.UserServiceImpl.*(..))")
    public void before(){
        System.out.println("======方法执行前======");
    }
    @After("execution(* com.rzk.service.UserServiceImpl.*(..))")
    public void after(){
        System.out.println("======方法执行后======");
    }
    //在环绕增强中,我们可以给定一个参数,代表我们要获取出来切入的点
    @Around("execution(* com.rzk.service.UserServiceImpl.*(..))")
    public void around(ProceedingJoinPoint jp) throws Throwable {
        System.out.println("环绕前");
    
        Signature signature = jp.getSignature();//获得签名
        System.out.println("signature"+signature);
    
        //执行方法
        Object proceed = jp.proceed();
        System.out.println("环绕后");
    }
    

    applicationContext.xml

        <!--方式三-->
        <bean id="annotationPointCut" class="com.rzk.diy.AnnotationPointCut"/>
        <!--开启注解支持 aop的-->
        <aop:aspectj-autoproxy/>
  • 相关阅读:
    haar特征(转)
    《统计学习那些事》转
    假设空间与概念空间(版本空间)
    opencv入门指南(转载)
    C++ 中的指针、引用以及函数调用中的问题
    关于python中的module
    Bugzilla 使用指南
    创新方法培训 学习总结
    集成产品开发-IPD简介
    SVN之文件同步更新
  • 原文地址:https://www.cnblogs.com/rzkwz/p/12824820.html
Copyright © 2011-2022 走看看