cglib

[Spring框架]Spring AOP基础入门总结一.

﹥>﹥吖頭↗ 提交于 2020-01-10 07:30:35
[Spring框架]Spring AOP基础入门总结一. 前言: 前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过 预编译 方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是 函数式编程 的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的 耦合度 降低,提高程序的可重用性,同时提高了开发的效率。 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码. Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码. 二,AOP开发中的专业术语 Joinpoint(连接点) :所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点. Pointcut(切入点): 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义. Advice(通知/增强) :所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知

跟我1+1学设计模式-代理模式

ε祈祈猫儿з 提交于 2020-01-10 03:42:06
结构型设计模式 - 代理模式 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。 例如: 购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。 代理模式的定义与特点 代理模式的定义: 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 代理模式的主要优点有: 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用; 代理对象可以扩展目标对象的功能; 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度; 其主要缺点是: 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢; 增加了系统的复杂度; 代理模式的代码实现 模拟保存动作,定义一个保存动作的接口:IUserDao.java,然后目标对象实现这个接口的方法UserDao.java,此时如果使用静态代理方 式,就需要在代理对象(UserDaoProxy.java)中也实现IUserDao接口.调用的时候通过调用代理对象的方法来调用目标对象. 需要注意的是,代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法 静态代理 /** *

Spring AOP

允我心安 提交于 2020-01-10 00:13:26
Spring整合单元测试 在前面的案例中我么需要自己创建ApplicationContext对象,然后在调用getBean来获取需要测试的Bean Spring提供了一种更加方便的方式来创建测试所需的ApplicationContext,并且可以帮助我们把需要测试的Bean直接注入到测试类中 添加依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.2.RELEASE</version> </dependency> 测试代码: import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; @RunWith(SpringJUnit4ClassRunner.class)//固定写法 @ContextConfiguration("classpath

动态代理之 CGLIB 动态代理

我只是一个虾纸丫 提交于 2020-01-09 22:45:52
CGLIB 动态代理 之前我们详细介绍了 JDK 自身的 API 所提供的动态代理的实现,也说明了它存在的缺陷,那就是只能为接口中的方法做代理,被代理类自身和父类的方法都不能被代理。 CGLIB 就是为了解决这个问题而生的,高新能的,底层基于 ASM 框架的一个代码生成框架,它完美的解决了 JDK 版本的动态代理只能为接口中的方法做代理的问题。 例子 我们还是先来看一个例子。首先定义一个 Person 接口,它能够讲话和跑步,在定一个一个 Father 类,它定义了一个 sayHello 方法。 public class Father{ public void sayHello(){ System.out.println("hi somebody...."); } } public interface Person{ void speak(); void run(); } 下面是我们的被代理类,它本身继承自 Father 类,并且实现 Person 接口。 public class Student extends Father implements Person{ // student 类自己实现的方法 public void study(){ System.out.println("i can study...."); } @Override public void speak(

2020面试题

試著忘記壹切 提交于 2020-01-09 17:36:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 基础 JVM内存模型(堆、方法区、本地方法栈、JVM栈、程序计数器) GC回收方式(计数器、可达性分析等) 类加载器(AppClassLoader、ExtClassLoader、BootstrapClassLoader) OSI七层模型(物理层->数据链路层->网络层->传输层->会话层->表现层->应用层) 设计模式(单例模式、观察者模式、装饰者模式、工厂模式、代理模式) HashMap实现原理(JDK1.8) 分布式调度任务流程(XX-JOB):任务注册->任务下发->监控->日志信息收集 算法题(斐波那契数列、杨辉三角形、字符串123变为数字123) 多线程 1.validate 实现原理:将缓存的最新值更新到内存中,同时通知其他处理器,从内存中重新取值,此时其他处理器的缓存值失效 应用场景:插入内存屏障,防止指令重排序 目的:实现共享变量的可见性 2.transient 目的:防止不必要的变量序列化 3.syncronized 实现原理:反编译源码中存在监控计数器,线程获取锁时->计数器+1,锁释放时->计数器-1.当其他线程得知计数器为0时,线程可以进入,否则,线程需要等待. 应用场景:锁(可重入) 备注:reetrantLock是jdk5引入的并发包,作用类似于syncronized

AOP实现方式

霸气de小男生 提交于 2020-01-09 05:38:20
Annotation方式注解方式 1.采用Aspect定义切面 2.在Aspect中定义PointCut和Advice 3.启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到IOC容器中。 定义一个类,表示为@Aspect 定义一个方法标示为Pointcut(“execution(* add*(..)) ”) 定义方法执行的顺序 before(“pointcutname”)。 最终生成的是代理。 AOP: 横切性关注点:Cross cutting concern 切面:Aspect 具体要植入的方法 :Advice 切入点:Pointcut Joinpoint 植入:Weave 目标对象:target Object 代理:Proxy 动态方法:Introduction 配置文件的方式: <aop:config> <aop:aspect id=”security” ref=”securityHandler”> <aop:pointcut id=”alladdmethod” expression=”execution(* cn.synjones.dreams.usermanagerimpl.add*(..))” /> <aop:before method=”checkSecurity”/> </aop:aspect> </aop:config>

Spring AOP实现原理-动态代理

荒凉一梦 提交于 2020-01-08 04:26:18
目录 代理模式 静态代理 动态代理 代理模式 我们知道,Spring AOP的主要作用就是不通过修改源代码的方式、将非核心功能代码织入来实现对方法的增强。那么Spring AOP的底层如何实现对方法的增强?实现的关键在于使用了代理模式 代理模式的作用就是为其它对象提供一种代理,以控制对这个对象的访问,用于解决在直接访问对象时带来的各种问题。 代理主要分为两种方式:静态代理和动态代理 静态代理 静态代理主要通过将目标类与代理类实现同一个接口,让代理类持有真实类对象,然后在代理类方法中调用真实类方法,在调用真实类方法的前后添加我们所需要的功能扩展代码来达到增强的目的 示例代码: /** * 代理类与目标类的共同接口 */ public interface Subject { void request(); void response(); } /** * 目标类 */ public class RealSubject implements Subject { @Override public void request() { System.out.println("执行目标对象的request方法......"); } @Override public void response() { System.out.println("执行目标对象的response方法......"); }

Spring-SpringAOP原理,手写Spring事务框架

徘徊边缘 提交于 2020-01-07 01:09:34
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、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模板用于整合其他的持久层框架)

