Spring内容

本文详细介绍了Springboot中声明式事务的实现,通过@Transaction注解进行事务控制,并探讨了Spring事务的底层实现原理。同时,文章涵盖了Bean的构造方法选择、依赖注入、初始化过程、AOP代理对象的生成以及Spring的两种动态代理方式——JDK和CGLIB。此外,还讨论了Spring框架中单例bean的线程安全问题。
摘要由CSDN通过智能技术生成

Springboot如何实现事务:声明式事务,通过@Transactional注解在方法上表明该方法需要事务支持。这是一个基于AOP的实现操作.

深入理解 Spring 事务底层实现原理,通俗易懂_51CTO博客_spring事务底层实现 

(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容器的基本实现

BeanFactoryApplicationContext
懒加载即使加载
不支持基于以来的注解支持基于以来的注解
不支持国际化支持国际化
使用语法显式提供资源对象自己创建和管理资源对象

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智博的自留地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值