←←←←←←←←←←←← 快!点关注git
看过一些描述关于AOP切面编程的文章,写的太概念化让人很难理解,下面是我本身的理解,但愿能帮到新人,若有错误欢迎指正。github
AOP也跟IOC,OOP这些思想同样它只是一种编程思想。Autofac、Spring.Net、Castle这些组件实现了AOP切面编程思想的框架。AOP说白了就是在运行时,动态的将代码切入到类的指定方法的指定位置上,这种思想就是面向切面的编程思想。sql
若是你发现你的方法中有不少重复的代码就能够考虑用aop来精简代码了。好比说你想监控每一个方法的耗时,按照传统的方法是每一个方法都加上监控代码,若是用AOP思想去解决问题,就能够把跟监控代码放到方法的外面去写。编程
AOP思想的应用场景:缓存
AOP切面有点像拦截器,不过跟拦截器有点区别。架构
这个例子开发环境使用的是.Net Core 3.0,用的AOP框架是Autofac,经过Nuget安装Autofac.Extras.DynamicProxy组件。并发
1.Startup中把BlogCacheAOP切面 切入到Titan.Blog.AppService.dll下全部接口实现里。框架
var servicesDllFile = Path.Combine(basePath, "Titan.Blog.AppService.dll");//获取项目绝对路径 var assemblysServices = Assembly.LoadFile(servicesDllFile); builder.RegisterAssemblyTypes(assemblysServices) .AsImplementedInterfaces() .InstancePerLifetimeScope() .EnableInterfaceInterceptors() .InterceptedBy(typeof(BlogCacheAOP));//AOP切面缓存
2.切面公共代码async
3.给方法标记特性,只有指定特性的方法才会执行公共代码分布式
/// <summary> /// 获取系统中全部的权限 /// </summary> /// <returns></returns> [Caching(AbsoluteExpiration = 10)] public async Task<List<SysRoleModuleButtonDto>> GeRoleModule() { var dto = await _iSysRoleModuleButtonRepository.QueryAsNoTracking(x => x.ModuleType == 0);// var roleModuleButton = dto.MapToList<SysRoleModuleButton, SysRoleModuleButtonDto>(); if (roleModuleButton.Count > 0) { foreach (var item in roleModuleButton) { item.SysRole = _iSysRoleRepository.QueryBySql($"select * from SysRole where SysRoleId='{item.SysRoleId}' and IsDelete!=1 and RoleStatus=1").Result.FirstOrDefault(); item.SysModule = _iSysModuleRepository.QueryBySql($"select * from SysModule where SysModuleId='{item.SysModuleId}' and ModuleStatus=1 and IsDelete!=1").Result.FirstOrDefault(); } } return roleModuleButton; }
这个是AOP切面缓存,它的功能是将包含CachingAttribute特性的方法的返回值缓存到Redis里,下次在访问这个方法,会先去缓存中查询若是有则直接跳过这个方法,直接从Redis里获取以前缓存的结果集,若是没有则会执行方法获取返回值在缓存到Redis里。
以此,咱们能够开发其余相似功能,好比性能监控,日志监控,AOP事务,是否是很强大。具体代码执行流程请下载这个项目(下面有github地址),本身调试下上面的例子就明白了。
还有一个要注意的,我这个项目控制器和服务实现解耦了,若是没有解耦的话,控制器直接调服务的话,AOP注册方式和服务要作修改。
1.Startup中AOP注册代码
////标记了虚方法virtual的才会进入切面 var assemblysModels = Assembly.Load("Titan.Blog.AppService"); builder.RegisterAssemblyTypes(assemblysModels) .EnableClassInterceptors() .InterceptedBy(typeof(BlogCacheAOP));
2.方法要加上virtual,不然进不了切面
/// <summary> /// 获取系统中全部的权限 /// </summary> /// <returns></returns> [Caching(AbsoluteExpiration = 10)] public virtual async Task<List<SysRoleModuleButtonDto>> GeRoleModule() { var dto = await _iSysRoleModuleButtonRepository.QueryAsNoTracking(x => x.ModuleType == 0);// var roleModuleButton = dto.MapToList<SysRoleModuleButton, SysRoleModuleButtonDto>(); if (roleModuleButton.Count > 0) { foreach (var item in roleModuleButton) { item.SysRole = _iSysRoleRepository.QueryBySql($"select * from SysRole where SysRoleId='{item.SysRoleId}' and IsDelete!=1 and RoleStatus=1").Result.FirstOrDefault(); item.SysModule = _iSysModuleRepository.QueryBySql($"select * from SysModule where SysModuleId='{item.SysModuleId}' and ModuleStatus=1 and IsDelete!=1").Result.FirstOrDefault(); } } return roleModuleButton; }
3.切面代码不须要改动
AOP思想实际上就是想把业务和公共的处理分开,对原有的代码没有一点入侵。我以为学习一个新技术以前,先别读那么多概念性的东西,感受越看越糊涂,只会对学习新技术产生恐惧和抵触心理。咱们能够先看看新技术它能解决什么问题,应用场景是什么,这对学习新技术应该是有好处的。
分享免费学习资料
针对于还会准备免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)
为何某些人会一直比你优秀,是由于他自己就很优秀还一直在持续努力变得更优秀,而你是否是还在知足于现状心里在窃喜!但愿读到这的您能点个小赞和关注下我,之后还会更新技术干货,谢谢您的支持!
资料领取方式:加入Java技术交流群963944895
,私信管理员便可免费领取