Java编程语言从Java 5.0开始为注解提供支持。领先的Java框架很快就采用了注解,Spring 框架开始使用2.5版本的注解。由于它们的定义方式,注释在其声明中提供了大量上下文。
在注释之前,Spring 框架的行为主要通过 XML 配置进行控制。今天,注释的使用为我们提供了如何配置 Spring 框架行为的巨大功能。
在这篇文章中,我们将看看 Spring 框架中可用的注释。
Spring 框架核心注释
@Required
此注释应用于bean setter方法。考虑一个需要强制执行所需属性的场景。@Required注释指示受影响的bean必须在配置时使用必需的属性填充。否则,将引发BeanInitializationException类型的异常。
@Autowired
此注释应用于字段、setter方法和构造函数。@Autowired注释隐式注入对象依赖关系。
当您在字段上使用@Autowired并使用属性名称传递字段的值时,Spring将自动为字段分配传递的值。
您甚至可以在私有属性上使用@Autowired,如下所示。(不过,这是一个非常糟糕的做法!)
public class Customer {
@Autowired
private Person person;
private int type;
}
当您在setter方法上使用@Autowired时,Spring会尝试通过在方法上键入autowireing来执行它。您指示Spring应该使用setter方法初始化此属性,在该方法中您可以添加自定义代码,就像使用此属性初始化任何其他属性一样。
public class Customer {
private Person person;
@Autowired
public void setPerson (Person person) {
this.person=person;
}
}
考虑这样一个场景:您需要类A的实例,但没有将A存储在类的字段中。您只需要使用A来获得B的一个实例,并且您将B存储在该字段中。在这种情况下,setter方法自动布线将更适合您。您将不会有类级别未使用的字段。
当您在构造函数上使用@Autowired时,构造函数注入会在创建对象时发生。它告诉构造函数在用作Bean时自动连线。这里需要注意的一点是,任何Bean类只有一个构造函数可以携带@Autowired注释。
@Component
public class Customer {
private Person person;
@Autowired
public Customer (Person person) {
this.person=person;
}
}
注意:从Spring 4.3开始,@Autowired在具有单个构造函数的类上成为可选的。在上面的例子中,如果您省略了@Autowired注释,Spring仍然会注入Person类的一个实例。
@Qualifier
此注释与@Autowired注释一起使用。当您需要对依赖项注入过程进行更多控制时,可以使用@Qualifier@可以在各个构造函数参数或方法参数上指定限定符。此注释用于避免在创建多个相同类型的bean并希望仅将其中一个bean与属性关联时出现混淆。
考虑一个例子,其中接口BeanInterface由两个bean(BeanB1和BeanB2)实现。
@Component
public class BeanB1 implements BeanInterface {
//
}
@Component
public class BeanB2 implements BeanInterface {
//
}
现在,如果BeanA自动连接这个接口,Spring将不知道要注入两个实现中的哪一个。
这个问题的一个解决方案是使用@Qualifier注释。
@Component
public class BeanA {
@Autowired
@Qualifier("beanB2")
private IBean dependency;
...
}
添加了@Qualifier注释后,Spring现在将知道要自动连接哪个bean,其中beanB2是beanB2的名称。
@Configuration
此注释用于定义bean的类@配置是对XML配置文件的模拟——它是使用Java类进行配置的。用@Configuration注释的Java类本身就是一个配置,它将具有实例化和配置依赖项的方法。
以下是一个示例:
@Configuartion
public class DataConfig {
@Bean
public DataSource source() {
DataSource source = new OracleDataSource();
source.setURL();
source.setUser();
return source;
}
@Bean
public PlatformTransactionManager manager() {
PlatformTransactionManager manager = new BasicDataSourceTransactionManager();
manager.