(195条消息) 超高频面试题系列之----Spring全家桶(面试亲测)_spring全家桶面试题_zyyn_未来可期的博客-CSDN博客
1、推断构造方法:
(1)如果只有一个构造方法,没问题就用这个
(2)如果有多个,首先判断有没有@Autowried指定,没有指定的话会默认使用无参构造方法。
(3)在没有@Autowried指定时,有多个有参构造方法,且没有无参构造方法时,spring会出错
2、依赖查找:By Type,By Name,当By Type找到之后就不会按照名字去找了
3、初始化就是实现 InitializingBean接口,实现了AfterPropertiesSet方法,Spring会对实现此接口的类创建对象过程中调用这个方法,实现初始化,内部逻辑可以自己填入
初始化后(AOP)
4、代理对象(主要是为了执行切面逻辑)
代理对象是为了实现AOP,执行切面逻辑,会将前面的普通对象赋值给代理对象中的Target对象,图中的是代理类,代理类是由spring生成的,代理类对应的对象是普通对象的代理对象,最终放到Map中的是代理对象,其中target是真正的普通对象。
5、Spring事务 @Transactional ,只有代理对象才会判断此注解是否有效,而代理对象是由spring创建的,具体内部执行的方法还是普通对象的方法,事务很多时候会发生失效。
Spring中的事务是如何实现的?
事务失效的场景:
6、Bean创建的生命周期有哪些步骤?
推断构造方法-> 实例化-> 填充属性(依赖注入)-> 处理Aware回调 ->
初始化前,处理@PostConstruct注解 -> 初始化,处理InitializingBean接口 -> 初始化后,AOP
7、spring 中有多少种 IOC 容器?Spring 中的 IoC 的实现原理就是工厂模式加反射机制。
BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean。
ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能。
ApplicationContext 和 BeanFactory 的区别?
ApplicationContext :是个接口,有很多实现类,是BeanFactory的子接口
BeanFactory :IOC容器的基本实现
BeanFactory | ApplicationContext |
懒加载 | 即使加载 |
不支持基于以来的注解 | 支持基于以来的注解 |
不支持国际化 | 支持国际化 |
使用语法显式提供资源对象 | 自己创建和管理资源对象 |
8、了解AOP中的动态代理吗?
Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理:
①JDK 动态代理只提供接口的代理,不支持类的代理。核心 InvocationHandler 接口和 Proxy 类,InvocationHandler 通过 invoke()方法反射来调用 目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy 利用 InvocationHandler 动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
②如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP 会选择 使用 CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现 AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final, 那么它是无法使用 CGLIB 做动态代理的。
9、SpringbootApplication注解是一个组合注解
Spring Boot 的核心注解是?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能;
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项;
@ComponentScan:Spring组件扫描。
10. 可以通过多少种方式完成依赖注入?
通常,依赖注入可以通过三种方式完成,即:
构造函数注入
setter 注入
接口注入
11、Spring框架中的单例bean是线程安全的吗?
不是,Spring框架中的单例bean不是线程安全的。
spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。
实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。