Spring源码2-SpringAOP解析
前言
SpringAOP面向切面编程是通过预编译方式和运行其动态代理,实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,是OOP面向对象编程的有效补充。利用AOP技术将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不会影响业务逻辑的代码,实现了解耦,提高了代码的灵活性和可扩展性。
一句话:AOP: aspect oriented programming 面向切面编程,针对同一类问题的统一处理方式。
SpringAOP简单切面实用
举个简单实例:
需求:用户登录系统调用接口,记录访问次数(暂不考虑是否同一个人问题),最终注解方式
1、定义一个统计访问注解,注意:我这里是通过接口注解方式调用我们的切面接口
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface UserStatisticsAnnotation { }
2、业务功能上添加注解
@Override @UserStatisticsAnnotation public List<UserVO> queryUserList(List<String> userIds) { return userServiceDao.queryUserList(userIds); }
3、设计切面统计功能
/** * AOP切面配置类 */ @Slf4j @Configuration @Aspect public class AOPConfig { @Pointcut(value = "@annotation(com.example.demo.annotation.UserStatisticsAnnotation)") public void pointCut() { } @Before("pointCut()") public void before() { log.info("当前系统功能访问量加1》》"); // 这里就可以实现自己的业务逻辑功能 } }
4、以上3步,基本上就定义好了切面内容以及什么时候使用,那么接下来就是交个Spring容器管理启用切面注解
@SpringBootApplication @MapperScan("com.example.demo.dao") @EnableAspectJAutoProxy public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
SpringAOP源码解析
主要依据@EnableAspectJAutoProxy注解,相关源码解析参考如下博文:
本文来自博客园,作者:chch213,转载请注明原文链接:https://www.cnblogs.com/chch213/p/16320437.html