SpringBoot框架--单例bean线程安全问题、AOP、事务失效场景、bean的生命周期、bean的循环引用问题、SpringMVC的执行流程、Springboot自动配置原理、常见注解

Spring框架中的单例bean是线程安全的吗?

@Service
@Scope("singleton")
public class UserServicelmpl implements UserService {

singleton : bean在每个Spring lOC容器中只有一个实例。
prototype: 一个bean的定义可以有多个实例。

不是线程安全的
Spring框架中有一个@Scope注解,默认的值就是singleton,单例的。
因为一般在spring的bean中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决。

什么是AOP,你们项目中有没有使用到AOP?

AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑
抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

常见的AOP使用场景:
1.记录操作日志
2.缓存处理
3.Spring中内置的事务处理

记录操作日志思路:
在这里插入图片描述

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

其本质是通过AOP功能,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

Spring支持编程式事务管理和声明式事务管理两种方式。
1.编程式事务控制: 需使用Transaction Template来进行实现,对业务代码有侵入性,项目中很少使用。
2.声明式事务管理: 声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
在这里插入图片描述

Spring中事务失效的场景有哪些

情况一:异常捕获处理
在这里插入图片描述
情况二:抛出检查异常
在这里插入图片描述
情况三:非public方法导致的事务失效
在这里插入图片描述

Spring的bean的生命周期

BeanDefinition
Spring容器在进行实例化时,会将xml配置的< bean >的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean
在这里插入图片描述
在这里插入图片描述
1.通过BeanDefinition获取bean的定义信息
2.调用构造函数实例化bean
3.bean的依赖注入
4.处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)
5.Bean的后置处理器BeanPostProcessor-前置
6.初始化方法(InitializingBean、init-method)
7.Bean的后置处理器BeanPostProcessor-后置
8.销毁bean

Spring的bean的循环引用

Spring的循环依赖:
在这里插入图片描述
三级缓存解决循环依赖(循环引用)
Spring解决循环依赖是通过三级缓存,对应的三级缓存如下所示:

//单实例对象注册器
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
	private static final int SUPPRESSED_EXCEPTIONS_LIMIT= 100;
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);     //一级缓存
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);   //三级缓存
	private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16); //二级缓存

在这里插入图片描述
一级缓存作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖

如果要想打破循环依赖,就需要一个中间人的参与,这个中间人就是二级缓存。(一级缓存+二级缓存:但是不能解决代理对象)
在这里插入图片描述
三级缓存+二级缓存+一级缓存 解决代理对象的循环引用
在这里插入图片描述
三级缓存能解决初始化过程中的循环依赖,但是不能解决构造函数产生的循环依赖

在这里插入图片描述

构造方法出现了循环依赖的解决方法:(加注解)

public A(@Lazy B b){
	System.out.println("A的构造方法执行了...");
	this.b = b ;
}

SpringMVC的执行流程

在这里插入图片描述
1.用户发送出请求到前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping (处理器映射器)
3.HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给 DispatcherServlet
4.DispatcherServlet调用HandlerAdapter(处理器适配器)
5.HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
6.Controller执行完成返回ModelAndView对象
7.HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover (视图解析器)
9.ViewReslover解析后返回具体View(视图)
10.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
在这里插入图片描述

1.用户发送出请求到前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping (处理器映射器)
3.HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),再一起返回给4.DispatcherServlet。
5.DispatcherServlet调用HandlerAdapter (处理器适配器)
6.HandlerAdapter经过适配调用具体的处理器(Handler/Controller)方法上添加了@ResponseBody
7.通过HttpMessageConverter来返回结果转换为JSON并响应

Springboot自动配置原理

1,在Spring Boot项目中的引导类上有一个注解**@SpringBootApplication**,这个注解是对三个注解进行了封装,分别是:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

2.其中**@EnableAutoConfiguration是实现自动化配置的核心注解。该注解通过@lmport注解导入对应的配置选择器。
内部就是读取了该项目和该项目引用的Jar包的的classpath路径下
META-INF/spring.factories文件中的所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件**来决定是否需要将其导入到Spring容器中。
3,条件判断会有像 @ConditionalOnClass 这样的注解,判断是否有对应的class文件,如果有则加载该类把这个配置类的所有的Bean放入spring容器中使用。

Spring框架常见注解(Spring、Springboot、Springmvc)

Spring的常见注解
在这里插入图片描述
SpringMVC常见的注解
在这里插入图片描述
Springboot常见注解
在这里插入图片描述

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bean的生命周期是指在Spring容器中,一个Bean从被实例化到最终销毁的整个过程。根据引用的描述,Bean的生命周期包括以下几个步骤: (1)实例化Bean:根据配置情况调用Bean构造方法或工厂方法来创建Bean的实例。 (2)属性注入:利用依赖注入的方式,将Bean中所有属性的配置值进行注入。 (3)Aware接口回调:如果Bean实现了特定的Aware接口,Spring将会在这一步调用相应的方法,以便让Bean感知到容器的一些信息。 (4)初始化方法:在Bean的所有属性被注入后,执行Bean的初始化方法,可以通过配置指定初始化方法的名称。 (5)Bean后置处理器:在Bean的初始化方法执行前后,会调用注册的Bean后置处理器来对Bean进行增强处理。 (6)销毁方法:在容器关闭或者明确销毁Bean的情况下,执行Bean的销毁方法,可以通过配置指定销毁方法的名称。 根据引用引用的描述,AOP(面向切面编程)是Spring的一种特殊处理,主要在Bean的生命周期中进行。在AOP中,可以通过配置切点、切面和通知等来实现对Bean的增强功能,如日志记录、事务管理等。AOP的实现依赖于动态代理或字节码增强技术,可以在Bean的实例化过程中动态地为其织入额外的行为。 综上所述,Bean的生命周期AOPSpring中的两个重要概念。Bean的生命周期包括实例化、属性注入、初始化、销毁等步骤,而AOP则是在Bean的生命周期中对其进行增强处理的一种特殊机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值