Spring常见面试题
1.Spring的IOC和AOP怎么理解
2.Spring项目启动的时候会加载哪些资源,顺序是怎么样的
3.这么多的bean在容器中,Spring是如何区分的?
4.Spring中BeanFactory、FactoryBean和ApplicationContext的区别
5.Spring中bean的作用域有哪些,有什么区别
6.SpringBoot和SpringMVC区别在哪
1.Spring的IOC和AOP怎么理解
IOC:控制反转也叫依赖注入。利用了工厂模式。
1.将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。
2.在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好。
3.在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
spring的IOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了,也就是控制权的转让。
spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。
我们一般都不直接用BeanFactory,而是用它的实现类 ApplicationContext ,这个类会自动解析我们配置的applicationContext.xml
IoC,(Inverse of Control)控制反转,其包含两个内容:其一是控制,其二是反转。在程序中,被调用类的选择控制权从调用它的类中移除,转交给第三方裁决。这个第三方指的就是Spring的容器。IoC另解,依赖注入
(Dependency Injection),调用类对被调用类的依赖关系由第三方注入,以移除调用类对被调用类的引用。
直白点:
IOC 的实现方式有依赖注入和依赖查找,由于依赖查找使用的很少,因此 IOC 也叫做依赖注入。
我们之前在创建一个对象的时候都是直接 new 一个对象实例,而有了 IOC ,对象实例的创建都交给容器去实现即可。
什么是AOP?
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性
Joinpoint:连接点,程序执行过程中的某一行为,即业务层中的所有方法。。
Advice:通知,指切面对于某个连接点所产生的动作,包括前置通知、后置通知、返回后通知、异常通知和环绕通知。
Pointcut:切入点,指被拦截的连接点,切入点一定是连接点,但连接点不一定是切入点。
Proxy:代理,Spring AOP 中有 JDK 动态代理和 CGLib 代理,目标对象实现了接口时采用 JDK 动态代理,反之采用 CGLib 代理。
Target:代理的目标对象,指一个或多个切面所通知的对象。
Weaving :织入,指把增强应用到目标对象来创建代理对象的过程。
Spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的。
2.Spring项目启动的时候会加载哪些资源,顺序是怎么样的
3.这么多的bean在容器中,Spring是如何区分的?
主要是通过以下三种:(1)@Component组件,没有明确的角色。
(2)@Service在业务逻辑层(Service层)使用。
(3)@Repository在数据访问层(dao层)使用。
(4)@Controller在展现层使用。
@Bean 注解声明的方法名是放入spring容器的bean的name。
Java配置是通过@Configuration和@Bean来实现的。
@Configuration声明当前类是一个配置类,相当于一个Spring配置的xml文件。
@Bean注解在方法上,声明当前方法的返回值为一个Bean。
4.Spring中BeanFactory、FactoryBean和ApplicationContext的区别
BeanFactory:是一个 Bean 工厂,使用简单工厂模式,是 Spring IoC 容器顶级接口,是用于管理 Bean 的工厂,最核心的功能是通过 getBean() 方法加载 Bean 对象,通常我们不会直接使用该接口,而是使用其子接口 ApplicationContext。FactoryBean:是一个工厂 Bean,使用了工厂方法模式,实现该接口的类可以自己定义要创建的 Bean 实例,只需要实现它的 getObject() 方法即可。
ApplicationConext:是 BeanFactory 的子接口,扩展了 BeanFactory 的功能(高级 IOC 容器)。
5.Spring中bean的作用域有哪些,有什么区别
通过 scope 属性指定 Bean 的作用范围,包括:① singleton:单例模式,是默认作用域,不管收到多少 Bean 请求每个容器中只有一个唯一的 Bean 实例。
② prototype:原型模式,和 singleton 相反,每次 Bean 请求都会创建一个新的实例。
③ request:每次 HTTP 请求都会创建一个新的 Bean 并把它放到 request 域中,在请求完成后 Bean 会失效并被垃圾收集器回收。
④ session:和 request 类似,确保每个 session 中有一个 Bean 实例,session 过期后 bean 会随之失效。
⑤ global session:当应用部署在 Portlet 容器时,如果想让所有 Portlet 共用全局存储变量,那么该变量需要存储在 global session 中。
6.SpringBoot和SpringMVC区别在哪
spring boot只是一个配置工具,整合工具,辅助工具.
springmvc是框架,项目中实际运行的代码
Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。
Spring MVC提供了一种轻度耦合的方式来开发web应用。它是Spring的一个模块,是一个web框架。通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。
Spring Boot实现了自动配置,降低了项目搭建的复杂度。它主要是为了解决使用Spring框架需要进行大量的配置太麻烦的问题,所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box)。
Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。
对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。
总结:Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。然后发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。
所以,用最简练的语言概括就是:
Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。
7.SpringMVC原理
核心构成:② 处理器映射器(HandlerMapping):根据请求的 URL 来定位到对应的处理器(Handler)。
③ 处理器适配器(HandlerAdapter):在编写处理器(Handler)的时候要按照处理器适配器(HandlerAdapter) 要求的规则去编写,通过适配器可以正确的去执行 Handler。
④ 处理器(Handler):就是我们经常写的 Controller 层代码,例如:UserController。
⑤ 视图解析器(ViewResolver):进行视图的解析,将 ModelAndView 对象解析成真正的视图(View)对象返回给前端控制器。
⑥ 视图(View):View 是一个接口, 它的实现类支持不同的视图类型(JSP,FreeMarker,Thymleaf 等)。
① 首先,用户发送 HTTP 请求给 SpringMVC 前端控制器 DispatcherServlet。
② DispatcherServlet 收到请求后,调用HandlerMapping 处理器映射器,根据请求 URL 去定位到具体的处理器 Handler,并将该处理器对象返回给 DispatcherServlet 。
③ 接下来,DispatcherServlet 调用 HandlerAdapter 处理器适配器,通过处理器适配器调用对应的 Handler 处理器处理请求,并向前端控制器返回一个 ModelAndView 对象。
④ 然后,DispatcherServlet 将 ModelAndView 对象交给 ViewResoler 视图解析器去处理,并返回指定的视图 View 给前端控制器。
⑤ DispatcherServlet 对 View 进行渲染(即将模型数据填充至视图中)。View 是一个接口, 它的实现类支持不同的视图类型(JSP,FreeMarker,Thymleaf 等)。
⑥ DispatcherServlet 将页面响应给用户。
8.spring 的优点?