1、aop的理解
- 面向切面编程:在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
- AOP底层是动态代理,如果是接口采用JDK动态代理,如果是类采用CGLIB方式实现动态代理
- 动态代理和CGLIB代理的区别:JDK动态代理只能对实现了接口的类生成代理,而不能针对类;CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)
- (1)当Bean实现接口时,Spring就会用JDK的动态代理
- (2)当Bean没有实现接口时,Spring使用CGlib是实现
- (3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy
proxy-target-class=“true”/>)
2、相关名词的解释
(1)切面(Aspect):被抽取的公共模块,可能会横切多个对象。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。
(2)连接点(Join point):指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。
(3)通知(Advice):在切面的某个特定的连接点(Join point)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
(4)切入点(Pointcut):切入点是指 我们要对哪些Join point进行拦截的定义。通过切入点表达式,指定拦截的方法,比如指定拦截add、search。
(5)引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
(6)目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(adviced) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
(7)织入(Weaving):指把增强应用到目标对象来创建新的代理对象的过程。Spring是在运行时完成织入。
切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)。
3、自定义注解中所需注解的含义
一 、@Target 说明了Annotation被修饰的范围
- 1.ElementType.CONSTRUCTOR:用于描述构造器
- 2.ElementType.FIELD:用于描述域(类的成员变量)
- 3.ElementType.LOCAL_VARIABLE:用于描述局部变量(方法内部变量)
- 4.ElementType.METHOD:用于描述方法
- 5.ElementType.PACKAGE:用于描述包
- 6.ElementType.PARAMETER:用于描述参数
- 7.ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
二、@Retention 即描述注解的生命周期
- 1.RetentionPoicy.SOURCE:在源文件中有效(即源文件保留)
- 2.RetentionPoicy.CLASS:在class文件中有效(即class保留)
- 3.RetentionPoicy.RUNTIME:在运行时有效(即运行时保留)
三、@Documented 它是一个标记注解,即没有成员的注解
四、@Inherited 它也是一个标记注解,它的作用是,被它标注的类型是可被继承的
五、public @interface 注解名 {定义体}