JAVA------AOP

2024-01-08 12:19:54

AOP
①提前准备
UserService接口

package com.lichengxun.service;

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

UserServiceImpl类

package com.lichengxun.service;

public class UserServiceImpl implements UserService{
    public void add() {
        System.out.println("执行了add方法");
    }

    public void delete() {
        System.out.println("执行了delete方法");
    }

    public void update() {
        System.out.println("执行了update方法");
    }

    public void select() {
        System.out.println("执行了select方法");
    }
}

②创建log包【方法一】
在其包中创建两个AfterLog和BeforeLog类

import java.lang.reflect.Method;

public class BeforeLog implements MethodBeforeAdvice {
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("[Debug]"+o.getClass().getName()+"执行了"+method.getName());
    }
}
package com.lichengxun.log;

import org.springframework.aop.AfterAdvice;
import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class AfterLog implements AfterReturningAdvice {
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("[Debug]日志调用了"+method.getName()+"方法");
    }
}

【注意点】BeforeLog类需要实现MethodBeforeAdvice接口,AfterLog类需要实现AfterReturningAdvice 接口
③resource目录下创建applicationContext.xml
先在applicationContext.xml中进行注册上面的类的bean

<!--注册bean-->
<bean id="serviceImpl" class="com.lichengxun.service.UserServiceImpl"/>
<bean id="log" class="com.lichengxun.log.log"/>
<bean id="afterLog" class="com.lichengxun.log.AfterLog"/>


<!--方式一:使用原生Spring API接口-->
<!--配置aop:需要导入aop的约束-->
<!--<aop:config>
    &lt;!&ndash;切入点:expression:表达式,execution(要执行的位置!)&ndash;&gt;
    <aop:pointcut id="pointcut" expression="execution(* com.lichengxun.service.UserServiceImpl.*(..))"/>
    &lt;!&ndash;执行环绕增加!&ndash;&gt;
    <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
    <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>-->

②创建diy包【方法二:ZI自定义】
在其包中创建一个diy类

public class diy {
    public void Before(){
        System.out.println("[Debug]===================方法执行前===================");
    }
    public void After(){
        System.out.println("[Debug]===================方法执行后===================");
    }
}

③在resource目录下中的applicationContext.xml中需要注册diy的bean

<bean id="diy" class="com.lichengxun.Diy.diy"/>

<!--方式二:自定义类-->
<!--<aop:config>
    &lt;!&ndash;自定义切面,ref要引用的类&ndash;&gt;
    <aop:aspect ref="diy">
        &lt;!&ndash;切入点&ndash;&gt;
        <aop:pointcut id="point" expression="execution(* com.lichengxun.service.UserServiceImpl.*(..))"/>
        &lt;!&ndash;通知&ndash;&gt;
        <aop:before method="Before" pointcut-ref="point"/>
        <aop:after method="After" pointcut-ref="point"/>
    </aop:aspect>
</aop:config>-->

②在log包下创建annotation类【方法三:注解】

@Aspect
public class annotation {
    @Before("execution(* com.lichengxun.service.UserServiceImpl.*(..))")
    public void before(){
        System.out.println("[Debug]===============方法执行前===============");
    }
    @After("execution(* com.lichengxun.service.UserServiceImpl.*(..))")
    public void after(){
        System.out.println("[Debug]===============方法执行后===============");
    }
    //在环绕增强中,我们可以给定一个参数,代表我们要获取处理切入的点。
    @Around("execution(* com.lichengxun.service.UserServiceImpl.*(..))")
    public void arround(ProceedingJoinPoint jp) throws Throwable {
        System.out.println("环绕前");
        //执行方法
        Object proceed = jp.proceed();
        System.out.println("环绕后");
        Signature signature = jp.getSignature();
        System.out.println(signature);
    }
}

③在resource目录下中的applicationContext.xml中配置相关注解操作

<!--方式三-->
<bean id="ancut" class="com.lichengxun.Diy.annotationPointcut"/>
<!--开启注解支持!  JDK(默认 proxy-target-class="false") cglib(roxy-target-class="true")-->
<aop:aspectj-autoproxy proxy-target-class="false"/>

④测试类

import com.lichengxun.service.UserService;
import com.lichengxun.service.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMy {
    @Test
    public void TestLOG(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //【注意点】动态代理的是接口
        UserService userImpl = context.getBean("serviceImpl", UserService.class);
        userImpl.add();
    }
}

文章来源:https://blog.csdn.net/Thrive_LCX/article/details/135401729
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。