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