目录
1、关于控制反转 ioc
- 控制反转:所谓的控制反转。通俗地讲,就是把原本需要程序员自己创建和维护的一大堆bean统统交由Spring管理。
- 总体思想:类似于有一个具有全局视角的boss(IOC容器),减弱了之前一层一层的强依赖,降低了耦合度。不再通过 new 关键字来创建对象,而是通过 IoC 容器(Spring 框架) 来帮助我们实例化对象。我们需要哪个对象,直接从 IoC 容器里面过去即可。
- 具体如何使用:如果在程序中需要某个对象,可以使用@Autowird注解,IOC容器就会生成这个对象,然后就可以在程序中使用了。
- 底层原理:
IOC 本质上是一个容器,以 MAP 对 IOC 简单举例:服务器加载配置文件,由 xml 文档 解析工具读取 文件中bean 的 ID,获取到 class,使用反射创建对象,以 K-V 的形式存入 MAP,K 是 ID, V 是反射创建的对象。获取对象可以调用 context.getBean(K)的方式。
2、关于面向切面 AOP
- 面向切面:通俗地讲,它一般被用来解决一些系统交叉业务的织入,比如日志啦、事务啥的。将相同逻辑的重复代码横向抽取出来,使用动态代理技术将这些重复代码织入到目标对象方法中,实现和原来一样的功能。
- 底层原理:动态代理(使用动态代理实质上就是调用时拦截对象方法,对方法进行改造、增强!)
1)动态代理的两种方式:
- jdk动态代理 --- 针对实现了接口的对象;
Spring AOP默认是使用JDK动态代理,如果代理的类没有接口则会使用CGLib代理。
- CGLib动态代理 --- 针对没实现接口的对象。
CGLib代理其生成的动态代理对象是目标类的子类
2) 那么JDK代理和CGLib代理我们该用哪个呢??
单例最好使用CGLib,多例使用jdk动态代理。因为创建性能这方面jdk更好(为啥?有接口的创建性能更好),所以需要创见多个实例的时候,jdk效果可能更好;运行性能CGLib更好(为啥?没接口的对象创建好了调用其方法更快),所以单例的情况下效果可能更好。
- JDK在创建代理对象时的性能要高于CGLib代理,而生成代理对象的运行性能却比CGLib的低。
- 如果是单例的代理,推荐使用CGLib