谈谈你对Spring的理解?
Spring 的核心就是 IOC 和AOP。
IOC(Inverse Of Control)控制反转,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。 Spring使用IOC容器来实现IOC, IOC容器实际上就是个Map(key,value),key就是Bean的ID,value就是对应的Bean对象。通过将对象之间的相互依赖关系交给IOC容器来管理,然后IOC容器来完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。IOC容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。 然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。
AOP基于代理设计模式,代理分为动态代理和静态代理,在项目中默认使用的是基于JDK的动态代理,它需要接口的支持,这就是在写 service 业务逻辑层的时候通常先写接口,再写实现类的原因,如果没有接口只有类,这个时候可以使用 CGLib 这个动态代理来实现。AOP说白了就是面向切面编程,就是把一些非核心业务逻辑提取出来形成一个切面,从而让咱们程序员在编写代码时候,只用关注核心业务逻辑的处理,至于这些非核心业务逻辑统一在切面里面处理。 像日志记录,性能统计,事务处理,安全控制,这些都可以通过AOP的方式进行统一的处理。切面说的简单点就是在指定类的指定方法的前后执行特定的横切业务逻辑。切面由切点和通知构成,通知又包括方位和横切业务逻辑,切点就是为了定位指定类的指定方法,方位包括前置通知,后置通知,环绕通知,抛出异常通知,返回后通知这些。横切业务逻辑说白了就是一些公共的非核心业务代码。AOP的切面在项目中用的还是比较多的,咱们都知道事务管理就是通过AOP切面的方式来实现的。切面的好处就是把分散在代码中的重复代码提取出来进行统一的维护和控制。我在项目中就使用aop完成日志的统一处理。原来是把日志记录的相关代码分散到各个控制层的相关方法中,但这就会导致程序员在开发时候不能将精力集中到业务逻辑的处理上,还得考虑记录日志,工作效率就大打折扣,我在项目中负责过日志管理模块,通过...[可以将基于AOP的日志统一处理融进去]。