Spring内容

Spring内容_第1张图片

(195条消息) 超高频面试题系列之----Spring全家桶(面试亲测)_spring全家桶面试题_zyyn_未来可期的博客-CSDN博客

1、推断构造方法:

(1)如果只有一个构造方法,没问题就用这个

(2)如果有多个,首先判断有没有@Autowried指定,没有指定的话会默认使用无参构造方法。

(3)在没有@Autowried指定时,有多个有参构造方法,且没有无参构造方法时,spring会出错

2、依赖查找:By Type,By Name,当By Type找到之后就不会按照名字去找了

Spring内容_第2张图片

3、初始化就是实现 InitializingBean接口,实现了AfterPropertiesSet方法,Spring会对实现此接口的类创建对象过程中调用这个方法,实现初始化,内部逻辑可以自己填入

初始化后(AOP)

4、代理对象(主要是为了执行切面逻辑)

代理对象是为了实现AOP,执行切面逻辑,会将前面的普通对象赋值给代理对象中的Target对象,图中的是代理类,代理类是由spring生成的,代理类对应的对象是普通对象的代理对象,最终放到Map中的是代理对象,其中target是真正的普通对象。

Spring内容_第3张图片

5、Spring事务 @Transactional ,只有代理对象才会判断此注解是否有效,而代理对象是由spring创建的,具体内部执行的方法还是普通对象的方法,事务很多时候会发生失效。

 Spring内容_第4张图片

Spring中的事务是如何实现的? 

Spring内容_第5张图片

 事务失效的场景:

Spring内容_第6张图片

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组件扫描。

Spring内容_第7张图片

10. 可以通过多少种方式完成依赖注入?

通常,依赖注入可以通过三种方式完成,即:

  • 构造函数注入

  • setter 注入

  • 接口注入

 

11、Spring框架中的单例bean是线程安全的吗?
不是,Spring框架中的单例bean不是线程安全的。
spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。

实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
 

你可能感兴趣的:(java,开发语言)