什么是spring?
-
spring是一个开源轻量级的框架,提供了IOC和AOP这两个核心功能。
IOC(控制反转)
IOC是Spring最核心的点,并且贯穿始终,但IOC更多的是控制反转的一种编程思想。
在传统的开发中,只能通过User u = new User()
来创建对象,这样导致依赖关系比较复杂,耦合度高。
控制反转就是从自己创建管理bean 到 把创建和管理 bean 的过程转移给了第三方。
在Spring框架中实现控制反转的是Spring IoC容器(BeanFactory),其具体实现就是由容器来控制对象的生命周期和业务对象之间的依赖关系,而不是像传统方式(new对象)中由代码来直接控制。
IOC将传统自己新建的对象的这个过程进行了一个反转,也就是说,我们只需要把设计好的对象(Component)交给 IOC 容器控制,然后在需要用到目标对象的时候,直接从容器中去获取(Autowried)。
带来的优势
-
IOC提供的对象默认为单列,当想要维持单列的时候我没不再需要手动编写单列代码。
-
不必关系对象创建的细节,可以将目光聚焦于业务。
-
降低了使用资源双方的依赖程度,也就是我们说的耦合度。
-
缺点:如果使用JDK动态代理来创建,那么是使用反射来创建对象,所以在效率上会有些损耗。初学者适应了new ,创建变得复杂,可能难以理解。
使用JDK代理在运行效率上有损耗,使用CGLib代理在创建上的性能有损耗
控制正转和反转
-
正转:如传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象
-
反转:反转则是由容器来帮忙创建及注入依赖对象,对象只是被动的接受依赖对象
-
哪些方面反转了?依赖对象的获取被反转了。
SpringIOC
对于IOC最重要的就是容器,在Spring中实现控制反转的是IoC容器
-
实现BeanFactory接口的简单容器
-
实现ApplicationContext接口的高级容器
DI(依赖注入)
上面说了IOC更多的是一种思想,而具体的落地实现则是DI依赖注入
依赖注入DI,将一个程序依赖的资源注入到合适的地方,也就是将BeanFactory容器的对象通过DI注入到合适的位置。
IOC和DI其实是同一个概念,只是从不同的角度描述罢了(IoC是一种思想,而DI则是一种具体的技术实现手段)。简单的说:IoC是目的(创建对象),DI是手段(怎么获取外部对象)
注入方式
实现具体的依赖注入方式有三种
-
构造器注入:
-
Set注入:
-
接口注入:已被淘汰
-
自动注入:不过在使用上更加倾向于使用@Autowird来进行实例变量的自动注入
AOP(面向切面)
AOP(Aspect Orient Programming)面向切面编程,是对OOP面向对象的一种补充,AOP不同于OOP面向对象的关注点是对象,而AOP关注的是切面。
AOP可以在不惊动方法原有的基础上对其进行一个增强,且这个增强,不会影响到原本的方法。
AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。
AOP并不是spirng独创的技术,不过在spring中使用非常便捷,它的亮点在于AOP和SpringIOC之间的紧密结合。
Aop的应用场景?
Aop的应用场景可以有 日志,安全,检查
个人的应用不是特别常用,而在一些框架中,不少都会使用AOP来进行一个增强。
-
SpringSecuirty 权限检查
-
SpringValidation 参数检查
-
Spring 事务
Spring 对 AOP的实现?
在spring中使用AOP非常简单,通过注解定义即可
-
@Before(execution) 在方法执行前拦
-
@AfterReturning(execution) 在方法正常return结束后拦截
-
@AfterThrowing(execution) 在方法抛出异常时拦截
-
@After(execution) 在方法结束后拦截,无论正常结束还是异常结束
-
@Around(execution)唯一可以使ProceedingJoinPoint参数来控制流程的advice,在 方法执行前拦截,可以在切面逻辑中手动释放拦截,且可以在其后加入逻辑代码,该代 码段会在方法执行后执行,
Aop是如何实现的?
Spring 的 AOP 实现原理其实很简单,就是通过动态代理实现的。
Spring AOP 采用了两种混合的实现方式:JDK 动态代理和 CGLib 动态代理。
-
JDK动态代理:Spring AOP的首选方法。 每当目标对象实现一个接口时,就会使用JDK动态代理。目标对象必须实现接口
-
CGLIB代理:如果目标对象没有实现接口,则可以使用CGLIB代理。
-
Cglib的实现是在字节码的基础上的,并且使用了开源的ASM读取字节码,对类实现增强功能的。
-