Spring 核心注解
Spring Annotations是一种元数据形式,提供有关程序的数据。注释用于提供有关程序的补充信息。它对他们注释的代码的操作没有直接影响。它不会改变编译程序的动作。 在 Spring 框架中,注解分为不同的类型。
Spring 框架注解的类型
基本上,整个 Spring 框架中有 6 种类型的注解可用。
- Spring 核心注解
- Spring Web 注释
- Spring Boot 注解
- Spring 调度注解
- Spring 数据注解
- Spring Bean 注解
所以在这篇文章中,我们将讨论Spring Core Annotations。
Spring 核心注解
org.springframework.beans.factory.annotation和org.springframework.context.annotation包中的 Spring 注解通常称为 Spring Core 注解。我们可以将它们分为两类:
- DI 相关注解
- 上下文配置注释
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");
}
}
So in this case, if you want to inject the Bike bean in VehicleService then you must use @Autowired with @Qualifier annotation. If you didn’t use @Qualifier, it will throw NoUniqueBeanDefinitionException.
例子:
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 中的
例子:
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 {
//...
}