原文: https://howtodoinjava.com/spring-core/spring-annotations/

了解最广泛使用的 Spring 注解。 在本教程中,我们将简要介绍 spring 核心提供的重要注解,这些注解用于定义 bean 和创建复杂的应用程序上下文配置。

1. Bean 注解

给定的注解列表用于在 Spring 中定义 bean 并在应用程序上下文中控制其注册首选项。

@Bean

方法级别的注解,用于声明 Spring bean。 当配置执行带注解的方法时,它将返回值注册为BeanFactory中的 Bean。默认情况下,bean 名称将与方法名称相同。 要自定义 Bean 名称,请使用其namevalue属性。

  1. @Bean
  2. EmployeeService employeeService()
  3. {
  4. return new EmployeeServiceImpl();
  5. }

@Component

指示带注解的类是“组件”,并且在使用基于注解的配置和类路径扫描时将被自动检测。要使用此注解,请将其应用于类,如下所示:

  1. @Component
  2. public class EmployeeDAOImpl
  3. implements EmployeeDAO {
  4. ...
  5. }

@Repository

@Component注解的特化。 除了将带注解的 DAO 类导入 DI 容器之外,它还使未经检查的异常(从 DAO 方法抛出)有资格转换为 Spring DataAccessException

  1. @Repository
  2. public class EmployeeDAOImpl
  3. implements EmployeeDAO
  4. {
  5. //...
  6. }

@Service

@Component注解的特化。 它表明一个类是“业务服务门面”或类似的名称。

  1. @Service ("employeeManager")
  2. public class EmployeeManagerImpl
  3. implements EmployeeManager
  4. {
  5. @Autowired
  6. EmployeeDAO dao;
  7. ...
  8. }

@Controller

专门用于注解控制器(例如 Web 控制器)的@Component。 它与基于RequestMapping注解的处理器方法结合使用。

  1. @Controller ("employeeController")
  2. public class EmployeeController
  3. {
  4. ...
  5. }

@Qualifier

在自动装配过程中,如果容器中有多个同类型的 bean,那么容器将抛出运行时异常。 为了解决这个问题,我们必须使用此注解,专门告诉 spring 必须注入哪个 bean。在给定的示例中,如果有两个类型为存储库的 bean,则在运行时,将注入名称为fsRepository的 bean。

  1. public class EmployeeService {
  2. @Autowired
  3. @Qualifier("fsRepository")
  4. private Repository repository;
  5. }

@Autowired

将构造函数,字段,setter 方法或配置方法标记为通过依赖项注入自动装配。 我们可以使用required属性标记注解的依赖项是否是必需的(强制填充)。 默认情况下,其值为true

  1. public class EmployeeService {
  2. @Autowired
  3. private EmployeeDao dao;
  4. }

@Required

缺省的 bean 自动装配仅检查是否已设置依赖项。 它不检查分配的值是否为null。 使用@Required,我们可以检查设置的值是否为非空值。 现在已不推荐使用。

@Value

适用于字段或方法/构造函数参数级别,并指示受影响参数的默认值表达式。

  1. public class SomeService {
  2. @Value("${ENV}")
  3. private String environment;
  4. }

@Lazy

指示是否要延迟初始化 bean。 默认情况下,在 Spring DI 中,将进行立即初始化。当在任何 bean 上应用该 bean 时,只有在另一个 bean 引用或从封装的BeanFactory中显式检索到该 bean 时,才会初始化该 bean。

  1. public class SomeService {
  2. @Autowired
  3. @Lazy
  4. private RemoteService remoting;
  5. }

@DependsOn

在组件扫描期间,它用于指定当前 bean 所依赖的 bean。 保证指定的 bean 由容器在该 bean 之前创建。

  1. public class SomeService {
  2. @Autowired
  3. @DependsOn ("pingService")
  4. private RemoteService remoting;
  5. }

@Lookup

表示一种方法为“查找”方法。 最好用于将原型作用域的 bean 注入到单例 bean 中。

  1. @Component
  2. @Scope("prototype")
  3. public class AppNotification {
  4. //prototype-scoped bean
  5. }
  6. @Component
  7. public class NotificationService {
  8. @Lookup
  9. public AppNotification getNotification() {
  10. //return new AppNotification();
  11. }
  12. }

@Primary

指示当多个候选者有资格自动装配单值依赖项时,应优先考虑 Bean。当不使用@Primary时,我们可能需要提供@Qualifier注解以正确注入 bean。在给定的示例中,当自动装配FooRepository时,将注入HibernateFooRepository的实例 – 直到使用@Qualifier注解。

  1. @Component
  2. public class JdbcFooRepository
  3. extends FooRepository {
  4. }
  5. @Primary
  6. @Component
  7. public class HibernateFooRepository
  8. extends FooRepository {
  9. }

@Scope

指示用于带注解类型的实例的范围的名称。 在 Spring 5 中,bean 可以属于六个范围之一,即单例,原型,请求,会话,应用程序和 websocket。 |

2. 上下文配置注解

这些注解有助于将不同的 Bean 绑定在一起以形成运行时应用程序上下文。

@ComponentScan

@ComponentScan@Configuration一起用于启用和配置组件扫描。 默认情况下,如果不指定路径,它将扫描当前程序包及其所有子程序包中的组件。使用组件扫描,spring 可以自动扫描所有带有原型注解@Component@Controller@Service@Repository并使用BeanFactory对其进行配置。

  1. @Configuration
  2. @ComponentScan(basePackages = {com.howtodoinjava.data.jpa})
  3. public class JpaConfig {
  4. }

@Configuration

指示一个类声明一个或多个@Bean方法,并且与@ComponentScan一起使用时,容器可以对其进行处理以生成 bean 定义。

  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public AppUtils appUtils()
  5. {
  6. return new AppUnits();
  7. }
  8. }

@Profile

指示当一个或多个指定的配置文件处于活动状态时,组件可以进行 Bean 注册。 配置文件是 Bean 的命名逻辑分组,例如开发,生产等。

  1. @Bean
  2. @Profile("dev")
  3. public AppUtils appUtils()
  4. {
  5. return new DevAppUnits();
  6. }
  7. @Bean
  8. @Profile("prod")
  9. public AppUtils appUtils()
  10. {
  11. return new ProdAppUnits();
  12. }

@Import

指示要导入的一个或多个组件类,通常是@Configuration类。导入的@Configuration类中声明的@Bean定义应使用@Autowired注入进行访问。

  1. @Configuration
  2. @Import({ JpaConfig.class, SchedulerConfig.class })
  3. public class AppConfig {
  4. }

@ImportResource

指示一个或多个包含要导入的 bean 定义的资源。 它用于 XML bean 定义,就像@Import用于使用@Bean的 Java 配置一样。

  1. @Configuration
  2. @ImportResource( { "spring-context.xml" } )
  3. public class ConfigClass {
  4. }

请把关于上述 Spring 注解列表或解释的问题与我联系。

学习愉快!

参考:

上下文注解包
构造型注解包