首页 > 代码库 > Spring学习(二)

Spring学习(二)

1、 AOP的思想(如何实现),AOP在哪些地方使用? 相关术语有哪些?

AOP是面向切面编程,它是一种编程思想,采取横向抽取机制,取代了传统纵向继承体系重复性代码的方式

应用场景有:

记录日志

监控方法运行时间(监控性能)

权限控制

缓存优化(第一次调用查询数据库,将查询结果放入内存对象;第二次调用,直接从内存对象返回,不需要查询数据库)

事务管理(调用方法前开启事务,调用方法后提交或者回滚、关闭事务)

AOP的相关术语

Aspect(切面): 是通知和切入点的结合,通知和切入点共同定义了关于切面的全部内容---它的功能、在何时和何地完成其功能

joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.

Pointcut(切入点):所谓切入点是指我们要对哪些joinpoint进行拦截的定义.

通知定义了切面的”什么”和”何时”,切入点就定义了”何地”.

Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

Target(目标对象):代理的目标对象

Weaving(织入):是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象

Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.

2、 aop的原理(动态代理:jdk,cglib)

面试题:动态代理和静态代理的区别?

动态代理:在虚拟机内部运行的时候,动态生成代理类,并不是真正存在的类,一般的格式是:Proxy$$

静态代理:实际存在代理类(例如:struts2Action的代理类是ActionProxy)

(扩展:ActionProxy在struts框架中发挥着非常重要的作用,它是action和xwork中间的一层)

JDK动态代理:针对目标对象的接口进行代理,动态生成接口的实现类!(必须要有接口)

三种方式:

方案一:在内部实现new InvocationHandler(),指定匿名内部类

方案二:传递内部类的对象,指定内部类实现InvocationHandler

方案三:直接使用调用类作为接口实现类,实现InvocationHandler接口

JDK动态代理的缺点:只能面向接口代理,不能直接对目标类进行dialing,如果没有接口,则不能使用JDK代理

CgLib动态代理

Cglib的引入为了解决类的直接代理问题(生成代理子类),不需要接口也可以代理 !

两者的区别:

l Jdk代理:基于接口的代理,一定是基于接口,会生成目标对象的接口类型的子对象。

l Cglib代理:基于类的代理,不需要基于接口,会生成目标对象类型的子对象。

3、 传统Spring AOP编程

4、 AspectJ AOP 编程 (XML或者注解 重点掌握一套 )

问题:advice(通知增强)、 advisor(传统aop切面配置标签) 、aspect(aspectj的aop切面配置的标签) 、aspectj(可以进行aop的第三方的开源框架) 区别 ?

Advice 通知 ,增强代码(前置、后置、环绕、异常抛出、引介通知)

Advisor 传统SpringAOP切面,只包含一个切入点和一个通知

Aspect AspectJ定义切面 ,可以包含多个切入点和多个通知

AspectJ 第三方AOP框架

5、@Aspectj配置切面编程

在类上添加@Aspectj注解,表示这是一个切面类,并将切面类交给spring管理

@AspectJ提供不同的通知类型,有以下几种:

@Before 前置通知,相当于BeforeAdvice

@AfterReturning 后置通知,相当于AfterReturningAdvice

@Around 环绕通知,相当于MethodInterceptor

@AfterThrowing抛出通知,相当于ThrowAdvice

@After 最终final通知,不管是否异常,该通知都会执行

@DeclareParents 引介通知,相当于IntroductionInterceptor (不要求掌握)

6、 数据源配置、JNDI配置

7、 外部属性文件 (context:placehoder)

8、 JdbcTemplate 实现 CURD

Spring学习(二)