spring aop原理

AOP切面之打印方法时间

天涯浪子 提交于 2019-12-04 08:07:13
在看线程并发的书籍时看到ThreadLocal,利用线程变量打印方法执行时间,联想到可以用aop实现全局方法打印 下面先看单独使用ThreadLocal打印的方法 public class profiler { //第一次get()方法调用时会进行初始化(如果set方法没有调用),每个线程会调用一次 private static final ThreadLocal<Long> TimeThreadLocal = new ThreadLocal<Long>() { protected Long initialValue() { return System.currentTimeMillis(); } }; public static final void begin() { TimeThreadLocal.set(System.currentTimeMillis()); } public static final Long end() { return System.currentTimeMillis() - TimeThreadLocal.get(); } public static void main(String[] args) throws InterruptedException { profiler.begin(); TimeUnit.SECONDS.sleep(1);

Spring AOP 是什么?

ぃ、小莉子 提交于 2019-12-04 01:06:25
为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。 为了阐述清楚Spring AOP,我们从将以下方面进行讨论: 代理模式 静态代理原理及实践 动态代理原理及实践 Spring AOP原理及实战 1. 代理模式 代理模式:为其他对象提供一种代理以控制对这个对象的访问。这段话比较官方,但我更倾向于用自己的语言理解:比如A对象要做一件事情,在没有代理前,自己来做;在对 A 代理后,由 A 的代理类 B 来做。代理其实是在原实例前后加了一层处理,这也是 AOP 的初级轮廓。 2. 静态代理原理及实践 静态代理模式:静态代理说白了,就是在程序运行前就已经存在代理类的字节码文件、代理类和原始类的关系在运行前就已经确定。废话不多说,我们看一下代码。 package test.staticProxy; // 接口 public interface IUserDao { void save(); void find(); } //目标对象 class UserDao implements IUserDao{ @Override public void

java web牛刀小试之spring

扶醉桌前 提交于 2019-12-03 16:49:30
一、Spring 框架 1.1 Spring 框架模块组成: 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory ,它是工厂模式的实现。 BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。 Spring ORM:Spring

spring知识汇总

怎甘沉沦 提交于 2019-12-03 16:44:07
1、Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 主要由以下几个模块组成: Spring Core:核心类库,提供IOC服务; Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等); Spring AOP:AOP服务; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。 2、Spring 的优点? (1)spring属于低侵入式设计,代码的污染极低; (2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性; (3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。 (4)spring对于主流的应用框架提供了集成支持。 3、Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系

七、Spring之深入理解AOP源码

大兔子大兔子 提交于 2019-12-03 07:38:07
Spring之深入理解AOP源码 ​ 在上一篇博文中,我们对AOP有了初步的了解,那么接下来我们就对AOP的实现原理进行深入的分析。 ​ 在之前写的那个AOP示例代码当中有这样一个注解: @EnableAspectJAutoProxy ,这个注解的作用是开启AOP功能,所以我们就从这个注解引入对AOP源码的分析。 @EnableAspectJAutoProxy ​ 先来看一下它的源代码: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy { /** * Indicate whether subclass-based (CGLIB) proxies are to be created as opposed * to standard Java interface-based proxies. The default is {@code false}. */ boolean proxyTargetClass() default false; /** * Indicate that the proxy should be

Spring面试题一

烈酒焚心 提交于 2019-12-03 07:26:13
1、Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。 主要由以下几个模块组成: Spring Core:核心类库,提供IOC服务; Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等); Spring AOP:AOP服务; Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; Spring ORM:对现有的ORM框架的支持; Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; Spring MVC:提供面向Web应用的Model-View-Controller实现。 2、Spring 的优点? (1)spring属于低侵入式设计,代码的污染极低; (2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性; (3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。 (4)spring对于主流的应用框架提供了集成支持。 3、Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系

SpringAOP源码分析总结

一世执手 提交于 2019-12-03 06:40:23
1、Advisor(增强器):充当Advice和Pointcut的适配器,类似使用Aspect的@Aspect注解的类(前一章节所述)。一般有advice和pointcut属性。 祖先接口为org.springframework.aop.Advisor,应用中可直接使用org.springframework.aop.support.DefaultPointcutAdvisor < aop:advisor>大多用于事务管理 ,定义通知器(通知器跟切面一样,也包括通知和切点) 2、Advice:用于定义拦截行为,祖先接口为org.aopalliance.aop.Advice,该接口只是标识接口,应用中可直接实现BeforeAdvice ,ThrowsAdvice,MethodInterceptor ,AfterReturningAdvice ,IntroductionInterceptor 等子接口 <!-- 会重复读,不会脏读事务 --> < tx: advice id = "txAdvice" transaction - manager = "transactionManager" > < tx: attributes > < tx: method name = "*" timeout = "120" propagation = "REQUIRED" rollback - for

SpringAop源码分析(基于注解)一

[亡魂溺海] 提交于 2019-12-03 06:36:16
在之前的文章中,我学习了Spring Ioc的源码,对Spring原理有了初步了解,所以准备趁热打铁,把SpringAop的源码也看一遍,接下来的文章都会围绕Aop 一、AOP原理 关于Aop的原理,简单来讲无非就是用代理模式为目标对象生产代理对象,对原有的方法进行增强。看上去挺简单,但在Spring中,有许多细节是要注意到的。比如: AOP是怎么触发的? 代理对象是什么时候生成的? 怎么发现目标对象? 怎么判断目标对象的哪些方法需要增强? 怎么实现前置通知,后置通知,环绕通知? 一个方法有多个切面代理怎么处理? 我们可以带着这些疑问来看源码,有助于我们的理解。 二、AOP术语 AOP的术语有很多并且很重要,看源码之前还是要对术语有所了解,这里就不一一介绍了,感兴趣的同学可以移步 SpringAOP术语 三、demo 先来一个注解方式实现AOP的demo,然后我们后面根据这个demo来分析源码。 @Aspect @Component @EnableAspectJAutoProxy public class LogAspect { @Before ( "execution(* com.mydemo.work.StudentController.getName(..))" ) public void doBefore ( ) { System . out . println ( "==

Spring AOP入门

自作多情 提交于 2019-12-03 05:27:26
1. AOP概述 在软件业,AOP为Aspect Oriented Programming的缩写,意为: 面向切面编程 ,通过 预编译 方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容,是 函数式编程 的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的 耦合度 降低,提高程序的可重用性,同时提高了开发的效率。 --来自百度 2. Spring中的AOP Spring能够为容器中管理的对象生成动态代理对象 以前我们要使用动态代理,我们需要自己调用下面的方法生成对象 Proxy.newProxyInstance(xx,xx,xx) 生成代理对象,现在Spring能够帮我们生成代理对象 3. Spring 中AOP实现原理 spring 的AOP 是使用动态代理实现的 两种动态代理方式: JDK 提供的动态代理 被代理对象必须要实现实现 接口 ,才能产生代理对象。如果没有接口不能使用此动态代理技术。 cglib动态代理 第三方代理技术,cglib代理,可以对任何类实现代理,代理的原理是对目标对象进行 继承 (生成子类)代理。如果目标对象被final修饰,该类无法被cglib代理。 // 使用cglib来动态代理 public class

代理实现aop以及代理工厂实现增强

谁都会走 提交于 2019-12-03 04:24:51
一、静态代理实现   1.接口(抽象主题)       2.接口的实现类(真实主题)      3.代理类(代理主题)       4.测试类:      ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); ProxySubject proxySubject =(ProxySubject) context.getBean("proxySubject"); proxySubject.doSome(); 二、JDK动态代理    JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的 业务实现类对象 以及 方法名 ,动态地创建了一个代理类的class文件并被字节码引擎执行,然后通过该代理类对象进行方法调用。    1.抽象主题,真实主题与上面一致    2.动态代理类 package com.cmy.handler; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DoSomeBeanFactory implements