Spring-AOP-注解方式

本文介绍如何使用注解方式在Spring框架中配置AOP(面向切面编程),包括使用@Component和@Aspect注解来定义切面,@Pointcut定义切入点,@Before进行前置通知等。并讲解了如何解决JDK动态代理与CGLIB动态代理的冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注解方式开发aop:

从哪入手:

从XML入手,加入DI解析器和IOC注解解析器

@Component---贴在类上面的注解:主要的功能是把这个类的对象注入到Spring IOC容器中

@Autowired---贴在想要获取的对象,主要的功能是Sping IOC容器中获取想要的对象

那么问题来了,AOP怎么配置呢?

首先在增强方法类上配置一个@@Aspect--切面(相当于一个增强的方法)

然后在方法里面加入一个  @Aspect  注解

 

@Component  //<bean id="transcations" class="Transcations.Source_Transcation"/>

@Aspect   //1.<aop:aspect ref="transcations" >

public class Source_Transcation {

//2.<aop:pointcut  id="TX_Area" expression="execution(* Spring_StaticPoxy_Service.*Service.*(..))"/>

@Pointcut("execution(* Spring_StaticPoxy_Service.*Service.*(..))")

  public void TX_Area() {//id="TX_Area",上面的ID和方法名一致之后,AOP的配置和这个方法的功能也就一致了。

        ^

}           |   

            |

            |

@Before("TX_Area()")// 3.在需要的方法上贴上对应的注解和对哪些方法做增强的方法名,

public void openSource(JoinPoint joinpoint) {

System.out.println("--------代理对象---------"+joinpoint.getThis().getClass());

System.out.println("--------真实目标对象---------"+joinpoint.getTarget().getClass());

System.out.println("--------被增强方法的参数---------"+Arrays.toString(joinpoint.getArgs()));

System.out.println("---------连接点的签名--------"+joinpoint.getSignature());

System.out.println("--------当前连接点的类型---------"+joinpoint.getKind());

System.out.println("--------开启事物---------");

}

在使用注解的时候,需要注意⚠️:1,注解本身,2.被贴的程序,3.第三方赋予注解相应的功能

现在 我们在配置AOP的注解的时候  缺少了第三步骤,

<!-- AOP的注解解析器 -->

<aop:aspectj-autoproxy/>

如果显示报错:but was actually of type 'com.sun.proxy.$Proxy24'

说明jdk的动态代理和CGLIB的动态代理冲突,

怎么办呢?

在AOP注解中添加 一个设置:

<!-- false:class com.sun.proxy.$Proxy25- JDK 的动态代理 -->

<!-- true:  EmployeeServiceIMPL$$EnhancerBySpringCGLIB$$6e5536f5 CJLIB的动态代理 -->

<aop:aspectj-autoproxy proxy-target-class="true"/>使用CJLIB的动态代理

默认是false,使用的是JDK的动态代理

还有一个小细节要注意:就是当没有接口的时候使用CGLIB的时候,在AOP中的增强对象中的语句指向的是接口改成指向类,还有就是在Spring连接池中获取类的bean对象  而不是接口的bean对象。

@Pointcut("execution(* Spring_StaticPoxy_Service.*Service.*(..))")---对应的是接口

@Pointcut("execution(* Spring_StaticPoxy_Service.*ServiceIMPL.*(..))")--对应的是类

还有就是获取的bean对象的时候  

@Autowired

public IEmployeeService service;--接口的bean对象

@Autowired

public EmployeeServiceIMPL service;--没有接口的bean对象

 

Spring是非常的智能,当我们有接口的时候  通过配置既可以使用CGLIB的动态代理 也可以使用JDK的动态代理

没有接口的时候  使用CGLIB的动态代理

源码百度云盘自取:链接:https://pan.baidu.com/s/15-r83NPYylzqkjGBl6urwg  密码:2682

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值