企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# Spring 注解 > 原文: [https://howtodoinjava.com/spring-core/spring-annotations/](https://howtodoinjava.com/spring-core/spring-annotations/) 了解最广泛使用的 Spring 注解。 在本教程中,我们将简要介绍 spring 核心提供的重要注解,这些注解用于定义 bean 和创建复杂的应用程序上下文配置。 ## 1\. Bean 注解 给定的注解列表用于在 Spring 中定义 bean 并在应用程序上下文中控制其注册首选项。 ### `@Bean` 方法级别的注解,用于声明 Spring bean。 当配置执行带注解的方法时,它将返回值注册为[`BeanFactory`](https://howtodoinjava.com/spring-core/different-spring-ioc-containers/)中的 Bean。默认情况下,bean 名称将与方法名称相同。 要自定义 Bean 名称,请使用其`name`或`value`属性。 ```java @Bean EmployeeService employeeService() { return new EmployeeServiceImpl(); } ``` ### `@Component` 指示带注解的类是“组件”,并且在使用[基于注解的配置](https://howtodoinjava.com/spring5/core/spring-bean-java-config/)和类路径扫描时将被自动检测。要使用此注解,请将其应用于类,如下所示: ```java @Component public class EmployeeDAOImpl implements EmployeeDAO { ... } ``` ### [`@Repository`](https://howtodoinjava.com/spring-boot/repository-annotation/) `@Component`注解的特化。 除了将带注解的 DAO 类导入 DI 容器之外,它还使未经检查的异常(从 DAO 方法抛出)有资格转换为 Spring `DataAccessException`。 ```java @Repository public class EmployeeDAOImpl implements EmployeeDAO { //... } ``` ### `@Service` `@Component`注解的特化。 它表明一个类是“业务服务门面”或类似的名称。 ```java @Service ("employeeManager") public class EmployeeManagerImpl implements EmployeeManager { @Autowired EmployeeDAO dao; ... } ``` ### `@Controller` 专门用于注解控制器(例如 Web 控制器)的`@Component`。 它与基于`RequestMapping`注解的处理器方法结合使用。 ```java @Controller ("employeeController") public class EmployeeController { ... } ``` ### `@Qualifier` 在自动装配过程中,如果容器中有多个同类型的 bean,那么容器将抛出运行时异常。 为了解决这个问题,我们必须使用此注解,专门告诉 spring 必须注入哪个 bean。在给定的示例中,如果有两个类型为存储库的 bean,则在运行时,将注入名称为`fsRepository`的 bean。 ```java public class EmployeeService { @Autowired @Qualifier("fsRepository") private Repository repository; } ``` ### `@Autowired` 将构造函数,字段,setter 方法或配置方法标记为通过依赖项注入自动装配。 我们可以使用`required`属性标记注解的依赖项是否是必需的(强制填充)。 默认情况下,其值为`true`。 ```java public class EmployeeService { @Autowired private EmployeeDao dao; } ``` ### [`@Required`](https://howtodoinjava.com/spring-core/spring-required-annotation-and-requiredannotationbeanpostprocessor-example/) 缺省的 bean 自动装配仅检查是否已设置依赖项。 它不检查分配的值是否为`null`。 使用`@Required`,我们可以检查设置的值是否为非空值。 现在已不推荐使用。 ### `@Value` 适用于字段或方法/构造函数参数级别,并指示受影响参数的默认值表达式。 ```java public class SomeService { @Value("${ENV}") private String environment; } ``` ### `@Lazy` 指示是否要延迟初始化 bean。 默认情况下,在 Spring DI 中,将进行立即初始化。当在任何 bean 上应用该 bean 时,只有在另一个 bean 引用或从封装的`BeanFactory`中显式检索到该 bean 时,才会初始化该 bean。 ```java public class SomeService { @Autowired @Lazy private RemoteService remoting; } ``` ### `@DependsOn` 在组件扫描期间,它用于指定当前 bean 所依赖的 bean。 保证指定的 bean 由容器在该 bean 之前创建。 ```java public class SomeService { @Autowired @DependsOn ("pingService") private RemoteService remoting; } ``` ### `@Lookup` 表示一种方法为“查找”方法。 最好用于将原型作用域的 bean 注入到单例 bean 中。 ```java @Component @Scope("prototype") public class AppNotification { //prototype-scoped bean } @Component public class NotificationService { @Lookup public AppNotification getNotification() { //return new AppNotification(); } } ``` ### `@Primary` 指示当多个候选者有资格自动装配单值依赖项时,应优先考虑 Bean。当不使用`@Primary`时,我们可能需要提供`@Qualifier`注解以正确注入 bean。在给定的示例中,当自动装配`FooRepository`时,将注入`HibernateFooRepository`的实例 – 直到使用`@Qualifier`注解。 ```java @Component public class JdbcFooRepository extends FooRepository { } @Primary @Component public class HibernateFooRepository extends FooRepository { } ``` ### `@Scope` 指示用于带注解类型的实例的范围的名称。 在 Spring 5 中,bean 可以属于六个范围之一,即单例,原型,请求,会话,应用程序和 websocket。 | ## 2\. 上下文配置注解 这些注解有助于将不同的 Bean 绑定在一起以形成运行时应用程序上下文。 ### `@ComponentScan` `@ComponentScan`与`@Configuration`一起用于启用和配置组件扫描。 默认情况下,如果不指定路径,它将扫描当前程序包及其所有子程序包中的组件。使用组件扫描,spring 可以自动扫描所有带有[原型注解](https://howtodoinjava.com/spring-core/stereotype-annotations/)`@Component`,`@Controller`,`@Service`和`@Repository`并使用`BeanFactory`对其进行配置。 ```java @Configuration @ComponentScan(basePackages = {com.howtodoinjava.data.jpa}) public class JpaConfig { } ``` ### [`@Configuration`](https://howtodoinjava.com/spring-core/spring-configuration-annotation/) 指示一个类声明一个或多个`@Bean`方法,并且与`@ComponentScan`一起使用时,容器可以对其进行处理以生成 bean 定义。 ```java @Configuration public class AppConfig { @Bean public AppUtils appUtils() { return new AppUnits(); } } ``` ### `@Profile` 指示当一个或多个指定的配置文件处于活动状态时,组件可以进行 Bean 注册。 配置文件是 Bean 的命名逻辑分组,例如开发,生产等。 ```java @Bean @Profile("dev") public AppUtils appUtils() { return new DevAppUnits(); } @Bean @Profile("prod") public AppUtils appUtils() { return new ProdAppUnits(); } ``` ### `@Import` 指示要导入的一个或多个组件类,通常是`@Configuration`类。导入的`@Configuration`类中声明的`@Bean`定义应使用`@Autowired`注入进行访问。 ```java @Configuration @Import({ JpaConfig.class, SchedulerConfig.class }) public class AppConfig { } ``` ### `@ImportResource` 指示一个或多个包含要导入的 bean 定义的资源。 它用于 XML bean 定义,就像`@Import`用于使用`@Bean`的 Java 配置一样。 ```java @Configuration @ImportResource( { "spring-context.xml" } ) public class ConfigClass { } ``` 请把关于上述 Spring 注解列表或解释的问题与我联系。 学习愉快! 参考: [上下文注解包](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/package-summary.html) [构造型注解包](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/package-summary.html)