Spring是一个轻量级的框架,他有两大核心思想IOC和AOP。
IOC(控制反转):简单来说,就是将对象的创建权交给第三方容器。在项目中,我们一开始是自己通过实体类new一个对象,有了Spring以后,Spring容器会自动帮我们创建对象,不需要我们自己去new一个对象,我们使用的时候只需要注入对象就行了。
为什么需要控制反转呢?
降低类与类之间耦合性,在java中,所有的程序药品遵循高内聚,低耦合的原则开发项目。如果项目之间过于紧密,一旦发生问题,整个项目容易发生瘫痪。
什么是解耦?
硬编码耦合:当A类中直接new了一个B类,则称之为A类硬编码耦合了B类。如果B类的构造方式发生了变化,则需要去修改A类,如果有很多类都引用了B类,则这些类都要去一一修改,这种编码方式会极大的提高了程序的维护成本。
解耦:消除类与类之间的强依赖性(耦合性)。将对象的创建方式交给第三方容器,其他类中,如果需要获得这个对象,再从容器中获取(配置、注解的方式进行注入),这种方式的好处在于B类的构造方式发生变化时,对其他所有类没有任何影响。
问题:正式开发时,是否会经常对一个类的构造形式进行修改?如果修改频率不高,IOC是否没有意义?
AOP(面向切面编程):其实这也是一种思想。在实际的开发过程中,通常会有很多业务,业务一般分为两部分,一部分是核心业务部分(每个业务都不相同),另一个是非核心业务部分(但有很多相同的业务,如开启事务、开启资源、记录日志、行为记录等),将非核心代码部分从整合的业务中抽离出来的独立编写的开发模式,就是面向切面编程。
AOP的底层实现原理:JDK的动态代理+Cglib的动态代理
静态代理和动态代理的区别:
静态代理:需要开发者手动的编写代理类,创建代理对象
动态代理:会自动的创建代理对象
AOP就是动态代理
什么是静态代理?
为什么Spring要准备JDK的动态代理方式和Cglib的动态代理方式两种?
答:JDK是基于接口实现,Cglib是基于父类实现。