浅谈springAOP和动态代理

动态代理

先假设一个场景,假如有一个service操作,里面有add(),delete(),insert(),search()方法,每次调用时候,需要输出到日志“执行了xx方法”,初级的方法自然是在add()等方法中创建一个Logger logger = Logger.getLogger(xx.class),然后打印日志(logger.debug(“**”)),那么假设有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就是通过动态代理实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值