1.你理解的Spring是什么?
spring 它是一个生态,可以帮助我们构建java应用的一切基础设施。
通常Spring指的是Spring FrameWork。
核心解释:
1.Spring是一个轻量级的,开源的容器框架。
2.Spring是一个IOC 和 AOP的容器框架。
IOC:控制反转。
AOP:面向切面编程
容器:包含并管理应用对象的生命周期
3.Spring是为了解决企业级应用开发的业务逻辑层和其他层对象和对象之间的耦合问题。
2.Spring的优缺点是什么?
1.先总结Spring中有哪些特性?(优点)
IOC,AOP,声明式事务,集成框架的能力,
封装了一些功能性代码: 简化开发
- 访问jdbc->jdbcTemplet,
- 进行远程调用 resttemplet
- 发邮件 .....
或者从源码层面去回答:(优点)
1.IOC: 集中管理了对象,使对象和对象之间的耦合度降低了,方便维护对象。
2.AOP: 在不修改代码的前提下,对业务代码进行增强,减少重复代码,提高开发效率,维护更方便。
3.声明式事务:提高开发效率,只需要一个简单的注解@Transaction
4.方便程序测试:Spring实现测试使我们可以结合Junit,非常方便测试SpringBean,SpringMVC接口直接调用
5. 集成各种优秀框架: Spring拥有非常强大的粘合度,集成能力非常强,只需要简单的配置就可以集成第三方框架。、
6.简化开发,帮助我们封装了很多功能性代码。直接拿来调用。
7.Spring底层的实现,大量用到了反射,设计模式。提供了非常多的扩展接口,供我们外部进行拓展。
缺点:
- 应用层面 无缺点。
- 简化了我们的开发,如果想深入底层了解,非常困难(上层使用越简单,底层封装越复杂)
- 源码缺点: 由于spring大而全(要集成那么多的框架,提供非常多的扩展点,经过了十多年代码迭代,代码量非常庞大,一百多万行) 对于我们深入学习源码,带来了一定的困难。
3.Spring IOC优点是什么?
IOC 控制反转, 控制了什么?
以前创建对象由程序员自己去new
UserService userService = new UserService(); //问题: 耦合度太高,维护不方便
引入IOC之后,就将创建对象的控制权,交给Spring来管理。
以前是程序员自己控制去创建对象。现在创建对象交给Spring的IOC,如果要去使用对象, 需要通过DI(依赖注入) @AutoWired(自动注入),就可以使用对象。
优点:1.集中管理了对象,方便维护 。 2. 降低耦合度
4.Spring IOC的实现机制是什么?(***)
简单工厂 + 反射
5.Spring IOC 和DI 的区别是什么?(**)
ioc:控制对象的使用权。用来解决耦合的一种设计思想
DI:是IOC的实现,是实现IOC重要的一个环节。
对象: 你自己创建的
bean: IOC容器创建的
6.紧耦合和松耦合的区别?
直接new对象,如果这些代码写的过多,会加重类和类之间的高度耦合。
紧耦合: 类之间的高度依赖
松耦合:通过一系列原则去达到松耦合(单一职责,接口分离原则)
7.BeanFactory的作用 *
1.BeanFactory是Spring中非常核心的一个顶层接口。
2。它是Bean的工厂,它的主要职责是生产Bean
3.它实现了简单工厂设计模式,通过getBean传入标识,生产一个Bean
4.它有非常多的实现类,每个工厂都有不同的职责(单一职责)功能,最强大的工厂是:
DefaultListableBeanFactory Spring底层使用该实现工厂进行生产Bean的
5.BeanFactory它也是一个容器, Spring容器---- 管理Bean的生命周期
tomcat - servlet容器
8.BeanDefinition作用
主要负责存储Bean的定义信息: 决定着Bean的生产方式
可以把BeanDefinition当成Bean的一个图纸,它里面定义着Bean应该怎么生产的一系列指标
9.BeanFactory和ApplicationContext的区别
1.共同点: 都可以当做容器
关系:ApplicationContext 实现了FactoryBean接口
2.区别:
BeanFactory getBean方法 来生产Bean
ApplicationContext 实现了BeanFactory 接口,它不生产Bean,而是通知BeanFactory 来进行生产。
- ApplicationContext 会自动帮我们把配置的Bean 注册进来, BeanFactory需要手动注入
- 加载环境变量
- 支持多语言
- 实现事件监听
- 注册很多对外扩展点
BeanFactory 优点 : 内存占用率小,可以用于嵌入式设备
10.BeanFactory 和 FactoryBean 区别
BeanFactory 是一个容器, 它用来管理和生产Bean
FactoryBean 是一个接口,不能单独存在,必须被一个Bean去实现。 它是一个特殊的Bean,也是由BeanFactory来管理
11.SpringIOC容器加载过程(Bean的创建过程)。(*****)
SpringIOC容器加载是从什么时候开始的?
答: 从new ApplicationContext() --> Spring上下文/容器 时开始 , 一般是new 它的实现类因为它是一个接口。
四种形态:
1.概念态:我们为SpringBean 类进行了配置(XML/注解),但是IOC容器还未被加载
2.定义态: 配置的Bean的定义信息,一个Bean的配置信息,就会被读取成一个BeanDefinition对象。
3. 纯静态(自动注入的属性还没被赋值):当配置信息被加载完成后,就要进行对象的创建。 IOC的实现机制是通过反射
4.成熟态。
11.什么是SpringBean? JavaBean和SpringBean 和 对象之间的区别
被SpringIOC管理的对象就是Bean。 Bean是一个被SpringIOC容器实例化,组装和管理的对象。
Java的类就是JavaBean
区别:
JavaBean对象是自己实例化出来的
Bean对象是由SpringIOC容器创建的
12.配置Bean的几种方式
@Bean : 通常标注在方法上面,会结合@Configuration注解,一起使用。
13.配置Bean的作用域
单例:默认的
多例:
14.单例Bean的优势
1.提高了服务器内存的利用率,减少服务器内存消耗
2.减少jvm垃圾回收负担
3.可以快速获取对象,从缓存中
15。SpringBean是线程安全的吗?
单例Bean的情况:
如果在类中声明了成员变量,并且有读写的操作(有状态的),就是线程不安全的
但是: 我们只需要把成员变量声明在方法中(无状态的),单例Bean为线程安全
16.Spring如何解决线程并发问题?
1.设置为多例
2.将成员变量放到ThreadLocal中
这时的username是绑定在各自的线程上面,username是各个线程独有的,避免了线程不安全
3.加入同步锁 synchronized ,会影响服务器的吞吐量
17.Spring实例化Bean的几种方式
18.Bean的装配和Bean的自动装配
手动装配
自动装配:Autowared ,让对象和对象之间联系起来
19. 自动注入有什么限制?
20. 自动装配的方式
1.默认
2.根据byName,会找到类中的set方法,通过set方法后面的参数名称,将首字母小写,去IOC容器中找到对应的Bean对象,从而进行自动装配。
21.Bean有哪些生命周期的回调方法,哪几种实现方式?
初始化
销毁
22.SpringBean在加载过程中Bean有哪几种形态
23 Bean的生命周期
指的是Bean从创建到销毁的整个过程
分为4步:
1.实例化:
a.通过反射去推断它的构造函数进行实例化\
b.通过实例工厂,静态工厂
2.属性赋值
a.解析自动装配 (byName,byType,construct,@Autowared) DI的体现
b,循环依赖
3.初始化
a.调用 xxxAware回调方法,
b.调用初始化的生命周期回调(3种)
c.如果Bean实现了AOP,会创建动态代理
4.销毁
a.在Spring容器关闭时进行调用。
b.调用销毁生命周期的回调。
24. Spring如何帮助我们在并发下避免获取不完整的Bean
双重检查锁: 两次synchronized
25. 如何在所有BeanDefinition注册完后做扩展?
Bean工厂的后置处理器
26.Spring 容器启动时,为什么先加载BeanFactoryPostProcessor?
1.因为BeanDefinition会在IOC容器加载时先注册,而BeanFactoryPostProcessor 就是在所有的BeanDefinition注册完后做扩展的,所以要先加载BeanFactoryPostProcessor
2.解析配置类的组件,实现了BeanFactoryPostProcessor,所以要先加载BeanFactoryPostProcessor
27.
28.Spring有哪几种配置方式?
29.JavaConfig是如何替代Spring.xml的?
一。应用层面
1.以前xml
a.Spring容器 : ClassPathXmlApplicationContext(“xml”)
b.Spring.xml
c.<bean scope lazy>
d.扫描包: <component-scan>
e.引入外部属性配置文件:<property-placeHoldeler resource="xxx.properties">
f.指定其他配置文件: <import resource="">
g.<property name="password" value="${mysql.password}"></property>
2.javaConfig
a.Spring容器:AnnotationConfigApplicationContext(“javaconfig.class”)
b.配置类 @Configuration - 相当于Spring.xml
c.@Bean @Scope @Lazy
d.扫描包:@ComponentScan
e.@PropertySource("classpath:db.properties")
f.@import 使用灵活 @import({导入配置类 })
g.@Value("")
二、源码层面
36.@Component,@Controller,@Repository,@Service有什么区别?
@Controller,@Repository,@Service 就相当于是@Component
37.
38.如何让自动注入没有找到Bean的时候,不报错
39.如何让自动注入找到多个依赖Bean时,不报错
40.@Autowired有什么作用?
41.@Autowired 和@Resource区别
都可以为属性进行自动注入
区别:
a. Autowired Spring提供 ; Resource JDK提供
b.Autowired 默认根据类型去容器中匹配,如果类型匹配到多个,会根据名称进行匹配
Resource 默认按照名称进行匹配,如果名称没匹配到,在按照类型匹配
42.@Autowired 自动装配过程
@Autowired是通过Bean的后置处理器来进行解析的
1.在创建一个Spring上下文的时候再构造函数中进行注册AutowiredAnnotationBeanPostProcessor
2.在Bean的创建过程中进行解析
a.在实例化后预解析: 解析@Autowired 标注的属性,方法, 比如:属性的类型,名称,属性所在的类...元数据进行缓存起来
b.在属性注入进行真正的解析: 拿到上一步缓存起来的元数据,去ioc容器中进行查找bean,并返回注入
1.首先根据元数据预解析的类型,去容器中进行查找
43.@Bean方法调用时怎么保证单例的?
因为@Configuration 注解,因为Spring底层会为@Configuration 注解创建cglib动态代理类,从而保证我们在调用内部方法时,会帮助我们增强到IOC容器中,帮助我们查找,以此保证bean的单例
44. 为什么@ComponentScan不设置basePackage也会扫描?
45.AOP是什么? 能做什么?
根业务没有关系,公共行为的逻辑代码,可以使用AOP实现
例如:权限认证,日志,事务处理,读写分离,等。
46.Spring 中常见的一些概念名称
47.Spring通知有哪几种类型?
![](https://img-blog.csdnimg.cn/b3800bc2bb88488ca79e45d89fb8f345.png)
![](https://img-blog.csdnimg.cn/64e326d8cb094bde9d722c05c796fa0e.png)
48.SpringAOP和AspectJ Aop的关系
49.JDK动态代理和CGLIB动态代理区别?
区别:
1.JDK动态代理实现接口,CGLIB通过ASM开源的字节码生成库, 帮助我们生成代理类(会有多个)
2、JDK代理类实现了目标类接口,CGLIB会将目标类作为父类 进行集成,
3、调用时:jdk动态代理通过反射方式去调用目标方法,CGLIB通过子类调用父类方式调用目标方法从而实现AOP。
50.AOP有几种实现方式
51.AOP内部调用失效的原因
调用内部方法会失效,解决方式: 通过动态代理实现
1.将代理对象重新注入 @Autowared
2.
52.AOP在哪里创建的动态代理?
53.SPRING事务
54.Spring支持的事务管理类型,事务的实现方式有?
55.事务的传播行为
56.Spring的事务隔离级别
用来解决(并发事务)产生的问题
并发产生的为题:脏读,不可重复读,幻读
不可重复度是针对一条数据
幻读针对的是整张表
57.Spring事务实现原理
在JavaConfig中如何使用声明式事务
添加@EnableTransactionManagement 启动事务注解
58.Spring事务传播行为实现原理
59.Spring如何整合MyBatis管理Mapper接口?
60.解决get 或 post乱码问题
61.SpringMVC 的工作流程
62.SpringMVC处理AjAx请求原理
63.Spring和SpringMVC为什么需要父子容器?
64.是否可以把SpringMVC的所有Bean交给Spring容器管理
64.如果实现零配置的SpringMVC? 原理?
web.xml
65.SpringMVC的拦截器和过滤器有什么区别?执行顺序
1.拦截器不依赖Servlet容器,它依赖SpringMVC。 过滤器依赖Servlet容器
2.拦截器只能对action请求(DispatcherServlet 映射的请求)起作用,过滤器对所有的请求起作用。
3.拦截器可以访问容器中的Bean(可以进行DI操作),过滤器不能(基于Spring创建的过滤器是可以访问Bean)
一个请求进行先进入Web服务器
66.谈谈对Springboot的理解,它具有哪些特性?
bean加载
如果要让一个普通类交给Spring容器管理,通常有以下方法:
1、使用 @Configuration与@Bean 注解
2、使用@Controller @Service @Repository @Component 注解标注该类,然后启用@ComponentScan自动扫描
3、使用@Import 方法
我们可以将自动配置的关键几步以及相应的注解总结如下:
1、@Configuration&与@Bean->基于java代码的bean配置
2、@Conditional->设置自动配置条件依赖
3、@EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。
4、@EnableAutoConfiguration、@AutoConfigurationPackage 与@Import->实现bean发现与加载。
67 .Spring和SpringBoot的区别
68.SpringBoot的核心注解
69.SpringBoot 自动配置原理
70.为什么SpringBoot 的jar文件可以直接运行?
读取完之后,如何运行我们当前应用的main()方法?
71.SpringBoot的启动原理?
72.SpringBoot内置Tomcat启动原理
73.Springboot 读取配置文件的原理? 配置文件加载顺序
74.Springboot默认日志实现框架是什么,怎么切换成别的
logback