一、Spring的IOC机制和AOP机制
IOC是典型的工厂模式,通过sessionfactory去注入实例。
spring ioc的实现过程
- 工程中通过maven引入一些spring框架的依赖,ioc功能
- tomcat启动时,启动spring容器
- spring ioc,spring容器,根据xml配置,或者是你的注解,去实例化bean对象,根据xml配置或者注解,对bean对象之间的引用关系,去进行依赖注入。
spring ioc底层实现的核心技术是反射,他会通过反射的技术,直接根据你的类去自己构建对应的对象出来,用的就是反射技术
spring ioc 主要解决了 系统的类与类之间彻底的解耦合
Spring的AOP机制
1. AOP(Aspect-OrientedProgramming,面向方面编程)
可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。静态代理是编译期实现,动态代理是运行期实现,可想而知前者拥有更好的性能。
2. 实现AOP的技术
主要分为两大类:一是采用【动态代理技术】,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用【静态织入】的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
3. AOP用来封装横切关注点,具体可以在下面的场景中使用
- Authentication 权限,
- Caching 缓存,
- Context passing 内容传递,
- Error handling 错误处理,
- Lazy loading 懒加载,
- Debugging 调试,
- logging, tracing, profiling and monitoring 记录跟踪 优化 校准,
- Performance optimization 性能优化,
- Persistence 持久化,
- Resource pooling 资源池,
- Synchronization 同步,
- Transactions 事务
4. AOP 的作用
AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
5. AOP中相关的概念定义
- Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
- Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
- Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
- Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个joint point 之前、之后还是代替执行的代码。
- Target(目标对象):织入 Advice 的目标对象.。
- Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
6. Advice 的类型
- before advice:在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码)
- after return advice:在一个 join point 正常返回后执行的 advice
- after throwing advice:当一个 join point 抛出异常后执行的 advice
- after(final) advice:无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice
- around advice:在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice
- introduction:introduction可以为原有的对象增加新的属性和方法。
7. Spring AOP的两种代理实现机制
【JDK动态代理】和【CGLIB动态代理】
静态代理是编译阶段生成AOP代理类,也就是说生成的字节码就织入了增强后的AOP对象;
动态代理则不会修改字节码,而是在内存中临时生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。
JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。
JDK动态代理的核心是InvocationHandler接口和Proxy类。 如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。
CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的,诸如private的方法也是不可以作为切面的。
8. cglib动态代理跟jdk动态代理的区别是
1,spring里使用aop,对一批类和他们的方法做了一个切面,定义好了要在这些类的方法里增强的代码,spring必然要对那些类生成动态代理,在动态代理中去执行你定义的一些增强代码。
2,核心是动态的创建一个代理类出来,创建这个代理类的实例对象,在这个里面引用你真正自己写的类,所有的方法的调用,都是先走代理类的对象,他负责做一些代码上的增强,再去调用你写的那个类。优先是jdk动态代理,其次是cglib动态代理
3,如果你的类是实现了某个接口的,spring aop会使用jdk动态代理,生成一个跟你实现同样接口的一个代理类,构造一个实例对象出来,jdk动态代理,他其实是在你的类有接口的时候,就会来使用。
4,很多时候我们可能某个类是没有实现接口的,spring aop会改用cglib来生成动态代理,他是生成你的类的一个子类,他可以动态生成字节码,覆盖你的一些方法,在方法里加入增强的代码