Spring 框架的 AOP代码实现

本文内容纲要:

- Spring 框架的 AOP

- 第一种方式

- 方式二单纯切入

- 方式三注解aop

- 测试类

Spring 框架的 AOP

第一种方式

接口

package com.yms.service;

/**

  • @Author 杨明书
  • @PackageName: com.yms.service
  • @ClassName: UserService
  • @Description:
  • @Date: 2021/12/30 10:43

    */

    public interface UserService {

    void insert();

    void delete();

    void update();

    void query();

    }

实现类

package com.yms.service.impl;

import com.yms.service.UserService;

/**

  • @Author 杨明书

  • @PackageName: com.yms.service.impl

  • @ClassName: UserServiceImpl

  • @Description:

  • @Date: 2021/12/30 10:45

    */

    public class UserServiceImpl implements UserService {

    @Override

    public void insert() {

    System.out.println("增减了一个用户");

    }

    @Override

    public void delete() {

    System.out.println("删除了一个用户");

    }

    @Override

    public void update() {

    System.out.println("修改了一个用户");

    }

    @Override

    public void query() {

    System.out.println("查询一个用户");

    }

    }

两个日志

package com.yms.log;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**

  • @Author 杨明书

  • @PackageName: com.yms.log

  • @ClassName: Log

  • @Description:

  • @Date: 2021/12/30 10:47

    /

    public class Log implements MethodBeforeAdvice {

    /*

    • @param method 需要执行的方法

    • @param objects 参数

    • @param target 目标对象

    • @throws Throwable

      */

      @Override

      public void before(Method method, Object[] objects, Object target) throws Throwable {

      System.out.println("什么东西呗执行了:"+target.getClass().getName());

      System.out.println("执行了什么方法:"+method.getName());

      }

      }

package com.yms.log;

import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

/**

  • @Author 杨明书
  • @PackageName: com.yms.log
  • @ClassName: AfterLog
  • @Description:
  • @Date: 2021/12/30 10:53

    */

    public class AfterLog implements AfterReturningAdvice {

    @Override

    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {

    System.out.println("执行的方法为:"+method.getName());

    System.out.println("返回的结构为" + returnValue);

    }

    }

配置文件

<!--    注册bean-->

<bean id="userServiceImpl" class="com.yms.service.impl.UserServiceImpl"></bean>

<bean id="log" class="com.yms.log.Log"></bean>

<bean id="afterLog" class="com.yms.log.AfterLog"></bean>

<!-- 方式一-->

<!-- 配置aop,需要导入aop的约束-->

<aop:config>

<!-- 切入点expression="execution()"-->

<aop:pointcut id="pointcut" expression="execution(* com.yms.service.impl.UserServiceImpl.*(..))"/>

<!-- 执行环绕增强 -->

<aop:advisor advice-ref="log" pointcut-ref="pointcut"></aop:advisor>

<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"></aop:advisor>

</aop:config>

<!-- 方式二-->

<bean id="div" class="com.yms.div.DivPointCut"/>

<aop:config>

<!-- 定义切面,ref引用切面-->

<aop:aspect ref="div">

<aop:pointcut id="point" expression="execution(* com.yms.service.impl.UserServiceImpl.*(..))"/>

<aop:before method="before" pointcut-ref="point"/>

<aop:after method="after" pointcut-ref="point"/>

</aop:aspect>

</aop:config>

<!-- 方式三-->

<bean id="annotationPointCut" class="com.yms.div.AnnotationPointCut"/>

<!-- 开启注解支持-->

<aop:aspectj-autoproxy/>

方式二单纯切入

package com.yms.div;

/**

  • @Author 杨明书

  • @PackageName: com.yms.div

  • @ClassName: DivPointCut

  • @Description:

  • @Date: 2021/12/30 11:18

    */

    public class DivPointCut {

    public void before(){

    System.out.println("方法执行之前==");

    }

    public void after(){

    System.out.println("方法执行后====");

    }

    }

方式三注解aop

package com.yms.div;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

/**

  • @Author 杨明书

  • @PackageName: com.yms.div

  • @ClassName: AnnotationPointCut

  • @Description:

  • @Date: 2021/12/30 11:32

  • 使用注解的方式进行aop

  • @Aspect 标注这个类为一个切面

    /

    @Aspect

    public class AnnotationPointCut {

    @Before("execution( com.yms.service.impl.UserServiceImpl.*(..))")

    public void before(){

    System.out.println("-----------------------方法执行前---------------------");

    }

    @After("execution(* com.yms.service.impl.UserServiceImpl.*(..))")

    public void after(){

    System.out.println("-----------------------方法执行后---------------------");

    }

    /**

    • 环绕挣钱中,我们可以给定一个参数,代表我们

      /

      @Around("execution( com.yms.service.impl.UserServiceImpl.*(..))")

      public void around(ProceedingJoinPoint jp) throws Throwable {

      System.out.println("环绕前");

      System.out.println("获得签名:"+jp.getSignature());

      //执行方法

      Object proceed = jp.proceed();

      System.out.println("环绕后");

      System.out.println(proceed);

    }

}

测试类

import com.yms.service.UserService;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**

  • @Author 杨明书
  • @PackageName: PACKAGE_NAME
  • @ClassName: MyTest
  • @Description:
  • @Date: 2021/12/30 11:07

    */

    public class MyTest {

    public static void main(String[] args) {

    ApplicationContext context = new ClassPathXmlApplicationContext("springApplication.xml");

    //动态代理,代理的是接口

    UserService userServiceImpl = (UserService) context.getBean("userServiceImpl");

    userServiceImpl.insert();

    }

    }

本文内容总结:Spring 框架的 AOP,第一种方式,方式二单纯切入,方式三注解aop,测试类,

原文链接:https://www.cnblogs.com/ymsblog/p/15748204.html

以上是 Spring 框架的 AOP代码实现 的全部内容, 来源链接: utcz.com/z/296687.html

回到顶部