Spring的代理机制

Spring框架的概述
Spring是分层的Java/EE full-stack(一站式)轻量级开源框架
    *分层:SUN提供的EE的三层框架:web层,业务层,数据访问层(持久层,集成层)
Struts2是web层基于MVC设计模式框架,Hibernate是持久的一个ORM.
*一站式:Spring框架有对三层的每层的解决方案;
   web层:Spring MVC.
持久层:JDBC Template
业务层:Spring的Bean管理
Spring的版本:3.x和4.x,Spring4需要整个hibernate4.

Spring的核心:
IOC(Inverse of Control ):控制反转或者反转控制。----将对象的创建权,交由Spring完成。   


AOP:(Aspect Oriented Programming)面向切面编程,是面向对象的功能延伸,不是替换面向对象。

Spring优点:


* 方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
* AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
* 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
* 方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
* 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
* 降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低


一、AOP的概念:
 AOP Aspect Oriented Programing 面向切面编程
 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)
 Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
 AspecJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入


二、AOP的术语:
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
Aspect(切面): 是切入点和通知(引介)的结合


三、AOP的底层实现
JDK动态代理:对实现了接口的类生成代理
CGLib代理机制:对类生成代理
1,JDK动态代理
public class JDKProxy implements InvocationHandler{
private UserDao userDao;


public JDKProxy(UserDao userDao) {
super();
this.userDao = userDao;
}


public UserDao createProxy() {
UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass()
.getClassLoader(), userDao.getClass().getInterfaces(), this);
return proxy;
}


// 调用目标对象的任何一个方法 都相当于调用invoke();
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("add".equals(method.getName())){
// 记录日志:
System.out.println("日志记录=================");
Object result = method.invoke(userDao, args);
return result;
}
return method.invoke(userDao, args);
}
}


2,CGLIB动态代理:
CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。 Hibernate支持它来实现PO(Persistent Object 持久化对象)字节码的动态生成
Hibernate生成持久化类的javassist.
CGLIB生成代理机制:其实生成了一个真实对象的子类.


下载cglib的jar包.
* 现在做cglib的开发,可以不用直接引入cglib的包.已经在spring的核心中集成cglib.


public class CGLibProxy implements MethodInterceptor{
private ProductDao productDao;


public CGLibProxy(ProductDao productDao) {
super();
this.productDao = productDao;
}

public ProductDao createProxy(){
// 使用CGLIB生成代理:
// 1.创建核心类:
Enhancer enhancer = new Enhancer();
// 2.为其设置父类:
enhancer.setSuperclass(productDao.getClass());
// 3.设置回调:
enhancer.setCallback(this);
// 4.创建代理:
return (ProductDao) enhancer.create();
}



public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
if("add".equals(method.getName())){
System.out.println("日志记录==============");
Object obj = methodProxy.invokeSuper(proxy, args);
return obj;
}
return methodProxy.invokeSuper(proxy, args);
}
}


结论:Spring框架,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值