什么是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 环绕
try{
try{
//@Before
method.invoke(..);
}finally{
//@After
}
//@AfterReturning
}catch(){
//@AfterThrowing
}
可以使用 @Order 注解规定切面的执行顺序,参数越小有限度越高,继承 Order 接口实现 getOrder()方法也有同样效果。实际上,@Order 的作用是定义Spring 容器中加载 Bean 的顺序。