Spring 框架的 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();
    }
    }
上一篇:AOP XML 配置的简单入门


下一篇:AOP练习