每日十题八股-2024年12月18日
1.spring框架中都用到了哪些设计模式?
2.spring 常用注解有什么?
3.Spring的事务什么情况下会失效?
4.Spring的事务,使用this调用是否生效?
5.Bean的生命周期说一下?
6.Bean是否单例?
7.Bean的单例和非单例,生命周期是否一样?
8.Spring bean的作用域有哪些?
9.Spring容器里存的是什么?
10.在Spring中,在bean加载/销毁前后,如果想实现某些逻辑,可以怎么做
1.spring框架中都用到了哪些设计模式?
工厂模式(BeanFactory),代理模式(AOP),单例模式(Bean),模版模式(rediaTemplate,提供一些方法),包装器模式(Integer,Character包装类),观察者模式(Spring事件驱动模型),适配器模式(Java 中的 JDBC 通过适配器模式与不同类型的数据库进行交互。)。
2.spring 常用注解有什么?
@Autowired 注解 (用到类内修饰字段)主要用于自动装配bean。
@Component 修饰类 自动装配bean。
@Configuration 注解用于标记一个类作为Spring的配置类。
@Bean 没有主动用过的。
@Service
@Repository 注解用于标记一个类作为数据访问层的组件。
@Controller 注解用于标记一个类作为控制层的组件。
3.Spring的事务什么情况下会失效?
Spring Boot通过Spring框架的事务管理模块来支持事务操作。事务管理在Spring Boot中通常是通过 @Transactional 注解来实现的。主要还是不符合AOP的动态代理条件的话就会出问题。
把异常给捕获了,但没有抛出来,所以事务不会回滚,只有捕捉到异常事务才会生效。
因为 Spring 默认回滚的是 RuntimeException 异常,和程序抛出的 Exception 异常不匹配,所以事务也是不生效的。如果要触发默认 RuntimeException之外异常的回滚,则需要在 @Transactiona事务注解上指定异常类。
4.Spring的事务,使用this调用是否生效?
不能生效。因为Spring事务是通过代理对象来控制的,只有通过代理对象的方法调用才会应用事务管理的相关规则。当使用this直接调用时,是绕过了Spring的代理机制,因此不会应用事务设置。
底层原因就是导致代理无法实现。
5.Bean的生命周期说一下?
Bean 在 Spring(IoC)中从创建到销毁的整个过程。
- 实例化:为 Bean 分配内存空间;
- 设置属性:将当前类依赖的 Bean 属性,进行注入和装配;
- 初始化:
- 执行各种通知;
- 执行初始化的前置方法;
- 执行初始化方法;
- 执行初始化的后置方法。
- 使用 Bean:在程序中使用 Bean 对象;
- 销毁 Bean:将 Bean 对象进行销毁操作。
6.Bean是否单例?
默认是单例的。可以指定:但是,Spring也支持将Bean设置为多例模式,即每次请求都会创建一个新的Bean实例。可以在Bean定义中通过设置scope属性为"prototype"来实现。
7.Bean的单例和非单例,生命周期是否一样?
不一样的,Spring Bean 的生命周期完全由 IoC 容器控制。Spring 只帮我们管理单例模式 Bean 的完整生命周期,对于 prototype 的 Bean,Spring 在创建好交给使用者之后,则不会再管理后续的生命周期。
8.Spring bean的作用域有哪些?
在 Spring 中,Bean 的常见作用域有以下 5 种:
singleton:单例作用域。
prototype:原型作用域(多例作用域)。
request:请求作用域。
session:会话作用域。
application:全局作用域。
注意:后 3 种作用域,只适用于 Spring MVC 框架。
9.Spring容器里存的是什么?
在Spring容器中,存储的主要是Bean对象。
Bean是Spring框架中的基本组件,用于表示应用程序中的各种对象。当应用程序启动时,Spring容器会根据配置文件或注解的方式创建和管理这些Bean对象。Spring容器会负责创建、初始化、注入依赖以及销毁Bean对象。
10.在Spring中,在bean加载/销毁前后,如果想实现某些逻辑,可以怎么做?
Spring提供了接口和注解允许自定义在Bean生命周期的关键点执行的代码。
- xml方法实现bean的创建:使用init-method和destroy-method
- 直接bean实现InitializingBean和DisposableBean接口
- 使用@PostConstruct和@PreDestroy注解
- 使用@Bean注解的initMethod和destroyMethod属性