前天写了一些关于如何通过
Annotation
来实现
AOP
的东东,也啰啰嗦嗦的说了一大堆。当然对使用
Spring
的常客来说那个没必要看的。毕竟我写这些的针对人群都是些刚接触
Spring
的
rookies.
关于通过
Configuration
来配置
Spring
我想只要开始用
Spring
的人都应该很清楚。我就不再累述,一带而过吧:
使用配置文件的最大好处就是与
Annotation
相比较不在需要将一些
@Aspect
等标签写到代码中去
(
如果你对
Annotation
有兴趣,可以参考“通过
Annotation
来实现
AOP http://jummy.iteye.com/blog/255126
”这篇文章,写的比较详细
)
。当然是用配置文件来管理
Spring
是推荐的做法,大家也要好好熟悉。
<!--
这是切面的注入
-->
<
bean
id
=
"mySecurityManagerImpl"
class
=
"com.jummy.aop.MySecurityManagerImpl"
>
</
bean
>
<!--
这是目标对象的注入
-->
<
bean
id
=
"userManagerImpl"
class
=
"com.jummy.aop.UserManagerImpl"
></
bean
>
<
aop:config
>
<
aop:aspect
id
=
"securityAspect"
ref
=
"mySecurityManagerImpl"
>
<
aop:pointcut
id
=
"addAllMethod"
expression
=
"execution(*
add*(..))"
/>
<
aop:before
pointcut-ref
=
"addAllMethod"
method
=
"security"
/>
<!--
pointcut-ref
是表示对哪个
pointcut
的引用,当
pointcue
比较多的时候可以加以区分。这里跟
Annotation
中的
@Before("addAllMethod()")
作用一致,而
pointcut id="addAllMethod"
这里就如同
Annotation
中这个
private void addAllMethod() {}
无返回值的方法的,该方法就是起到标识的作用
(
被引用
)
-->
</
aop:aspect
>
</
aop:config
>
</
beans
>
<!--
通过两种不同方式来实现
AOP
,总的来说还是通过配置文件来管理
ASPECT
是极为方便的,这样讲配置和代码分离
结构就很清晰了。而且
SPRING
提供的框架配置起来还是很方便的。最主要的是理解了
AOP
以及
两种实现方式之间的联系
-->
具体一些里面的知识点,不在详述都有注释。有什么不懂的,我们再聊。。下面看看切面中的这个方法吧:
public
void
security(JoinPoint joinPoint) {
Object
[]
args=joinPoint.getArgs();
for
(Object
o:args){
System.
out
.println(o);
}
//
在来得到方法名吧,就是通知所要织入目标对象中的方法名称
String method=joinPoint.getSignature().getName();
System.
out
.println(method);
System.
out
.println(
"-----
调用
security
方法
-------"
);
}
这里的
joinPoint
可以得到目标对象中的参数的值,以及方法的名称等,当你需要进一步对信息进行验证时,该参数是非常有用的,
args所得到的是传入的参数,比如我传入的用户名和密码分别是Jummy和1018那几可以进行用户判断了,以及密码正确与否等一些的操作
。
其原理也就和动态代理中的
invoke
()方法类似。
(
具体参见
http://jummy.iteye.com/blog/253406
)
最后说说
Spring
中代理的两种形式:
(
默认
)JDK
动态代理
/CGLIB
代理。还是从程序说起:
<!----><!---->
<!---->
<!----><!---->
<!---->
<
比较两幅图
,为什么不能传本地图像呢?还是我不会传?什么原因。。大家看后面的文档吧>
原先使用默认的代理时我们必须给目标类写一个接口
(
就是
UserManager
接口
)
,现在我将接口删除
(
此时你要运行程序会报错,找不到
PROXY)
然后使用
CGLIB
代理实现。
那如何配置
CGLIB
代理呢:
*<aop:aspect-autoproxy proxy-target-class=”true”/>
*
引入
CGLIB
架包
.
*
其他配置就类似于
JDK
时的配置
(
具体我附有源码,另请参考
)
最后说说两者的区别吧:
*JDK
的动态代理只能对实现了接口的目标类进行代理,而不实现接口的类就不能使用
JDK
的动态代理
*CGLIB
是针对类来实现代理,当没有实现接口的类需要代理时就需要通过
CGLIB
来实现代理了,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但是因为采用的是继承,所以不能对
finall
类进行继承。
*
二者在某些特殊场合需混合使用
13e37142
分享到:
相关推荐
java代理机制 JDK动态代理和cglib代理 详解
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
java静态代理 jdk动态代理 cglib动态代理 代理原理
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
实现java动态代理的两个实例,jdk动态代理和cglib
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
jdk 的动态代理和CGLIB代理
静态代理、jdk动态代理、cglib动态代理
JDK动态代理和Cglib动态代理实例源码
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
jdk动态代理与cglib动态度代理的区别原理代码jar包
该资源里面有Jdk动态代理,cglib动态代理,反射和拦截器(链)示例,里面也有所需要的jar包,下载下来导入eclipse即可运行,有问题请问我
NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1711218
JDK代理和Cglib代理,下载源码清楚了解二者区别
JAVA JDK静态代理、动态代理、CGlib代理的代码演示 为对象增加功能
JDK动态代理,关于jdk动态代理的问题!详细的说明!JDK动态代理JDK动态代理
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
附件为java 动态代理实例,有全码,包括测试代码。 代码少,注释全。 对理解代理非常不错。