博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【spring框架】AOP介绍
阅读量:7040 次
发布时间:2019-06-28

本文共 2268 字,大约阅读时间需要 7 分钟。

什么是AOP
1.面向切面编程(Aspect-Oriented-Programming)
a)是面向对象的思维方式的有力补充。
下面利用之前写过的模拟Spring的工程给大家演示什么是AOP。
假设我们现在需要在UserDaoImpl类的save方法中add数据代码前后加日志信息:
即是加业务逻辑。
方法1:直接加代码:
package cn.edu.hpu.dao.Impl;import cn.edu.hpu.dao.UserDao;import cn.edu.hpu.model.User;public class UserDaoImpl implements UserDao{	public void save(User u) {			    System.out.println("save start....");			    System.out.println("add success!!");	    System.out.println("save end....");	}}
方法2:(继承模式)
写一个UserDaoImpl2继承UserDaoImpl
package cn.edu.hpu.dao.Impl;import cn.edu.hpu.model.User;public class UserDaoImpl2 extends UserDaoImpl{	@Override	public void save(User u) {		System.out.println("save start....");		super.save(u);		System.out.println("save end....");	}		}
在beans.xml初始化UserDaoImpl2
方法3:(组合模式)
写一个UserDaoImpl2实现UserDao接口
package cn.edu.hpu.dao.Impl;import cn.edu.hpu.dao.UserDao;import cn.edu.hpu.model.User;public class UserDaoImpl3 implements UserDao{		private UserDao userDao=new UserDaoImpl();		public void save(User u) {		System.out.println("save start....");		userDao.save(u);		System.out.println("save end....");	}}
好处:可以互相之间来回的组合(可以换成new UserDaoImpl2();)
对于上面的方法3,如果逻辑bean非常多,那么需要引入非常多的bean,这时候每一个bean都要加上日志代码,工作量非常大。
解决办法:
写了一个LogIntercept的类,定义所有的日志代码:
package cn.edu.hpu.aop;//日志的拦截器public class LogIntercept {	public void beforeMethod(){		System.out.println("save start...");	}		public void afterMethod(){		System.out.println("save end...");	}}
在业务逻辑的实现里这样使用:
package cn.edu.hpu.dao.Impl;import cn.edu.hpu.aop.LogIntercept;import cn.edu.hpu.dao.UserDao;import cn.edu.hpu.model.User;public class UserDaoImpl4 implements UserDao{		private UserDao userDao=new UserDaoImpl();		public void save(User u) {		new LogIntercept().beforeMethod();		userDao.save(u);		new LogIntercept().afterMethod();	}}
但是这样做还是有问题:
使用组合模式的时候,虽然这个LogIntercept可以加到任何bean上面,还是没有解决一个问题,就是我要加到某个bean上面去的时候,必须得做一个新的类(如UserImpl5),把原来的那个bean组合进来。
解决方法:你要让我加到哪个bean上面,你干脆给我写个配置文件,我就动态的把逻辑加到那个bean上面。这就是AOP。
你在XML初始化bean的时候,加一个标签,告诉程序我要加一个逻辑。例如:
这里就可以将日志逻辑注入了。
但是你写<Log method="beforeMethod"/>等标签程序会帮你产生一个组合的类吗?很显然不能,所以这个时候你想要动态的产生我们想要的那个类,就要使用"动态代理"了。
JDK中可以实现动态代理:
利用proxy和invocationhandler
具体细节详见动态代理的文章:

下一篇总结我会利用动态代理实现AOP,并解释AOP:

转载请注明出处:

你可能感兴趣的文章
leetcode Sort List
查看>>
开源分布式存储SeaweedFS
查看>>
Maven com.sun.jdmk:jmxtools:jar 下载不下来
查看>>
DevExpress之Skin自定义使用
查看>>
可变参数
查看>>
[日推荐]『饿了么外卖服务』饿了么官方小程序,无需下载安装!
查看>>
Maven的学习资料收集--(四)使用Maven构建Web项目-测试
查看>>
Perl:过滤注释
查看>>
51CTO技术沙龙第十六期回顾~
查看>>
Tomcat调优测试
查看>>
iptunnel配置使用
查看>>
CDH5.X安装配置kerberos认证过程
查看>>
Mac Yosemite 10.10 下利用 Launchctl 自启动 mysql
查看>>
ubuntu下的命令学习与汇总--网络管理命令
查看>>
cent os 6.4安装使用mysql
查看>>
我的友情链接
查看>>
python3.x中的urllib模块
查看>>
Spark SQL和DataFrame指南[中英对照]
查看>>
快速了解MYSQL性能优化
查看>>
python list添加元素
查看>>