当前位置: 首页 > Web前端 > HTML5

使springAOP生效不一定要加@EnableAspectJAutoProxy注解

时间:2023-04-05 19:27:45 HTML5

springAOP生效不需要加@EnableAspectJAutoProxy注解.springframework.stereotype.Service;/***@date2022/8/915:28*/@ServicepublicclassUserServiceimplementsUs{@OverridepublicvoidsaveUser(Useruser){System.out.println("保存用户对象到数据库:"+user);方面类,LogAspect.javapackagecom.my.template.aop;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.AfterReturning;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Before;importorg.aspectj.lang.annotation.Pointcut;importorg.springframework.stereotype.Component;/***@date2022/8/1114:12*/@Component@Aspectpublic类LogAspect{@Pointcut("execution(*com.my.template.service.UserService.*(..))")publicvoidpointCut(){}@Before(value="pointCut()")publicvoidbefore(JoinPointjoinPoint){System.out.println("方法执行前-20220816");}@AfterReturning(value="pointCut()")publicvoidafter(JoinPointjoinPoint){System.out.println("方法执行后-20220816");}}测试的controllerUserController.javapackagecom.my.template.controller;importcom.my.template.entity.User;importcom.my.template.service.Us;importcom.my.template.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;导入org.springframework.web.bind.annotation.RequestMapping;导入org.springframework.web.bind.annotation.RestController;/***@date2022/8/915:35*/@RestControllerpublicclassUserController{@Autowiredprivate我们;@RequestMapping("/saveUser")publicStringsaveUser(){用户user=newUser();user.setId("1");user.setName("张三");us.saveUser(用户);返回“成功”;}}sprinboot的启动类,BootServer.javapackagecom.my.template;导入org.springframework.boot.SpringApplication;导入org.springframework.boot.autoconfigure.SpringBootApplication;导入org.springframework.context.annotation.EnableAspectJAutoProxy;导入org.springframework.context.annotation.ImportResource;/***启动类*@date2022/6/321:32*/@SpringBootApplication()publicclassBootServer{publicstaticvoidmain(String[]args){try{SpringApplication.run(BootServer.class);}catch(异常e){e.printStackTrace();}}}测试结果如下,2022-08-1622:30:44.082INFO25716---[nio-9099-exec-1]o.s.web.servlet.DispatcherServlet:Completedinitializationin6ms之前的方法是executed-20220816将用户对象保存到数据库中:User{name='张三',id='1'}方法执行后-20220816从上面的测试结果看,没有@EnableAspectJAutoProxy注解,但是AOP是起作用的,为什么?2、为什么不加@EnableAspectJAutoProxy切面生效。这个问题我排查了好久,终于在dependencies中找到了原因。查看pom文件pom.xml<模型版本>4.0.0org.examplespringTemplate<版本>1.0-快照<属性>88org.springframework.bootspring-boot-starter-web2.3.3.RELEASEorg.examplecustomer-spring-boot-starter1.0-SNAPSHOTorg.aspectjaspectjweaver1.8.13org.springframework.bootspring-boot-maven-plugin重新打包依赖中有一个spring-boot-starter-web的依赖,有如下依赖,会引入spring-boot-autoconfigure这个是自动装配的依赖,就是会读取它下面的spring.factories文件。该文件中有如下配置。是的,是因为AopAutoConfiguration类的问题。下面就来看看具体原因吧。3、原因分析要看具体原因。我们必须打开AopAutoConfiguration类才能看到它。我们先看注解。该注解说AopAutoConfiguration等价于@EnableAspectJAutoProxy注解,即该类的作用与@EnableAspectJAutoProxy相同。关于这个类的注解,重点关注@ConditionalOProperty注解中的内容,意思是如果配置文件中有“spring.aop.auto”配置,如果没有配置为true,否则可以配置作为假。现在我的配置文件server.port=9099spring.datasource.type=com.mysql.cj.jdbc.MysqlDataSourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource里没有这个配置项..driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.username=yh_devspring.datasource..password=DvpJe2xspring.datasource.url=jdbc:mysql://10.0.0.37:3306/channel_center#?????my.customer.name=hellomy.customer.code=autoconfiguration然后我现在添加这个配置,设置为false,server.port=9099spring.datasource.type=com.mysql.cj.jdbc.MysqlDataSourcespring.datasource.driver-类名=com.mysql.cj.jdbc.Driverspring.datasource..driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.username=yh_devspring.datasource..password=DvpJe2xspring.datasource.url=jdbc:我的ql://10.0.0.37:3306/channel_center#??????my.customer.name=hellomy.customer.code=autoconfigurationspring.aop.auto=false重启服务后,查看测试结果,可以从测试结果springAOP没有生效。现在给启动类加上@EnableAspectJAutoProxy注解,看看测试结果。从上面的测试结果可以看出,springAOP注解@EnableAspectJAutoProxy已经被添加了。综上所述,在springboot环境下,由于存在spring-boot-autoconfigure依赖,默认会注入AopAutoConfiguration配置类,相当于@EnableAspectJAutoProxy注解,所以这种情况下,@EnableAspectJAutoProxy注解可以省略,而AopAutoConfiguration可以通过spring.aop.auto属性来控制;4、本文总结主要分析了springboot环境下没有@EnableAspectJAutoProxy注解springAOP依然生效的问题。保险期间请添加@EnableAspetJAutoProxy注解。AopAutoConfiguration类相当于@EnableAspectJAutoProxy注解;spring.aop.auto=ture/false属性可以控制AopAutoConfiguration类是否生效;欢迎关注我的公众号:打码的老贾,回复“领取”送《Java面试》信息,阿里,腾讯,字节,美团,饿了么等。