Spring框架能给我带来哪些好处
- 简化开发
- Spring提供了很多内置的解决方案,比如BOP编程思想、IoC、AOP编程思想
- 声明式事务管理,TransactionManager管理事务
- 提供了很多工具类、围绕Spring生态来实现的,比如JDBCTemplate
谈谈你对SpringBean的理解
在Spring中,构成应用程序主干并由Spring IoC容器管理的对象成为Bean。Bean是由一个Spring IoC容器实例化、组装和管理的对象。
Spring Bean的定义包含哪些内容
class - 类名
scope 作用域-单例|多例
lazy-init 延迟加载
depends-on 依赖的对象
name|id 定义的名字或者id
constructor-arg 初始化方法
properties
init-method 初始化时会调用的方法
destroy-method 销毁时会调用的方法
项目中如何使用AOP
声明式事务管理、日志兼容、权限管理、安全监控、限流。
BeanFactory和ApplicationContext有什么区别
- ApplicationContext是BeanFactory的实现类。
- BeanFactory是顶层设计,而ApplicationContext是User Interface。
- ApplicationContext功能方法非常多,API最全的,一般会被开发者任务ApplicationContext就是IoC。
- 实际上IoC的功能是在DefaultListableBeanFactory类中完成的,有共同的接口BeanFactory。
请解释Spring Bean的生命周期
简单来说,所谓生命周期就是从创建、到调用、到销毁的一个过程。
如果是单例对象,那么生命周期也就是Spring容器的启动到Spring容器销毁的过程。如果是延时加载的单例对象,那么就会在调用前创建对象。
如果是多例对象,在调用前创建、调用后销毁。它的作用域决定了生命周期的长短。
Spring Bean各作用域之间的区别
- 单例对象作用域是全局的,在任何地方都可以通过IoC容器拿到它。
- 多例对象的作用域也是全局的。
- request的作用域是在一次请求发起和结束之间。
- session的作用域在一个session创建和session失效之间,一般默认是30分钟,可以修改
- global-session可以理解为容器中的一个应用。spring5后移除了
为什么Spring中的每个Bean都要定义作用域。
在我们使用Spring Bean的时候,有些对象是全局唯一的、有的对象只在一次请求中唯一、有些对象是在一次会话中唯一、有些对象每次使用都是新的对象,这些都是因为需求而设计的。
比如request作用域范围是每次发起请求直至拿到响应结果,是从WebApplicationContext整个作用域范围内取的。
session作用域范围是浏览器首次访问至浏览器关闭是从ApplicationContext取的。
Spring中的bean是线程安全的么。
坑题。Spring中的bean是否线程安全和Spring无关的,和开发者写的代码有关,想他线程安全那就线程安全,想不安全那就不安全。
Spring中用到了哪些设计模式
23种设计模式基本都用了,列举一下吧
-
工厂模式(BeanFactory)
-
单例模式(容器式单例 AbstractBeanFactory类、Map)、
-
原型模式(容器式多例 AbstractBeanFactory)、
-
代理模式、(ProxyFactoryBean)
-
策略模式(Resource)
-
享元模式、
-
门面模式、(JdbcUtils、Request)
-
适配器模式、Aop里的(AdvisorAdapter)
-
委派模式、(DefaultBeanDefinitionDocumentReader)
-
装饰器模式、(TransactionAwareCacheDecorator)
-
责任链模式
-
建造者模式(BeanDefinitionBuilder)
-
解释器模式(ExpressionParser)
-
观察者模式(ContextLoaderListener)
Spring、SpringBoot、Spring Cloud到底有什么区别
- Spring是已有的生态、本身Spring就已经能够完成日常开发的所有功能了。
- SpringBoot是在Spring的基础上,再次封装,目的是为了简化开发,因为Spring的配置文件很多,管理起来很麻烦。Spring Boot里面内置了很多默认的配置、我们需要覆盖的时候才需要配置。
- Spring Boot还提供了一套脚手架、一键搭建、节省空间。
- SpringCloud正式进军分布式、比如注册中心、服务发现、监控-链路追踪、配置中心、负载、熔断、来打造一个新的生态。
- Spring Cloud依赖Spring Boot、SpringBoot依赖Spring。
Spring事务是怎么传播的。
Spring事务的传播是由TransactionManager控制的,TransactionManager是一个代理的类。
TransactionManager的execute()方法会拿到一个DataSource,通过DataSource可以拿到Connection。利用AOP的原理、在Before()方法执行前,先将AutoCommit设置为false,再将After()里面方法执行后,通过判断条件、判断事务是回滚还是提交。执行完之后,再将连接关闭。
Spring MVC
说下Spring MVC的执行流程
-
用户先发送请求到前端控制器DispatcherServlet。
-
前端控制器收到请求后调用处理器映射器HanderMapping。
-
处理器映射器根据请求url找到具体的处理器,生成处理器执行链并返回给前端控制器。
-
前端控制器根据处理器返回的信息获取适配器执行一系列操作,如参数封装、数据格式转换、数据验证等。
-
处理器适配器会调用并执行后端控制器Controller。
-
等控制器执行完成后返回ModelAndView给处理器适配器。
-
处理器适配器将ModelAndView对象返回给前端控制器。
-
前端控制器将ModelAndView传给ViewReslover视图解析器。
-
视图解析器返回具体的视图View,前端控制器就对视图进行渲染。
-
最后响应给用户。
Spring boot
Spring boot的核心注解是哪个?由哪些注解组成
启动类上面的注解是@SpringBootApplication,是SpringBoot的核心注解,SpringBootApplication里面包含
- @SpringBootConfiguration:内部其实就是@Configuration注解,实现配置文件的功能,相当于一个beans.xml文件。
- @EnableAutoConfiguration:打开自动配置的功能,将所有符合自动配置条件的bean定义加载到Ioc容器。
- @ComponentScan:自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。
springBoot 的自动装配原理是什么
主要是Spring Boot的启动类上的核心注解SpringBootApplication注解配置类,有了这个配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。
@EnableAutoConfiguration就会
-
从配置文件的META-INF/Spring.factories文件里 加载可能用到的自动配置类。并将其中对应的配置类通过反射进行一个实例化,然后汇总并加载到IOC容器里。
-
当然这些配置类要加入到IOC容器里也是需要条件的
-
spring.factories里面有这个类的配置类。
-
pom.xml必须有对应的jar包。
-
你如何理解Spring Boot配置文件加载顺序
-
properties文件。
-
yaml文件。
-
系统环境变量。
-
命令行参数。
如果springBoot想使用xml配置,要如何做
springboot推荐使用注解来配置,但是也可以使用xml配置,通过@ImportResource注解可以引入一个xml配置。
SpringBoot的启动过程是怎么样的
SpringBoot的启动主要是 通过实例化SpringApplication来启动 的。其中主要做了几件事情。推断WebApplicationType,在classPath里搜索特定的类。在Sprint.factories文件配置里查询需要字段配置类以及ApplicationListener的实现类。详细过程主要是在run方法中
-
创建定时器stopWatch并启动。
-
获取并允许listeners。
-
打印banner。
-
创建上下文ApplicationContext,判断是否需要启动tomcat。
-
预处理上下文,刷新上下文,添加后置处理器。
-
再刷新上下文,给后置处理器排序。
-
监听器发布完成。
-
定时器stopWatch停止计时。
-
打印启动日志。