很多面试的时候都会问关于AOP和IOC的问题,因此在这里做个总结:
首先,为什么要用spring?
答:spring能够很好的和各大框架整合,spring通过IOC容器管理了对象的创建和销毁 工厂模式(设计模式),在使用hiberna丶mybatis的时候,不用每次都编写提交事务的代码,可以使用spring的AOP来管理事务。
什么是AOP?
答:(Aspect oriented Propramming) 即面向切面编程,它弥补了OOP(Object Oriented Programming)面向对象编程的不足;AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码的编写方式;
两种实现方式:
JDK的动态代理:只能对实现了接口的类产生代理;缺点:必须让目标对象实现接口,才能使用JDK代理。如果目标对象实现接口,spring默认采用JDK代理
Cglib的动态代理: 可以对没有实现接口的类产生代理。产生了子类对这个类进行增强,如果目标对象没有实现接口,spring采用cglib代理
Spring 的AOP开发中的相关术语:
Aspect(切面): 是通知和切入点的结合,通知和切入点共同定义了关于切面的全部内容---它的功能、在何时和何地完成其功能
joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些joinpoint进行拦截的定义. 通知定义了切面的”什么”和”何时”,切入点就定义了”何地”.
Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Target(目标对象):代理的目标对象
Weaving(织入):是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象
Introduction(引入)(不要求掌握):在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
常见AOP应用场景:
logging, tracing, profiling and monitoring 日志记录,跟踪,优化
Synchronization 同步
Transactions 事务管理
Performance optimization 性能优化,效率检查
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 延迟加载
Authentication 权限检查
AOP概念图分析:
IOC:控制反转(Inversion of Control,英文缩写为IoC)。控制反转:即将对象的创建权反转给Spring。
依赖注入的思想实际是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。 总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring中创建被调用者的工作由Spring来完成,然后注入调用者,即所谓的依赖注入和控制反转。
注入方式有两种:依赖注入和设置注入;
IoC的优点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象
IOC和DI的区别:
IOC:控制反转,将对象的创建权交给Spring。DI:在Spring创建这个类的过程中,把这个类所依赖的属性设置进来。