1. @Autowired和@Resource注解的原理和区别?
在Spring框架中,@Autowired
和 @Resource
都是用来实现依赖注入(Dependency Injection, DI)的注解,但是它们之间存在一些差异。下面是这两个注解的一些基本原理和主要区别:
@Autowired 注解
- 原理:
@Autowired
是 Spring 提供的一个注解,它用于自动装配 Bean。- 当使用
@Autowired
时,Spring 容器会在运行时自动查找并注入匹配的 Bean。 - 默认情况下,
@Autowired
是基于类型(Type-based)进行匹配的;如果在一个类中有多个相同类型的依赖,则 Spring 会尝试根据名称(Name-based)进行匹配,但这需要将@Autowired
与@Qualifier
结合使用。
- 使用方式:
@Autowired
可以放在字段上(默认为 required=true,即必须有对应 Bean,否则启动失败),也可以放在构造函数或者 setter 方法上。- 放在构造函数上时,可以保证 Bean 的依赖是不可变的,并且强制要求依赖的存在。
@Resource 注解
- 原理:
@Resource
是 Java 的标准 JSR-250 规范中定义的注解,由 Java Community Process 提供。@Resource
既可以通过类型匹配,也可以通过名称匹配,这取决于你是否指定了name
属性。- 如果没有指定
name
属性,那么@Resource
会尝试先按类型匹配,如果没有匹配到,再按名称匹配(默认名称为字段名)。 - 如果指定了
name
属性,那么@Resource
将仅按名称匹配。
- 使用方式:
@Resource
主要用于字段上,但也可以用于 setter 方法。- 使用
@Resource
时,可以指定name
属性来明确要注入的 Bean 名称,或者使用lookup
属性来指定一个 lookup 方法来查找 Bean。
主要区别
来源不同:
@Autowired
是 Spring 的一部分,只适用于 Spring 环境。@Resource
是 JSR-250 的一部分,可以在任何 Java 环境中使用。
默认行为不同:
@Autowired
默认按类型匹配,如果类型不唯一则需要使用@Qualifier
来指定具体的 Bean。@Resource
默认先按名称匹配,如果未指定名称则按字段名作为默认名称,如果名称匹配不到再按类型匹配。
使用场景:
@Autowired
更适合于 Spring 应用程序,因为它更直接地与 Spring 的 DI 机制集成。@Resource
适用于更广泛的 Java 环境,包括非 Spring 环境。
可选性:
@Autowired
支持通过@Optional
注解来标记依赖是可选的,即使没有匹配的 Bean 也不会导致启动失败。@Resource
不支持@Optional
注解。
兼容性:
@Resource
可能在某些情况下与 EJB 或其他容器提供的资源绑定机制一起工作。@Autowired
专门针对 Spring,不会与其他容器发生冲突。
总的来说,@Autowired
更适合于 Spring 应用程序中的依赖注入,而 @Resource
可能更适合那些希望与 Spring 之外的标准兼容的应用程序。在实际开发中,推荐使用 @Autowired
,因为它提供了更清晰的意图,并且与 Spring 的 DI 机制紧密集成。
2. @SpringBootApplication原理?
@SpringBootApplication
是 Spring Boot 中的一个重要注解,它是一个组合注解,集成了多个其他注解的功能。这个注解的主要目的是简化 Spring Boot 应用程序的配置。下面我们将详细探讨 @SpringBootApplication
的原理和组成部分。
@SpringBootApplication 组成部分
@SpringBootApplication
实际上是由以下三个注解组成的:
@SpringBootConfiguration
:这是一个自定义注解,它继承了@Configuration
注解。@Configuration
注解表明该类是一个配置类,可以包含@Bean
方法来定义 Bean 的实例。@SpringBootConfiguration
表明该配置类是 Spring Boot 的配置类,通常用于定义应用的配置逻辑。@EnableAutoConfiguration
:启用 Spring Boot 的自动配置功能。@EnableAutoConfiguration
会根据类路径中存在的类和应用的配置,自动配置 Spring Bean。这使得开发者不需要显式地配置大多数 Bean,Spring Boot 会根据依赖项自动配置好。@ComponentScan
:用于开启组件扫描,自动发现和配置指定包下的组件。默认情况下,它会扫描@SpringBootApplication
所在的包及其子包,自动检测@Component
、@Service
、@Repository
和@Controller
等注解,并将它们注册为 Spring 管理的 Bean。
@SpringBootApplication 的原理
自动配置:
- 当你标注一个类为
@SpringBootApplication
时,@EnableAutoConfiguration
会启动自动配置机制。 - Spring Boot 会根据类路径中可用的 jar 包自动配置应用程序,例如,如果类路径中包含了 Spring Data JPA 和 H2 数据库驱动,Spring Boot 会自动配置 JPA 和 H2 相关的 Bean。
@EnableAutoConfiguration
通过AutoConfigurationImportSelector
类选择要导入的自动配置类,然后将它们添加到上下文中。
- 当你标注一个类为
配置类:
@SpringBootConfiguration
表明这是一个配置类,可以包含自定义的@Bean
方法来注册 Bean。- 通常情况下,
@SpringBootConfiguration
本身不需要显式声明,因为@SpringBootApplication
已经包含了它。
组件扫描:
@ComponentScan
会扫描@SpringBootApplication
所在的包及其子包,查找带有@Component
、@Service
、@Repository
和@Controller
等注解的类,并将其作为 Spring Bean 注册到 Spring 容器中。- 这意味着你可以在该包及其子包内定义任何使用上述注解的类,而不需要额外的配置。
3. springboot自动装配原理?
Spring Boot 的自动装配(Auto Configuration)是其最核心的功能之一,它极大地简化了 Spring 应用程序的配置过程。下面我将详细介绍 Spring Boot 自动装配的工作原理。
自动装配的核心组件
Spring Boot 自动装配主要依赖以下几个核心组件:
@EnableAutoConfiguration
注解:这个注解开启了自动配置的功能,它告诉 Spring Boot 根据类路径中的 jar 包和其他可用信息自动配置 Bean。AutoConfigurationImportSelector
类:当@EnableAutoConfiguration
被应用时,AutoConfigurationImportSelector
负责选择合适的自动配置类,并将它们注册到 Spring 容器中。AutoConfigurePackage
类:用于确定自动配置的基包。AutoConfigurationPackages
注解:允许你显式地指定自动配置的包范围。自动配置类:这些类以
AutoConfiguration
结尾,它们负责提供自动配置的逻辑。每个自动配置类都负责某个特定的功能领域,如数据源配置、安全配置等。
自动装配的工作流程
@EnableAutoConfiguration
注解:- 当一个类被
@SpringBootApplication
标记时,它会隐式包含@EnableAutoConfiguration
注解。 @EnableAutoConfiguration
会触发AutoConfigurationImportSelector
的执行。
- 当一个类被
AutoConfigurationImportSelector
类:AutoConfigurationImportSelector
是一个ImportSelector
的实现,它决定了哪些自动配置类应该被添加到 Spring 应用上下文中。AutoConfigurationImportSelector
会根据类路径中的可用 jar 包和 Spring Boot 版本来选择合适的自动配置类。- 选择的自动配置类列表会被返回给 Spring 容器,这些类随后会被注册为 Spring Bean。
自动配置类:
- 自动配置类通常位于
org.springframework.boot.autoconfigure.*
包下,它们以AutoConfiguration
结尾。 - 每个自动配置类都会根据类路径中的可用依赖项和配置属性来决定是否激活以及如何配置相关的 Bean。
- 自动配置类通常会包含多个
@Bean
方法来定义和注册 Bean。
- 自动配置类通常位于
条件注解:
- 自动配置类会使用条件注解来决定是否激活特定的配置。
- 常见的条件注解包括
@ConditionalOnClass
、@ConditionalOnMissingClass
、@ConditionalOnBean
、@ConditionalOnMissingBean
、@ConditionalOnProperty
等。 - 这些注解可以帮助自动配置类根据类路径中是否存在特定的类、Bean 是否已存在、配置属性的值等条件来决定是否激活配置。
@Configuration
注解:- 自动配置类通常也使用
@Configuration
注解,这意味着它们可以包含@Bean
方法来定义和注册 Bean。 - 这些 Bean 可能是 Spring Boot 根据类路径和配置文件自动创建的,也可能是在
@Bean
方法中通过编程方式创建的。
- 自动配置类通常也使用
属性绑定:
- Spring Boot 会根据配置文件(如
application.properties
或application.yml
)中的属性自动绑定到对应的 Bean 上。 - 通常使用
@ConfigurationProperties
注解来实现属性绑定。
- Spring Boot 会根据配置文件(如
总结
Spring Boot 的自动装配机制极大地减少了手动配置的需求,使得开发者可以专注于应用程序的业务逻辑而不是基础设施配置。通过使用条件注解和自动配置类,Spring Boot 可以智能地根据类路径中的依赖项和配置文件来决定哪些 Bean 应该被注册到 Spring 容器中。