0102-aop

拜拜、爱过 提交于 2020-01-07 00:56:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 背景 aop的概念很多,比如切点,通知,连接点,引入,织入等;实际上这是一种约定的流程; 约定编程 https://github.com/carterbrother/springbootpractice/tree/master/demo-aop aop编程 也是按照一定规则,按照一定 流程来约定编程的; 典型场景 数据库事物 提取固定 流程,把变化的部分织入到流程中即可; 概念 连接点(join point) : 即方法 切点 (point cut): 连接点的范围,哪些方法; 通知(advice): 分为前置通知,后置通知,环绕通知,正常返回通知,异常返回通知 目标对象(target) :被代理对象 引入(introduction): 引入新的类和方法,增强现有的bean的功能 织入(weaving): 通过代理技术,为原有对象生成代理对象 切面(aspect) : 可以定义切点,各类通知和引用的内容 springboot的aop的使用 @Aspect 申明切面 通知里面放切点: @Before 前置通知 @After 后置通知 @AfterReturn @AfterThrowning @Around @Pointcut 定义切点 切点的指示器: 通知中的参数: ProceedingJoinPoint jp

深入理解JVM

∥☆過路亽.° 提交于 2020-01-06 19:05:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,当对象数量到达最大堆的容量限制后就会产生内存溢出异常。最常见的内存溢出就是存在大的容器,而没法回收,比如:Map,List等。 出现下面信息就可以断定出现了堆内存溢出。 java.lang.OutOfMemoryError: Java heap space 保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象 示例 设置JVM内存参数: -verbose:gc -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\dump /** * java 堆内存溢出 * <p> * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\dump * * @author yuhao.wang3 * @since 2019/11/30 17:09 */ public class HeapOutOfMemoryErrorTest { public static void main(String[] args) throws InterruptedException {