(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()了,所以就可以保证线程安全了。