在学习Spring相关知识时,会经常提到两大概念,那么这两大概念也是在面试过程中,经常被提及的问题,接下来就为大家整理一篇和面试官硬怼的文章。
一、Spring IOC
Ioc:Inversion of Control —— 控制反转
:代表原来由程序本身去控制对象之间的依赖关系的这种格局被反转了,通过第三方容器(IOC)去完成控制这些对象的依赖的关系并对它们进行集中管理。
DI:Dependency Injection —— 依赖注入
:获得依赖对象的过程由自身管理变为了由IOC容器主动注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
IOC是spring的两大核心概念之一,IOC给我们提供了一个IOCbean容器,这个容器会帮我们自动去创建对象,不需要我们手动创建,IOC实现创建的通过DI(Dependency Injection 依赖注入),我们可以通过写Java注解代码或者是XML配置方式,把我们想要注入对象所依赖的一些其他的bean,自动的注入进去,他是通过byName或byType类型的方式来帮助我们注入。正是因为有了依赖注入,使得IOC有这非常强大的好处——解耦。
可以举个例子,JdbcTemplate
或者SqlSessionFactory
这种bean,如果我们要把他注入到容器里面,他是需要依赖一个数据源的,如果我们把JdbcTemplate
或者Druid
的数据源强耦合在一起,会导致一个问题,当我们想要使用Jdbctemplate
必须要使用Druid数据源,那么依赖注入能够帮助我们在Jdbc注入的时候,只需要让他依赖一个DataSource接口,不需要去依赖具体的实现,这样的好处就是,将来我们给容器里面注入一个Druid数据源,他就会自动注入到JdbcTemplate
如果我们注入一个其他的也是一样的。比如说c3p0也是一样的,这样的话,JdbcTemplate
和数据源完全的解耦了,不强依赖与任何一个数据源,在spring启动的时候,就会把所有的bean全部创建好,这样的话,程序在运行的时候就不需要创建bean了,运行速度会更快,还有IOC管理bean的时候默认是单例的,可以节省时间,提高性能。
Spring AOP
AOP(Aspect Oriented Programming)是面向切面编程,同样也是Spring的两大核心概念之一。在日常开发中,会遇到很多重复性的代码,比如事务和日志,我们需要在很多类中把这些代码同时写进去,这样的话就非常麻烦。比如说事务,我们需要在所有的service层中开启事务、提交事务、回滚。那么,Spring AOP就给我们提供了一种方式,把这些共有的代码抽象出来,然后切入到我们需要切入的类中,这样就极大地方便了代码的书写,减少了冗余的代码,提高了代码的复用性。AOP是依靠动态代理实现的,如果我们将来要代理的对象,它有接口就可以使用Java原生的代理带完成动态代理的创建。如果没有实现任何的接口,可以采用cglab的方式进行代理类的创建。
AOP术语:
- target:目标类,需要被代理的类。例如:UserService
- Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法
- PointCut 切入点:已经被增强的连接点。例如:addUser()
- advice 通知/增强,增强代码。例如:after、before
- Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.
- proxy 代理类
- Aspect(切面): 是切入点pointcut和通知advice的结合
一个线是一个特殊的面。
一个切入点和一个通知,组成成一个特殊的面。
拓展:SpringMVC 的大致实现过程
1.用户发起一个request请求,如果有多个DispatcherServlet,则通过Servletmapping去指定执行的DispatcherServlet。
2.DispatcherServlet把根据URL请求,去HandlerMapping中查找注册了的URL映射,并返回相应的Handler(一个Controller,多个拦截器),给DispatcherServlet。
3.DispatcherServlet传递Handler给HandlerAdapter去执行,返回一个ModelAndView。
4.DispatcherServlet把ModelAndView传递给视图解析器去解析,返回一个视图view。
5.组装上Model数据后变成Response请求返回给客户端。