您的位置:首页 > 编程语言 > Java开发

浅谈springAOP和动态代理

2017-04-17 21:32 363 查看

动态代理

先假设一个场景,假如有一个service操作,里面有add(),delete(),insert(),search()方法,每次调用时候,需要输出到日志“执行了xx方法”,初级的方法自然是在add()等方法中创建一个Logger logger = Logger.getLogger(xx.class),然后打印日志(logger.debug(“[b]**[/b]”)),那么假设有n个方法,这n个方法中都需要这么操作的话,就会显得很蠢了,那么怎么改进呢?

那么,动态代理的好处就体现出来了。

可以编写一个代理类,实现InvocationHandler接口,重写invoke方法,那么直接在invoke中编写打印日志的代码,以后每次调用方法时,通过动态代理传入真是对象即可。

AOP

Spring的AOP是核心思想之一,假设还是上面的应用场景,显然我们仍然不会每次都在方法内部打印日志,那怎么实现呢?

aop的目标就是,在不影响业务逻辑的代码的前提下,给程序添加一定的方法,以实现某种需求。先来看一段aop的配置

<bean id="aspectBean" class="aop.AdviceImpl" />
<aop:config>
<aop:aspect id="aspect" ref="aspectBean">
<aop:pointcut id="businessService" expression="execution(* aop.*.*(..))" />
<aop:before pointcut-ref="businessService" method="doBefore" />
<aop:after pointcut-ref="businessService" method="doAfter" />
<aop:around pointcut-ref="businessService" method="doAround" />
<aop:after-throwing pointcut-ref="businessService"
method="doThrowing" throwing="ex" />
</aop:aspect>
</aop:config>


execution(* aop..(..))解释如下:

符号含义
execution()表达式的主体
第一个”*“符号表示返回值的类型任意
aop..所切的服务的包名的类中的所有方法
(..)表示参数,两个点表示任何参数类型
如此定义好切面后,即可通过方法前调用,方法后调用等执行一些方法,通过这个方法,也可以在业务逻辑中打印一些日志。

那么可以发现动态代理和aop其实是差不多的,都是把一些通用的方法从业务逻辑中提取出来,不仅解耦,而且代码更简洁,更合乎设计逻辑,那么这两种方法有什么区别呢?—————————————-#我只想说一句废话:AOP就是通过动态代理实现的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态代理 aop