Spring和SpringBoot注解大全(超详细)

@SpringBootApplication

@SpringBootApplication其实是一个复合注解,简化标识 Spring Boot 应用程序的主类。

主要组合了 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

@SpringBootConfiguration

是 @Configuration 注解的一个形式,表明该类是一个 Spring 配置类,用于定义 Bean。

@EnableAutoConfiguration
  • 启用Spring Boot的自动配置机制。自动配置会根据应用程序的依赖项和类路径,自动配置各种常见的Spring配置和功能

  • 如果应用中引入了spring-boot-starter-web依赖,Spring Boot 会自动为应用配置嵌入式 Tomcat 服务器、MVC 框架等。

SpringBoot 是如何实现自动配置的?

Spring Boot 的自动配置依赖于 META-INF/spring.factories文件,该文件中列出了所有自动配置类路径。当 Spring Boot 启动时,它会根据 spring.factories文件中指定的配置类加载相应的自动配置。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

不过3.0已经废除

  1. 条件注解(Conditional)

另外自动配置类通常使用 @ConditionalOnClass、@ConditionalOnMissingBean,@ConditionalOnProperty 等条件注解。它们控制自动配置的加载条件,例如仅在类路径中存在某个类时,才加载某些配置

@Configuration
@ConditionalOnClass(DataSource.class)  // 只有类路径中存在 DataSource 时才生效
public class DataSourceAutoConfiguration {
   @Bean
   @ConditionalOnMissingBean  // 如果没有自定义 DataSource,则使用默认配置
   public DataSource dataSource() {
       return new HikariDataSource();
   }
}

@ComponentScan

用于自动扫描并加载应用程序中的组件,例如Controller、Service、等。默认会扫描@SpringBootApplication注解所在类的包及其子包中的组件,并将它们纳入Spring Boot应用程序的上下文中,使它们可被自动注入和使用

SpringBean相关
@Autowired和@Resource

@Autowired是Spring框架的提供的,默认情况下是根据类型来查找匹配的Bean。如果应用上下文中存在多个相同类型的Bean,则需要使用 @Qualifier 注解来指定具体的Bean名称。否则会出现异常

@Resource是JSR-250 提供的,它是Java 的标准的一部分,不仅仅局限于Spring项目中使用。默认按照名称来查找匹配的Bean。

如果指定了name属性,那么就会按照这个名称去寻找Bean,如果没有指定,则默认使用字段名或setter方法参数名作为Bean的名字。

@Component,@Repository,@Service, @Controller

这几个注解可以 把类标识成可用于 @Autowired 注解自动装配的 bean 的类。

  • @Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。

  • @Controller : 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。

  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。

  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。

@Qualifier

@Qualifier注解在 Spring 中的主要作用是在依赖注入时消除歧义

当一个类型有多个实现时,@Qualifier注解可以指定需要注入哪一个具体的 Bean。通常配合 @Autowired使用,实现按名称注入

@Component
public class Client {
    private final Service service;
    @Autowired          // 指定名称选择对应的实现 Bean
    public Client(@Qualifier("serviceImpl1") Service service) {
        this.service = service;
    }
    public void doSomething() {
        service.serve();
    }
}

@Primary

@Primary注解用于指定当有多个候选 Bean 时默认注入哪个 Bean,也就是指定了第一顺位。

但@Qualifier 使用时,可以覆盖 @Primary 的默认行为,例如以下这样:

@Component
@Primary
public class DefaultService implements Service {
    ...
}
@Component
@Qualifier("specificService")
public class SpecificService implements Service {
   ...
}
@Component
public class Client {
    private final Service service;
    @Autowired
    public Client(@Qualifier("specificService") Service service) {
        this.service = service;
    }
}
//即使 DefaultService 被标记为 @Primary,但由于 @Qualifier("specificService”),所以最终注入的仍然是 SpecificService!
@Bean

@Bean 是一个方法级别的注解,用于在配置类中声明方法,这些方法将返回一个对象,该对象将由 Spring 容器管理。

通过在配置类中使用 @Bean 注解,可以手动定义 Bean 的创建和初始化过程,可以指定 Bean 的作用域、初始化方法、销毁方法等。

适用范围:

  • 主要用于Java配置方式,与 XML 配置相对应,通过 Java代码的方式来配置 Spring 应用上下文。

  • 比如外部的JDBC Templete RedisTemplete,就可以通过配置类中@Bean写入,交由Spring容器去管理

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@Primary

在 Spring 框架中,@Primary注解用于标记当存在多个候选 Bean 时,应该优先注入哪一个

当一个接口有多个实现类,并且在注入时未明确指定要注入哪个实现类时Spring 会报错。这时可以使用@Primary注解来指定一个首选实现类

