Spring框架中的bean

bean是单例的吗?

@Service
@Scope("singleton")
Public class UserServiceImpl implements UserService{

}

可以通过@Scope 注解来设置bean是否是单例,不设置该注解默认是单例的。

  • singleton:是单例,在IOC容器中只有这一个实例。
  • prototype:不是单例,一个bean的定义可以有多个实例。

单例bean是线程安全的吗?

因为一般在Spring中的bean都是注入无状态的对象,没有线程安全问题。如果在bean中定义了可以修改的成员变量,要考虑到线程安全问题,可以通过多例或者加锁来解决。

比如下面这张图中的userService对象因为是没有状态的,所以是线程安全的。而UserController对象由于里面有个成员变量count存在线程安全问题,所以这个bean不是线程安全的。

Spring中的AOP

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

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

常见的使用AOP的场景:

  • 记录操作日志
  • 缓存处理
  • Spring中内置的事务处理

AOP的底层是如何实现的?

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

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

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

  1. 异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出。
  2. 抛出检查异常,解决:配置rollbackFor属性为Exception。
  3. 非public方法导致的异常失效,解决:把方法改为public。

Spring的bean的生命周期

了解Spring的bean的生命周期可以让我们更好的去了解Spring容器如何管理和创建bean实例,方便调试和解决问题。

BeanDefinition对象:
Spring容器在进行实例化时,会将xml配置的<bean> 的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean。

image.png

image.png

SpringBoot的自动配置原理

  1. @SpringBootApplication 注解由以下三个注解组成:

    • @SpringBootConfiguration:该注解与@Configuration 注解作用相同,用来表示这个类是一个配置类。
    • @EnableAutoConfiguration :SpringBoot实现自动化装配的核心注解。
    • @ComponentScan :组件扫描,默认扫描当前引导类所在包及其子包。
  2. 其中@EnableAutoConfiguration 是实现自动化装配的核心注解。该注解通过@Import 注解导入对应的配置选择器。内部就是读取了该项目和该项目引用的Jar包的classpath路径下META-INF/spring.factories 文件中所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。
  3. 条件判断会有像@ConditionalOnClass 这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有Bean放入spring容器中使用。
最后修改:2024 年 04 月 08 日
如果觉得我的文章对你有用,请随意赞赏