一、ioc(Inversion of Control)
1.是什么 (什么是IOC?)
IoC(Inversion of Control)控制反转,包含了两个⽅⾯:⼀、控制。⼆、反转
我们可以简单认为:
控制指的是:当前对象对内部成员的控制权。
反转指的是:这种控制权不由当前对象管理了,由其他(类,第三⽅容器)来管理。
IOC不够开⻔⻅⼭,于是Martin Fowler提出了DI(dependency injection)来替代IoC,即让调⽤类对某⼀接⼝实现类的依赖关系由第三⽅(容器或协作类)注⼊,以移除调⽤类对某⼀接⼝实现类的依赖。
IOC和DI的区别
- IoC(思想,设计模式)主要的实现⽅式有两种:依赖查找,依赖注⼊。
- 依赖注⼊(DI)是⼀种更可取的⽅式(实现的⽅式)。
总结一句话:IOC 是一种思想,DI是一种实现IOC的方法
2. 为什么要使用IOC( IOC的好处)
- 不⽤⾃⼰组装,拿来就⽤。
- 享受单例的好处,效率⾼,不浪费空间。
- 便于单元测试,⽅便切换mock组件。
- 便于进⾏AOP操作,对于使⽤者是透明的。
- 统⼀配置,便于修改。
3. 怎么用(依赖注入的方式)
- 构造方法注入
- setter注入
- 基于注解的注入(@Autowired ,利用反射机制实现,最常用)
Spring常用的三种注入方式
二、aop
1. 什么是aop
aspect object programming ⾯向切⾯编程 (一种编程思想)
⾯向切⾯编程就是指: 对很多功能都有的重复的代码抽取,再在运⾏的时候往业务⽅法上动态植⼊“切⾯类代码”。
功能: 让关注点代码与业务代码分离!
关注点:重复代码就叫做关注点
切⾯:关注点形成的类,就叫切⾯(类)!
切⼊点:
- 执⾏⽬标对象⽅法,动态植⼊切⾯代码。
- 可以通过切⼊点表达式,指定拦截哪些类的哪些⽅法; 给指定的类在运⾏的时候植⼊切⾯类代码。
切⼊点表达式:指定哪些类的哪些⽅法被拦截
2. 为什么用aop(aop的好处)
- 降低模块之间的耦合度。
- 使系统容易扩展。
- 更好的代码复用。
3. aop的使用
- 统一的事务管理
- 统一日志处理
4. 具体的aop实现
首先我们要知道,代理模式 分为静态代理和动态代理两种不同模式
静态代理:静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了
动态代理:是在程序运行时通过反射机制动态创建的。
- 由于静态代理需要实现⽬标对象的相同接⼝,那么可能会导致代理类会⾮常⾮常多…不好维护---->因此出现了动态代理,
- 动态代理也有个约束:⽬标对象⼀定是要有接⼝的,没有接⼝就不能实现动态代理…----->因此出现了cglib代理,
- cglib代理也叫⼦类代理,从内存中构建出⼀个⼦类来扩展⽬标对象的功能!CGLIB是⼀个强⼤的⾼性能的代码⽣成包,它可以在运⾏期扩展Java类与实现Java接⼝。它⼴泛的被许多AOP的框架使⽤,例如Spring AOP和dynaop,为他们提供⽅法的interception(拦截)。
Java中有两种动态代理的实现方式:
- JDK动态代理
- CGLib动态代理
JDK动态代理是需要实现某个接⼝了,⽽我们类未必全部会有接⼝,于是CGLib代理就有了~~
- CGLib代理其⽣成的动态代理对象是⽬标类的⼦类
- Spring AOP默认是使⽤JDK动态代理,如果代理的类没有接⼝则会使⽤CGLib代理。
- 那么JDK代理和CGLib代理我们该⽤哪个呢??在《精通Spring4.x 企业应⽤开发实战》给出了建议:
- 如果是单例的我们最好使⽤CGLib代理,如果是多例的我们最好使⽤JDK代理原因:
- JDK在创建代理对象时的性能要⾼于CGLib代理,⽽⽣成代理对象的运⾏性能却⽐CGLib的低。
- 如果是单例的代理,推荐使⽤CGLib
看到这⾥我们就应该知道什么是Spring AOP(⾯向切⾯编程)了:将相同逻辑的重复代码横向抽取出来,
使⽤动态代理技术将这些重复代码织⼊到⽬标对象⽅法中,实现和原来⼀样的功能, 这样⼀来,我们就在写业务时只关⼼业务代码,⽽不⽤关⼼与业务⽆关的代码