在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 方法上。@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 机制紧密集成。
@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 会启动自动配置机制。@EnableAutoConfiguration 通过 AutoConfigurationImportSelector 类选择要导入的自动配置类,然后将它们添加到上下文中。配置类:
@SpringBootConfiguration 表明这是一个配置类,可以包含自定义的 @Bean 方法来注册 Bean。@SpringBootConfiguration 本身不需要显式声明,因为 @SpringBootApplication 已经包含了它。组件扫描:
@ComponentScan 会扫描 @SpringBootApplication 所在的包及其子包,查找带有 @Component、@Service、@Repository 和 @Controller 等注解的类,并将其作为 Spring Bean 注册到 Spring 容器中。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 版本来选择合适的自动配置类。自动配置类:
org.springframework.boot.autoconfigure.* 包下,它们以 AutoConfiguration 结尾。@Bean 方法来定义和注册 Bean。条件注解:
@ConditionalOnClass、@ConditionalOnMissingClass、@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnProperty 等。@Configuration 注解:
@Configuration 注解,这意味着它们可以包含 @Bean 方法来定义和注册 Bean。@Bean 方法中通过编程方式创建的。属性绑定:
application.properties 或 application.yml)中的属性自动绑定到对应的 Bean 上。@ConfigurationProperties 注解来实现属性绑定。总结
Spring Boot 的自动装配机制极大地减少了手动配置的需求,使得开发者可以专注于应用程序的业务逻辑而不是基础设施配置。通过使用条件注解和自动配置类,Spring Boot 可以智能地根据类路径中的依赖项和配置文件来决定哪些 Bean 应该被注册到 Spring 容器中。
上一篇:数据结构经典测题3