1.说一下对spring的理解(重点)
spring有很多技术栈: spring框架、springmvc、springboot、springcloud、springdata、spring security.. spring一般指的是spring框架,他包含 ioc(容器)控制反转,可以将对象注入到容器中管理, DI是依赖注入,可以帮助我们获取容器中的对象 AOP:切面编程,可以对容器的对象增强(对方法的扩展,增加功能) TX:事务管理
2.springBean的生命周期的方法(重点)
在 Spring 框架中,Bean 的生命周期是指从 Bean 被创建、初始化、使用到最终销毁的完整过程。Spring 容器会管理 Bean 的整个生命周期 1、加载类的信息: 2、BeanFactoryPostProcessor: postProcessBeanFactory : 在组件对象的构造器调用之前执行 √ 3、组件对象的构造器: √ 4、设置属性值: 5、BeanPostProcessor: postProcessBeforeInitialization : 在组件对象的属性值设置之后, init方法执行前执行 √ 6、组件对象的初始化方法: √ 7、BeanPostProcessor:postProcessAfterInitialization : 在组件对象的init方法执行后执行 √ 8、使用对象 9、销毁方法 √
3. spring常用的组件注解(重点)
@Component //基本组件 @Controller// @Service @Repository
注解 | 说明 |
---|---|
@Component | 该注解用于描述 Spring 中的 Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如 Service 层、Dao 层等。 使用时只需将该注解标注在相应类上即可。 |
@Repository | 该注解用于将数据访问层(Dao 层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
@Service | 该注解通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
Autowired-自动装配注解
自动装配: 自动给属性设置属性值 - Autowired注解必须在组件类中使用 - Autowired注解可以从容器中获取对象 设置给属性 - Autowired注解工作流程 - 先根据类型从容器中获取组件对象装配 - 获取失败,再根据 属性名当做bean名称从容器中获取组件对象装配 - 如果都失败: 根据required属性值 - 为true:抛出异常 默认 - false:不抛异常 代码正常执行,但是可能出现空指针 - Autowired注解 + @Qualifier注解 指定bean名称从容器中加载指定的组件对象使用
@Resource注解:自动装配
引入依赖:
<dependency> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> <version>3.0.0</version> </dependency>
扩展注解
@Import
@Import({CommonUtil.class}) //将CommonUtil引入到IOC容器中,默认使用全类名作为bean的名称
@Conditional 条件判断类
@Conditional(): 可以通过value属性设置一个Condition对象 Condition对象必须提供一个match方法 match方法返回true,@Conditional标注的类会注入到ioc容器中 match方法返回false,@Conditional标注的类不会注入到ioc容器中 通过@Bean+@Conditional注解:动态的判断 将DeliveryServiceImpl2注入到ioc容器 */ @Bean @Conditional(value= ServiceImplCondition.class)
配置类:启动类(ioc容器根据这个类初始化IOC容器)
@ComponentScan(basePackages="要扫描的组件所在的包") @PropertySource("要加载的配置文件,例如:classpath:jdbc.properties")
总结上面用到的spring注解
Controller Service Repository Configuration Component Autowired Value ComponentScan PropertySource Bean Import Conditional
Autowired和Resource注解的区别?
相同点:都可以自动装配 Autowired: 是spring的注解,先按照类型装配:byType,在根据名称装配:byName • 有required属性 • 可以结合@Qualifier注解 指定使用名称装配:byName Resource: 是javaEE jsr250的规范 , 先按照名称装配:byName , 再根据类型装配:byType • - 只要实现了javaEE jsr250规范的容器框架,都可以使用这个注解实现自动装配
什么是Spring的三级缓存?Spring的循环依赖
三级缓存:spring在初始化bean对象,设置属性值,管理完全初始化的bean对象时 用来存储不同阶段的bean对象的集合就是三级缓存 DefaultSingletonBeanRegistry: 一级缓存:Map<String, Object> singletonObjects 存完全初始化的bean对象 成品对象 二级缓存中的对象,存到一级缓存中之前: ioc容器,会解析这个对象的 属性和方法,如果有属性或者方法 使用了 自动装配@Autowired/@Resource注解 属性值设置@Value注解 或者@Bean ioc容器会先处理这个注解标注的属性方法,完成后才将对象存到一级缓存 二级缓存:Map<String, Object> earlySingletonObjects 存储调用了构造器 但是未解析bean对象自动装配、value注解...的bean对象 半成品对象 三级缓存:Map<String, ObjectFactory<?>> singletonFactories 存储bean信息(根据bean信息创建的bean工厂对象) spring设计三级缓存的目的: 1、为了区分对象的初始化阶段 方便我们在bean不同的生命周期介入(执行我们自己的业务) 2、为了解决循环依赖问题 循环依赖: 1、A组件依赖注入了B组件,B组件依赖注入了A注解 就是循环依赖 2、依赖注入时: 可以通过属性、也可以通过构造器、还可以通过setter方法依赖注入 spring的三级缓存 默认解决了属性、setter方法的依赖注入问题 构造器依赖注入无法解决!!!! 所以:不建议使用构造器依赖注入
什么情况会导致Spring中一个bean无法初始化?
1、循环依赖: 构造器依赖注入导致循环依赖 无法初始化 2、容器扫描范围: 没有扫描到组件类 3、bean没有使用组件注解 或者 @Bean 或者 @Import