public interface MyService {
    void performAction();
}
@Component
@Primary   //使用@Primary
public class MyServiceImpl1 implements MyService {
    @Override
    public void performAction() {
       ...
    }
}
@Component
public class MyServiceImpl2 implements MyService {
    @Override
    public void performAction() {
      ...
    }
}
@Component
public class MyComponent {
    private final
<think>好的,用户想了解SpringSpringBoot注解的用法区别。首先,我需要回忆一下两者的基本概念。Spring框架是一个轻量级的控制反转(IoC)面向切面(AOP)的容器框架,而Spring Boot是基于Spring的快速开发框架,简化了配置。 接下来,用户提到参考了站内的两个引用。引用[1]讲的是@SpringBootApplication注解,它整合了多个注解,包括@EnableAutoConfiguration,用于自动配置。引用[2]提到Spring MVCWebFlux中的注解,以及Spring Boot的其他注解。需要结合这些信息来回答。 首先,应该区分Spring的核心注解Spring Boot特有的注解。比如,在Spring中,@Component用于标记组件,@Autowired用于依赖注入,而Spring Boot引入了@SpringBootApplication来简化配置。另外,Spring Boot的自动配置是通过@EnableAutoConfiguration实现的,这在传统Spring中需要手动配置。 然后,要考虑用户可能的实际需求。他们可能想知道在开发中如何选择注解,或者为什么Spring Boot更便捷。需要举例说明两者的差异,比如在启动类配置上的不同,传统Spring需要多个注解Spring Boot只需一个。 还需要注意回答结构,按照用法区别分点说明,保持清晰。可能的问题会涉及自动配置原理、常见注解对比,或是迁移到Spring Boot的好处。确保引用正确,比如在提到@SpringBootApplication时引用[1],在涉及Web相关注解时引用[2]。 最后,生成的相关问题需要围绕用户可能进一步想了解的内容,比如核心注解的作用、自动配置的实现,或者如何选择框架。这样能帮助用户深入理解主题。</think>### SpringSpring Boot注解的用法区别 #### 一、Spring框架核心注解 1. **组件扫描依赖注入** - `@Component`: 标记一个类为Spring管理的组件(通用注解) - `@Service`, `@Repository`, `@Controller`: 分别用于服务层、数据层控制层的组件,语义更明确 - `@Autowired`: 自动注入依赖对象(通过类型匹配) - `@Qualifier`: 结合`@Autowired`按名称注入特定实现 2. **配置类Bean定义** - `@Configuration`: 标记类为配置类,替代XML配置 - `@Bean`: 在配置类中定义Bean实例 - `@ComponentScan`: 指定组件扫描路径 3. **Web相关注解** - `@RequestMapping`: 定义HTTP请求映射(Spring MVC) - `@ResponseBody`: 将返回值直接写入HTTP响应体 - `@PathVariable`, `@RequestParam`: 处理URL参数请求参数[^2] --- #### 二、Spring Boot特有注解 1. **启动类自动配置** - `@SpringBootApplication`: 组合了`@Configuration`、`@EnableAutoConfiguration``@ComponentScan`,是Spring Boot项目的入口注解[^1] - `@EnableAutoConfiguration`: 根据依赖自动配置Spring应用(如检测到`spring-boot-starter-web`自动配置Tomcat) 2. **条件化配置** - `@ConditionalOnClass`: 当类路径存在指定类时生效 - `@ConditionalOnProperty`: 根据配置文件属性决定是否启用配置 3. **简化开发** - `@RestController`: 组合`@Controller``@ResponseBody`,直接返回JSON数据 - `@SpringBootTest`: 提供完整的应用上下文测试支持 --- #### 三、核心区别总结 | **特性** | **Spring** | **Spring Boot** | |-------------------------|-------------------------------------|-------------------------------------| | **配置方式** | 需手动配置XML或Java Config | 自动配置为主,约定优于配置 | | **启动类** | 需自定义`@Configuration`+组件扫描 | 仅需`@SpringBootApplication` | | **内嵌服务器** | 需手动配置Tomcat/Jetty | 默认内嵌Tomcat/Jetty(通过starter) | | **依赖管理** | 需手动指定版本兼容性 | 通过`spring-boot-starter-*`统一管理 | | **监控生产就绪** | 需集成Spring Actuator | 默认集成Actuator提供健康检查等端点 | --- #### 四、典型代码对比 **传统Spring MVC配置类** ```java @Configuration @ComponentScan("com.example") @EnableWebMvc public class AppConfig implements WebMvcConfigurer { // 手动配置视图解析器、拦截器等 } ``` **Spring Boot启动类** ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); // 自动配置内嵌服务器等 } } ``` --- #### 五、如何选择? - **使用Spring**:需要对框架有精细控制(如自定义安全策略、复杂事务管理) - **使用Spring Boot**:快速构建微服务、REST API或需要简化配置的场景[^2] ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值