IOC就是控制反转(Inversion of controller),将对象交给容器管理
目的:降低耦合度
优点:第一,资源集中管理,实现资源的可配置和易管理。
第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。
控制反转IoC是一种设计思想,DI(依赖注入)是实现IoC的一种方法
我们获得对象的方式由主动变为了被动,IOC容器
ioc是一个容器,本质上就是一个对象工厂(读取配置文件,通过反射创建类)
谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
所谓控制,指的是管理对象的权力
所谓反转,指的是由spring管理而不是开发者管理
DI(依赖注入)
控制反转IoC是一种设计思想,DI(依赖注入)是实现IoC的一种方法
谁依赖于谁:当然是应用程序依赖于IoC容器;
为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
-----------------------------------------------------------------------------------------------------------------------------
AOP为Aspect Oriented Programming面向切面编程,是一种编程思想,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
为什么会产生AOP?
使用面向对象编程 ( OOP )有一些弊端,当需要为多个不具有继承关系的对象引人同一个公共行为时,例如日志、安全检测等,我们只有在每个对象里引用公共行为,这样程序中就产生了大量的重复代码,程序就不便于维护了。
我们知道,spring中的aop是通过动态代理实现的,那么他具体是如何实现的呢?
spring通过一个切面类,在他的类上加入@Aspect注解,定义一个Pointcut方法,最后定义一系列的增强方法。这样就完成一个对象的切面操作。
AOP 底层的原理 就是 动态代理 ,真正干活的 bean 是 代理bean , 代理bean 对真实bean 功能增
AOP优势:
便于减少系统的重复代码,降低模块之间的耦合度,有利于未来的的可操作性和可维护性
AOP开发术语:
连接点(Joinpoint):连接点是程序类中客观存在的方法,可被Spring拦截并切入内容。说白了 类中的哪些方法 可以被增强 这些方法 就称为是 连接点
切入点(Pointcut):被Spring切入连接点。真正被增强的方法 称为 切入点
通知、增强(Advice):可以为切入点添加额外功能,分为:前置通知、后置通知、异常通知、环绕通知,最终通知等。实际增强的逻辑部分称为通知(增强)
目标对象(Target):代理的目标对象 真实对象
引介(Introduction):一种特殊的增强,可在运行期为类动态添加Field和Method。
织入(Weaving):把通知应用到具体的类,进而创建新的代理类的过程。
代理(Proxy):被AOP织入通知后,产生的结果类。
切面(Aspect):由切点和通知组成,将横切逻辑织入切面所指定的连接点中。是一个动作 把通知 应用到 切入点的过程
AOP的使用场景:
AOP用来封装横切关注点,具体可以在下面的场景中使用:
Authentication 权限、Caching 缓存、Context passing 内容传递、Error handling 错误处理、Lazy loading 懒加载、Debugging 调试、logging, tracing, profiling and monitoring 记录跟踪优化校准、Performance optimization 性能优化、Persistence 持久化、Resource pooling 资源池、Synchronization 同步、Transactions 事务。
AOP应用场景
场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )
说明:
jdk动态代理是接口的重写(适用于实现接口的类,spring aop的默认实现)
cglib动态代理是类的继承
提示:aop本质是动态对方法增强,避免代码入侵,优雅的实现横向扩展,是对oop的补充