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中事务失效的场景有哪些?
- 异常捕获处理,自己处理了异常,没有抛出,解决:手动抛出。
- 抛出检查异常,解决:配置rollbackFor属性为Exception。
- 非public方法导致的异常失效,解决:把方法改为public。
Spring的bean的生命周期
了解Spring的bean的生命周期可以让我们更好的去了解Spring容器如何管理和创建bean实例,方便调试和解决问题。
BeanDefinition对象:
Spring容器在进行实例化时,会将xml配置的<bean>
的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean。
SpringBoot的自动配置原理
@SpringBootApplication
注解由以下三个注解组成:@SpringBootConfiguration
:该注解与@Configuration
注解作用相同,用来表示这个类是一个配置类。@EnableAutoConfiguration
:SpringBoot实现自动化装配的核心注解。@ComponentScan
:组件扫描,默认扫描当前引导类所在包及其子包。
- 其中
@EnableAutoConfiguration
是实现自动化装配的核心注解。该注解通过@Import
注解导入对应的配置选择器。内部就是读取了该项目和该项目引用的Jar包的classpath路径下META-INF/spring.factories
文件中所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。 - 条件判断会有像
@ConditionalOnClass
这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有Bean放入spring容器中使用。