原文: https://howtodoinjava.com/spring-core/spring-annotations/
了解最广泛使用的 Spring 注解。 在本教程中,我们将简要介绍 spring 核心提供的重要注解,这些注解用于定义 bean 和创建复杂的应用程序上下文配置。
1. Bean 注解
给定的注解列表用于在 Spring 中定义 bean 并在应用程序上下文中控制其注册首选项。
@Bean
方法级别的注解,用于声明 Spring bean。 当配置执行带注解的方法时,它将返回值注册为BeanFactory中的 Bean。默认情况下,bean 名称将与方法名称相同。 要自定义 Bean 名称,请使用其name或value属性。
@BeanEmployeeService employeeService(){return new EmployeeServiceImpl();}
@Component
指示带注解的类是“组件”,并且在使用基于注解的配置和类路径扫描时将被自动检测。要使用此注解,请将其应用于类,如下所示:
@Componentpublic class EmployeeDAOImplimplements EmployeeDAO {...}
@Repository
@Component注解的特化。 除了将带注解的 DAO 类导入 DI 容器之外,它还使未经检查的异常(从 DAO 方法抛出)有资格转换为 Spring DataAccessException。
@Repositorypublic class EmployeeDAOImplimplements EmployeeDAO{//...}
@Service
@Component注解的特化。 它表明一个类是“业务服务门面”或类似的名称。
@Service ("employeeManager")public class EmployeeManagerImplimplements EmployeeManager{@AutowiredEmployeeDAO 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 {@Autowiredprivate 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@Lazyprivate 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}@Componentpublic class NotificationService {@Lookuppublic AppNotification getNotification() {//return new AppNotification();}}
@Primary
指示当多个候选者有资格自动装配单值依赖项时,应优先考虑 Bean。当不使用@Primary时,我们可能需要提供@Qualifier注解以正确注入 bean。在给定的示例中,当自动装配FooRepository时,将注入HibernateFooRepository的实例 – 直到使用@Qualifier注解。
@Componentpublic class JdbcFooRepositoryextends FooRepository {}@Primary@Componentpublic class HibernateFooRepositoryextends 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 定义。
@Configurationpublic class AppConfig {@Beanpublic 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 注解列表或解释的问题与我联系。
学习愉快!
参考:
