cglib

spring ioc和aop的含义

霸气de小男生 提交于 2020-01-27 12:03:50
自己整理的一些笔记,如有错误欢迎提出指正,谢谢 1.IOC的定义? IOC:另外一种说法叫DI(Dependency Injection),即依赖注入,是一种设计思想。 我们通过IOC将相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。 作用是为了解耦,降低类之间的耦合度,其设计思想就是设计模式的工厂模式, 我们并不需要知道其生产的具体过程,我们只要其产出的对象即可。 其工作流程就是:在Spring容器启动的时候,Spring会把你在application.xml中配置好的bean都初始化, 在你需要调用的时候,把已经初始化的bean分配给你要调用这些bean的类,而不用去创建一个对象的实例。 2.IOC的传值方式有哪些? 一般的是设值传入和构造方法传入。 3.IOC的容器有哪些? 常见的一般是ApplicationContext和BeanFactory,这两个容器的区别请看这里: http://blog.csdn.net/hi_kevin/article/details/7325554 4.依赖注入的实现方式 就是Java的反射,通俗的来讲就是根据给出的类名来动态地生成对象,用set方法将事先保存在hashmap中的类属性注入到类中。 AOP: 面向切面编程,被定义为促使软件系统实现关注点的分离的技术。

代理模式-CGLIB动态代理

自古美人都是妖i 提交于 2020-01-27 03:04:23
1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。 2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。 3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法。 CGLIB动态代理 : 使用JDK的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。 但对于无接口的类,要为其创建动态代理类,就要使用CGLIB来实现。CGLIB代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用CGLIB生成动态代理,要求目标类必须能够被继承,即不能是final的类。 CGLIB(Code Generation Library)是一个开源项目,是一个强大的、高性能的、高质量的代码生成类库。它可以在运行期扩展喝增强Java类。Hibernate用它来实现持久对象的字节码的动态生成,Spring用它来实现AOP编程。 CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架)来转换字节码并生成新的类。CGLIB是通过对字节码进行增强来生成代理的。 代理实现与解析: 使用CGLIB创建代理步骤: 步骤1

AOP与IOC区别

你。 提交于 2020-01-26 23:34:08
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 为什么说Spring是一个一站式的轻量级开源框架呢?EE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。 • WEB层:SpringMVC • 业务层:Spring的IoC • 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架) 从上面的简要介绍中,我们要知道Spring的核心有两部分: • IoC:控制反转

springAOP

99封情书 提交于 2020-01-26 11:26:50
springAOP 纯程序的springAOP 前置通知的应用 通知的类型与引入通知 使用AspectJ springAOP原理 原对象何时变为代理对象? 谁主导了代理的工作? 拦截器 CGLIB与JDK代理的性能 纯程序的springAOP 现在,我们都是用AspectJ来实现面向AOP,因为它的语法很简单。而且,spring非常支持AspectJ。可是我们,还是要从程序化的AOP开始,因为AOP是基于代理的,纯程序能够让我们理清其中的代理模式。 前置通知的应用 AOP能够对方法进行增强,当然,还可以保证方法执行的安全性。我们通过一个类似于Spring Security一样的功能,来了解前置通知的纯程序化的代码。 比如我们有一个bean,我们要对其进行保护: package com . ocean . testaop . aopfinal ; public class SecureBean { public void writeMessage ( ) { System . out . println ( "今天下午3点三号门见" ) ; } } 这是机密消息,必须要通过身份验证才能够看到。 我们用一个类来存储用户信息: package com . ocean . testaop . aopfinal ; public class UserInfo { private String

java设计模式-代理模式

杀马特。学长 韩版系。学妹 提交于 2020-01-26 03:54:13
1.代理(proxy)模式的定义 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式主要分为 静态代理 和 动态代理 。 2.代理模式的主要优缺点 优点: 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用; 代理对象可以扩展目标对象的功能; 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度; 缺点: 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢; 增加了系统的复杂度; 3.代理模式的主要角色 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。 4.代理模式的结构图 5. 代理模式的实现,以买票为例 静态代理:由程序员编写的代理类,并在程序运行前就编译好了。 动态代理:代理类在程序运行时创建的代理方式被成为动态代理。 5.1 静态代理 创建买票接口 package com.lw.designpattern.proxy.staticproxy; /** * @Classname Ticket * @Description 买票接口 * @Author

Spring AOP的实现机制

北城余情 提交于 2020-01-26 02:33:01
AOP(Aspect Orient Programming),一般称为面向切面编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理,日志,缓存等等.AOP 实现的 关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。静态代理是编译期实现,动态代理是运行期实现,可想而知前者拥有更好的性能。 本文主要介绍Spring AOP的两种代理实现机制,JDK动态代理和CGLIB动态代理。 静态代理是编译阶段生成AOP代理类,也就是说生成的字节码就织入了增强后的AOP对象;动态代理则不会修改字节码,而是在内存中临时生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。 Spring AOP中的动态代理主要有两种方式, JDK动态代理 和CGLIB动态代理.JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口.JDK动态代理的核心是InvocationHandler接口和代理类。 如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类.CGLIB(代码生成库),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理

Spring AOP中的动态代理

我怕爱的太早我们不能终老 提交于 2020-01-25 14:47:33
0 前言 1 动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2 Spring AOP中的动态代理机制 2.1 JdkDynamicAopProxy 2.2 CglibAopProxy 3 总结 0 前言 前一个季度旅游TDC的Thames服务有几次宕机,根据组内原因认真查找发现是数据库事务造成的,后来把服务中的事务配置全部去掉,服务恢复正常。根据这次教训,虽然现在还是很难确定是哪一个方面的真正原因,但是激发了我学习Spring事务方面的兴趣。而Spring事务的实现是根据AOP来实现的,对于我这个小菜鸟,只能一步一步来了,决定先从Spring的AOP开始。 1 动态代理 Spring AOP中使用了两种动态代理,一种是JDK的动态代理,一种CGLIB的动态代理。JDK的动态代理必须指定接口,这些接口都是已经被代理对象实现了的;而CGLIB代理则不需要指定接口。 1.1 JDK动态代理 JDK的动态代理网上有很多资料,这里只说我自己的理解。 JDK动态代理必须实现InvocationHandler接口,然后通过Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)获得动态代理对象。

Spring AOP通俗理解与应用

笑着哭i 提交于 2020-01-23 13:21:04
目录 AOP 图解AOP 概念 通俗理解AOP 作用 实现方式 应用场景 应用 Aop与SpringAOP的关系   关于AOP,一般都会先去了解AOP的基础概念,如切点、通知、连接点、切入点 、引入和织入等,面对晦涩难懂的概念,很容易陷入困境,找了几篇讲解较好的文章,将其整合起来,帮助深入理解AOP AOP   AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容(Spring核心之一),是函数式编程的一种衍生范型。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 作用   为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。 图解 传统的纵向体系代码复用: 横向抽取机制(AOP思想): 概念 1.通知(Advice)   就是你想要的功能,也就是上面说的安全,事务,日志等。你得先定义好把,然后在想用的地方用一下。 2.连接点(JoinPoint)   这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后

Spring AOP 源码解析

若如初见. 提交于 2020-01-23 10:46:26
[TOC] 之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希望能写一写 Spring AOP 的源码分析文章,这样读者看完 IOC + AOP 也就对 Spring 会有比较深的理解了。今天终于成文了,可能很多读者早就不再等待了,不过主要为了后来者吧。 本文不会像 IOC 源码分析那篇文章一样,很具体地分析每一行 Spring AOP 的源码,目标读者是已经知道 Spring IOC 源码是怎么回事的读者,因为 Spring AOP 终归是依赖于 IOC 容器来管理的。 阅读建议:1、先搞懂 IOC 容器的源码 ,AOP 依赖于 IOC 容器来管理。2、仔细看完 Spring AOP 使用介绍 这篇文章,先搞懂各种使用方式,你才能"猜到"应该怎么实现。 Spring AOP 的源码并不简单,因为它多,所以阅读源码最好就是找到一个分支,追踪下去。 本文定位为走马观花,看个大概,不具体到每一个细节。 目录: 前言 这一节,我们先来"猜猜" Spring 是怎么实现 AOP 的。 在 Spring 的容器中,我们面向的对象是一个个的 bean 实例,bean 是什么?我们可以简单理解为是 BeanDefinition 的实例,Spring 会根据 BeanDefinition 中的信息为我们生产合适的 bean 实例出来。 当我们需要使用 bean 的时候

Jdk和Cglib 的区别

廉价感情. 提交于 2020-01-23 05:04:21
一、原理区别: java动态代理是利用反射机制生成一个实现代理接口的代理类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 1、如果目标对象实现了 接口 ,默认情况下会采用 JDK的动态代理 实现AOP。 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP(<aop:aspectj-autoproxy proxy-target-class="true"/>)。 3、如果目标对象没有实现了接口, 必须采用CGLIB库 ,spring会自动在JDK动态代理和CGLIB之间转换。 如何强制使用CGLIB实现AOP? (1)添加CGLIB库,SPRING_HOME/cglib/*.jar。 (2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>。 JDK动态代理和CGLIB字节码生成的区别? (1)JDK动态代理只能对 实现了接口的类 生成代理,而不能针对类。 (2)CGLIB是针对 类 实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或者方法最好不要生命成final。 来源: https://www.cnblogs.com/panning/p