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