面试记录:IOC 与 AOP
什么是ioc,ioc 的好处?
ioc(Inverse of Control:控制反转) ,一种设计思想, 将原本在程序中手动创建对象的控制权,交由 spring 框架来管理。ioc 在不同的语言有不同的实现。
所谓控制反转,意为将在程序中创建对象的控制权转移到 ioc 容器,调用者只需要在使用时从 ioc 容器中取出,如果一个工具对象的创建过程需要的依赖多,创建过程繁琐,使用 ioc 提前配置好对象即可极大的简化开发,还能达到一个解耦合的效果。
在 spring 中,ioc 容器实际上是个 Map ,Map 中存放各种对象。早期的 spring 框架需要使用 xml 进行对象的配置
AOP
aop(Aspect-Oriented Programming) 面向切面的编程,将与业务无关,却要跟业务方法共同调用的逻辑或责任(事物,日志),进行封装,用增强的形式添加到业务方法,我们不需要去变动业务方法本身就可以执行这些逻辑。
在 spring 中使用 aop 可以用 Spring AOP 或 AspectJ。
AOP 术语
目标 Target:被通知的对象
代理 Porxy:向目标对象通知后生成的代理对象
连接点 JoinPoint:目标对象所属的类中定义的方法
切入点 PointCut:被拦截/增强的连接点
通知 Advice:增强的逻辑/代码
切面 Aspect:切入点和通知(已经切入连接点的通知)
织入 Weaving:将通知应用到目标对象,进而生成代理对象的过程动作
Spring AOP 和 AspectJ AOP
Spring AOP 是运行时增强, 于 JDK 动态代理(JDK Proxy),AspectJ 则是编译时增强,是字节码操作。
有大量 AOP 操作时,建议使用 AspectJ,性能要强一些。
AspectJ 的通知类型
Before 前置
After 后置
BeforeReturning 返回
AfterThrowing 异常
Around 环绕
可以使用 @Order 注解规定切面的执行顺序,参数越小有限度越高,继承 Order 接口实现 getOrder()方法也有同样效果。实际上,@Order 的作用是定义Spring 容器中加载 Bean 的顺序。