需求:不改变原有类前提下添加日志管理等功能,。
aop理解第一步:静态代理 示例:LoginServiceStaticProxy.java
创建一个代理类,继承被代理类的接口。
在代理类中声明被代理对象。
实现接口的方法中,调用代理对象的方法,可在方法的前后添加代码实现功能扩展
在测试类中,调用代理对象的方法。
评价:静态代理确实实现了在不改变代码的情况下添加了功能,但是如果每一个方法和类都这样代理的话 ,我靠,那还不多的上天。动态代理可以解决该问题
aop理解第二步:JDK动态代理(针对接口)
创建一个类实现InvocationHandler接口
类中声明一个代理Object对象target用来接收要代理的对象
创建一个getProxyInstance(Object obj)方法接收要代理的对象,赋给target并且返回代理对象实例
在接口方法中实现功能扩展
在applicationContext.xml中配置代理
在测试类中进行测试。
另外:如果要实现相应方法才给扩展功能,可以在invoke扩展方法中判断method的名字或者有没有特殊注解来进行实现
评价:JDK动态代理实现了多个接口的代理,代理的对象都有相应接口,要是代理没有接口的类的话得使用CGLIB代理
aop理解第三步:CGLIB动态代理
创建代理类实现MethodInterceptor接口
创建一个getProxyInstance(Object obj)方法接收要代理的对象,使用Enhancer类进行操作
在MethodInterceptor接口提供的方法中实现功能扩展
在applicationContext.xml中配置代理
在测试类中进行测试。
评价:CGLIB实现了没有接口也可以代理,纵观两个动态代理都实现了为全部方法实现代理,但是为单个方法或者部分方法实现代理还是有些麻烦。
让我们来看看spring如何实现代理?
aop理解第四步:spring内置代理对象,spring内置的代理(ProxyFactoryBean)也是JDK动态代理,所以代理是针对接口的。使用举例:
首先创建一个要被代理的接口,以及它的实现类。
然后创建几个类(通知类)实现下面的接口:
MethodBeforeAdvice(前置通知,实现此接口中的方法,可在执行代理对象的方法前执行)
AfterReturingAdvice(后置通知)
MethodInterceptor(环绕通知)
ThrowsAdvice(异常通知)
(还有一个需配置的引入通知,只希望在调用某个函数时才出现通知)
然后在Xml中配置代理类ProxyFactoryBean。
在测试类中进行测试。
评价:不用自己手写代理类了,spring原来有内置的代理类啊,但是这样手动实现接口,是不是有点太麻烦了,spring其实也有实现上述接口的实现类。下面就来看一下
aop理解第五步:<!-- 配置通知接口实现类的方式实现功能扩展-->
<aop:config>
<aop:pointcut id="studentPointCut" expression="execution(* cn.edu.sdut.aop.service.impl.StudentService.*Say(..))" />
<aop:advisor advice-ref="myMethodBeforeAdvice" pointcut-ref="studentPointCut"/>
</aop:config>
aop理解第六步:Spring基于XML配置实现AOP
首先创建一个切面类,就是在里面配置要增加的功能方法。
配置XML。(切面,切入点,以及配置方法)
此外 SpringAOP和CGLIB代理冲突,具体原因我还没弄清,不过我看到下面这一句话:
Spring AOP的原理是 JDK 动态代理和CGLIB字节码增强技术,前者需要被代理类实现相应接口,也只有接口中的方法可以被JDK动态代理技术所处理;后者实际上是生成一个子类,来覆盖被代理类,那么父类的final方法就不能代理,因为父类的final方法不能被子类所覆盖。一般而言Spring默认优先使用JDK动态代理技术,只有在被代理类没有实现接口时,才会选择使用CGLIB技术来实现AOP。(http://blog.csdn.net/u014763172/article/details/52797045)
aop理解第七步:Spring基于注解配置实现AOP
不在XML中配置,直接在切面方法中设置注解来配置
@Before("execution(* cn.edu.sdut.aop.service.impl.S*2.*Say(..))")
@AfterReturning(value="execution(* cn.edu.sdut.aop.service.impl.S*2.*Say(..))",returning="obj")
@After("execution(* cn.edu.sdut.aop.service.impl.S*2.*Say(..))")
@AfterThrowing(value="execution(* cn.edu.sdut.aop.service.impl.S*2.*Say(..))",throwing="e")
@Around("execution(* cn.edu.sdut.aop.service.impl.S*2.*Say(..))")
没有合适的资源?快使用搜索试试~ 我知道了~
SpringAOP简单项目实现
共69个文件
java:21个
class:21个
xml:8个
需积分: 45 9 下载量 56 浏览量
2017-09-28
11:58:14
上传
评论
收藏 56KB ZIP 举报
温馨提示
自己总结的学Spring AOP的步骤,以及代码示例。可供刚学AOP的同学们参考。
资源推荐
资源详情
资源评论
收起资源包目录
Maven_01.zip (69个子文件)
Maven_01
pom.xml 6KB
.springBeans 425B
target
test-classes
m2e-jee
web-resources
META-INF
maven
Maven_01
Maven_01
pom.xml 6KB
pom.properties 218B
MANIFEST.MF 104B
classes
代理.txt 4KB
cn
edu
sdut
aop
aspect
MyAnnocationAspect.class 2KB
MyAspect.class 2KB
test
Test01.class 3KB
proxy
ServiceJDKProxy.class 2KB
LoginServiceStaticProxy.class 1KB
ServiceCGLIBProxy.class 2KB
advice
MyMethodInterceptor.class 1KB
MyMethodBeforeAdvice.class 1KB
MyAfterReturning.class 1KB
MyAfterThrowing.class 1KB
service
IAdminService.class 190B
ILogOutService.class 156B
IStudentService.class 162B
IStudentService2.class 164B
ILoginService.class 153B
impl
UserService.class 662B
AdminService.class 859B
StudentService2.class 721B
StudentService.class 716B
LogOutService.class 707B
LoginService.class 708B
applicationContext.xml 4KB
.settings
org.eclipse.m2e.core.prefs 90B
com.genuitec.runtime.libraries.xml 108B
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.wst.common.project.facet.core.xml 498B
org.eclipse.core.resources.prefs 77B
org.eclipse.wst.common.component 567B
org.eclipse.wst.common.project.facet.core.prefs.xml 435B
org.eclipse.wst.jsdt.ui.superType.container 49B
org.eclipse.wst.validation.prefs 50B
.jsdtscope 522B
org.eclipse.jdt.core.prefs 430B
src
代理.txt 4KB
cn
edu
sdut
aop
aspect
MyAnnocationAspect.java 2KB
MyAspect.java 733B
test
Test01.java 2KB
proxy
ServiceJDKProxy.java 1KB
LoginServiceStaticProxy.java 727B
ServiceCGLIBProxy.java 842B
advice
MyAfterReturning.java 477B
MyAfterThrowing.java 399B
MyMethodInterceptor.java 549B
MyMethodBeforeAdvice.java 459B
service
ILoginService.java 101B
ILogOutService.java 98B
IStudentService2.java 104B
IAdminService.java 119B
IStudentService.java 103B
impl
LoginService.java 325B
AdminService.java 494B
StudentService2.java 359B
UserService.java 225B
LogOutService.java 311B
StudentService.java 318B
applicationContext.xml 4KB
.project 2KB
WebRoot
META-INF
MANIFEST.MF 39B
WEB-INF
web.xml 931B
classes
lib
spring.tld 17KB
spring-form.tld 74KB
index.jsp 834B
.classpath 885B
共 69 条
- 1
资源评论
IT界小黑的对象
- 粉丝: 20
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- unity读取excel工具 使用3.5即可
- Matplotlib 是一个 Python 的绘图库 Matplotlib 绘图指南与功能介绍.docx
- 基于TMS320F2808设计光伏并网发电模拟器AD09设计硬件(原理图 PCB)+CCS软件源码 +说明文档.zip
- 在微电网中采用粒子群算法在matlab环境下进行了仿真,最后给出了微网各微源的最优机组组合方式和最佳电能交易计划 (注释完全,可
- 在matlab中通过yalmip平台调用cplex求解器,可用于求解MILP问题,适合于综合能源系统优化求解(注释完全,可直接运
- MT8852B labview 驱动,MT8852B labview 代码,蓝牙测试仪MT8852B代码,蓝牙低功耗测试
- 导照片2.0(只适合索尼微单)
- KMP算法python代码实现与使用场景.docx
- 基于MATLABCPLEX 的机组最优组合,成功求解表格化,图示化的机组组合结果(注释完全,可直接运行)(文档加Matlab源码
- postgresql-9.5.3-1-windows-x64
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功