📜  Spring 核心注解

📅  最后修改于: 2022-05-13 01:55:22.355000             🧑  作者: Mango

Spring 核心注解

Spring Annotations是一种元数据形式,提供有关程序的数据。注释用于提供有关程序的补充信息。它对他们注释的代码的操作没有直接影响。它不会改变编译程序的动作。 在 Spring 框架中,注解分为不同的类型。

Spring 框架注解的类型

基本上,整个 Spring 框架中有 6 种类型的注解可用。

  1. Spring 核心注解
  2. Spring Web 注释
  3. Spring Boot 注解
  4. Spring 调度注解
  5. Spring 数据注解
  6. Spring Bean 注解

所以在这篇文章中,我们将讨论Spring Core Annotations。

Spring 核心注解

org.springframework.beans.factory.annotationorg.springframework.context.annotation包中的 Spring 注解通常称为 Spring Core 注解。我们可以将它们分为两类:

  1. DI 相关注解
  2. 上下文配置注释

1. DI 相关注解

下面列出了 Spring Framework 中可用的一些与 DI 相关的注解

  • @自动连线
  • @Qualifier
  • @基本的
  • @豆
  • @懒惰的
  • @必需的
  • @价值
  • @范围
  • @Lookup 等。

@Autowired 注解

@Autowired 注解应用于字段、setter 方法和构造函数。它隐式地注入对象依赖。我们使用@Autowired标记将由 Spring 容器注入的依赖项。

例子

1.1:现场注入

Java
class Student {
    @Autowired
    Address address;
}


Java
class Student {
    Address address;
  
    @Autowired
    Student(Address address) {
        this.address = address;
    }
}


Java
class Student {
    Address address;
  
    @Autowired
    void setaddress(Address address) {
        this.address = address;
    }
}


Java
public interface Vehicle {
     public void start();
}


Java
@Component(value="car")
public class Car implements Vehicle {
  
     @Override
     public void start() {
           System.out.println("Car started");
     }
  
 }
  
@Component(value="bike")
public class Bike implements Vehicle {
  
     @Override
     public void start() {
          System.out.println("Bike started");
     }
  
}


Java
@Component
public class VehicleService {
  
    @Autowired
    @Qualifier("bike")
    private Vehicle vehicle;
  
    public void service() {
         vehicle.start();
    }
}


Java
@Configuration
public class Config {
  
    @Bean
    public Employee Employee1() {
        return new Employee("Employee1");
    }
  
    @Bean
    public Employee Employee2() {
        return new Employee("Employee2");
    }
}


Java
@Configuration
public class Config {
  
    @Bean
    public Employee Employee1() {
        return new Employee("Employee1");
    }
  
    @Bean
      @Primary
    public Employee Employee2() {
        return new Employee("Employee2");
    }
}


Java
@Component
@Profile("developer")
public class Employee {}


Java
@Configuration
@Import(Conf1.class)
public class Config {
   ------
}


Java
@Configuration
@Import({Conf1.class, Conf2.class})
public class Config {
   ------
}


Java
@Configuration
@PropertySource("classpath:db.properties")
public class DBConfiguration {
    //...
}


Java
@Configuration
@PropertySource("classpath:db.properties")
@PropertySource("classpath:root.properties")
public class DBConfiguration {
    //...
}


1.2:构造函数注入

Java

class Student {
    Address address;
  
    @Autowired
    Student(Address address) {
        this.address = address;
    }
}

1.3:二传手注入

Java

class Student {
    Address address;
  
    @Autowired
    void setaddress(Address address) {
        this.address = address;
    }
}

@Qualifier 注解

@Qualifier 注解用于解决存在多个相同类型 bean 时的自动装配冲突。 @Qualifier 注解可以用在任何用@Component 注解的类或用@Bean 注解的方法上。此注释也可以应用于构造函数参数或方法参数。

插图:

Java

public interface Vehicle {
     public void start();
}

执行:

假设有两个 bean,Car 和 Bike 实现 Vehicle 接口

例子:

Java

@Component(value="car")
public class Car implements Vehicle {
  
     @Override
     public void start() {
           System.out.println("Car started");
     }
  
 }
  
@Component(value="bike")
public class Bike implements Vehicle {
  
     @Override
     public void start() {
          System.out.println("Bike started");
     }
  
}

例子:

Java

@Component
public class VehicleService {
  
    @Autowired
    @Qualifier("bike")
    private Vehicle vehicle;
  
    public void service() {
         vehicle.start();
    }
}

@Primary 注解

这表明当多个 bean 是自动装配到单值依赖项的候选对象时,应该优先考虑特定的 bean。如果候选中恰好存在一个“主”bean,则它将是自动装配的值。让我们用一个例子来理解这个语句

示例:在某些情况下,我们需要注册多个相同类型的 bean。在此示例中 Employee1() 和 Employee2() 类型的 Employee bean:

Java

@Configuration
public class Config {
  
    @Bean
    public Employee Employee1() {
        return new Employee("Employee1");
    }
  
    @Bean
    public Employee Employee2() {
        return new Employee("Employee2");
    }
}

在这种情况下,如果我们尝试运行应用程序 Spring 将抛出NoUniqueBeanDefinitionException 。为了解决这个问题,Spring 提供了 @Primary 注释。

Java

@Configuration
public class Config {
  
    @Bean
    public Employee Employee1() {
        return new Employee("Employee1");
    }
  
    @Bean
      @Primary
    public Employee Employee2() {
        return new Employee("Employee2");
    }
}

在上面的代码中,我们用@Primary 标记了Employee2() bean。 Spring 将优先于 Employee1() 注入 Employee2() bean。

2. 上下文配置注解

下面列出了 Spring Framework 中可用的一些上下文配置注释

  • @轮廓
  • @进口
  • @ImportResource
  • @PropertySource 等。

@Profile 注释

如果您希望 Spring 仅在特定配置文件处于活动状态时使用 @Component 类或 @Bean 方法,那么您可以使用 @Profile 标记它。

例子

Java

@Component
@Profile("developer")
public class Employee {}

@Import 注解

Spring @Import 注解导入一个或多个 @Configuration 类。它相当于 Spring XML 中的 元素。如果应用程序使用@ComponentScan,那么所有@Configuration 类都会被自动扫描,不需要使用@Import 注解。但在某些情况下,我们只想扫描选定的@Configuration 类,在这种情况下,@Import 注释很有用。

例子:

Java

@Configuration
@Import(Conf1.class)
public class Config {
   ------
}

我们还可以导入多个配置类,如下所示。

Java

@Configuration
@Import({Conf1.class, Conf2.class})
public class Config {
   ------
}

@PropertySource 注解

Spring @PropertySource 注解用于向 Spring Environment 提供属性文件。此注释与 @Configuration 类一起使用。

例子:

Java

@Configuration
@PropertySource("classpath:db.properties")
public class DBConfiguration {
    //...
}

这个注解是可重复的,这意味着我们可以在一个 Configuration 类上有多个 PropertySource。如果您使用的是Java 8 或更高版本,则此功能可用。

例子:

Java

@Configuration
@PropertySource("classpath:db.properties")
@PropertySource("classpath:root.properties")
public class DBConfiguration {
    //...
}