码迷,mamicode.com
首页 > 编程语言 > 详细

Spring-AOP

时间:2020-05-04 00:21:52      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:version   viso   ati   group   value   编写   artifact   weave   引用   

导入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>

技术图片

Spring-AOP

标签:version   viso   ati   group   value   编写   artifact   weave   引用   

原文地址:https://www.cnblogs.com/rzkwz/p/12824820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!