一.spring的作用和优势
1.创建spring的目的是为了代替更加重量级的企业级Java技术,也就是说spring提供了更加轻量级和简单的编程模型
为了降低Java的开发的复杂性,spring采取了以下4种策略:
.基于POJO的轻量级和最小侵入性编程
.通过依赖注入和面向接口实现松耦合
.基于切面和惯例进行声明式编程
.通过切面和模板减少样式代码
二.IOC和DI的区别
1.ioc:控制反转,把对象创建交给spring进行配置
2di:依赖注入,向类里面的属性中设置值
3.关系:依赖注入不能单独存在,需要在ioc的基础上完成操作
好处:做到单一职责,并提高了复用性,解耦之后,不管怎么使用接口的引用调用的方法,永远不需要改变。
三.AOP面向切面编程
好处:每个关注点都集中于一个地方,而不是分散多处代码中。其次服务模块更简洁因为他们只包含关注点的代码,而次要的关注点被转移到切面中。
AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。
AspectJ是静态代理的增强,所谓的静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。
Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler
接口和Proxy
类。
aop术语:通知,连接点,切点,切面,引入,织入
4种类型的aop
。基于代理的经典springAOP(笨重复杂)
。纯POJO切面(需要xml配置)
。@AspectJ注解驱动切面(可以不使用xml)
。注入式AspectJ切面(超过简单方法调用(构造器或属性拦截))
前三种是springAop实现的变种。
spring使用AspectJ注解来声明通知方法
@After 通知方法会在目标方法返回或抛出异常后调用
@AfterReturning 通知方法会在目标方法返回后调用
@AfterThrowing 通知方法会在目标方法抛出异常后调用
@Around 通知方法会在目标方法封装起来
@Before 通知方法会在目标方法调用之前执行