浅谈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 动态代理模式(Spring AOP 的实现 原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- Spring 2.5 采用动态代理或cglib来实现aop
- 最简单的动态代理实例(spring基于接口代理的AOP原理)
- 用Java的动态代理模拟spring的AOP
- spring动态代理(aop)----
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现原理)
- Spring AOP的底层实现技术---JDK动态代理
- 动态代理,Spring两大核心知识BeanFactory、AOP框架!
- [转贴] 反射实现 AOP 动态代理模式(Spring AOP 的实现原理)
- 反射实现AOP 动态代理模式(Spring AOP 的实现原理)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理)
- Spring AOP的底层实现技术---JDK动态代理
- 反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) --转
- spring实现AOP的两种方式以及实现动态代理方式