前面我们说了AOP底层是使用代理模式进行实现,spring写的接口是通过代理反射,实现方法,然后定义切入点:
springAOP接口定义的方法有:被加强的方法前执行,被加强的方法后执行,出错了执行,在执行时执行等。。。
 
实现spring的指定接口,spring底层用这个结构反射代理,进行加强。
另外一种使用自定义切面:
自定义方法(在被加强方法的什么时间段):
ublic class SqlCheckTime {
    public void front() {
        System.out.println(LocalDateTime.now());
    }
    public void behind() {
        System.out.println(LocalDateTime.now());
    }
}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
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
">
    <bean id="UserDaoImpl" class="com.quxiao.dao.impl.UserDaoImpl"></bean>
    <!--    <bean id="addAppcontion" class="com.quxiao.aop.addAppcontion"></bean>-->
    <!--    <aop:config>-->
    <!--        <aop:pointcut id="pointcut" expression="execution(* com.quxiao.dao.impl.UserDaoImpl.*(..))"/>-->
    <!--        <aop:advisor advice-ref="addAppcontion" pointcut-ref="pointcut"></aop:advisor>-->
    <!--    </aop:config>-->
    <bean id="SqlCheckTime" class="com.quxiao.aop.SqlCheckTime"></bean>
    <aop:config>
        <!--                切面-->
        <aop:aspect ref="SqlCheckTime">
            <!--            切入点-->
            <aop:pointcut id="point" expression="execution(* com.quxiao.dao.impl.UserDaoImpl.*(..))"/>
            <!--            执行方法-->
            <aop:after method="front" pointcut-ref="point"></aop:after>
            <aop:before method="behind" pointcut-ref="point"></aop:before>
        </aop:aspect>
    </aop:config>
</beans>这个方法就简便多了,不过第一种它的能力更强,只要实力足够,自己可以完全自定义实现如何AOP,本人菜苔一根,一个类都没看懂。。。。
另外有一种是用的注解完成:
还是那句话,懒人推进科技的进步,上面的都繁琐,为了简便,注解又产生了:
package com.quxiao.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
/**
 * @program: fxspring
 * @author: quxiao
 * @create: 2023-05-12 10:44
 **/
@Component
//标记该类可以使用aop
@Aspect
public class checkAge {
    @Before("execution(* com.quxiao.dao.impl.UserDaoImpl.*(..))")
    public void check1() {
        System.out.println("检查一下年龄");
    }
    @Around("execution(* com.quxiao.dao.impl.UserDaoImpl.add(..))")
    public String check2(ProceedingJoinPoint point) {
        String proceed = "";
        try {
            System.out.println("环绕前");
            proceed = (String) point.proceed();
            System.out.println("环绕后");
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        return "失败!";
    }
}
方法上有好几个注解:执行前,执行后,环绕。
当让,还是要在xml中注册,当然也是可以注解用springconfig配配置,
环绕方法:
这个方法是将被加强的方法完全取出来,等待调用proceed才执行,可以拿出方法返回值,如果不放回,那么这个方法就没有返回值了。给一个默认值,引用类型就是null,基本数据类型就是它们自己的默认值。(8条消息) Java中8种基本数据类型及其默认值_byte的默认值_爱写代码的小菜鸡的博客-CSDN博客



















