Spring Bean Annotations

  1. Overview

介绍用于定义不同类型的 Bean 的最常见的 Spring Bean 注解。
有几种方法可以在 Spring 容器中配置 bean。首先,我们可以使用 XML 配置声明它们。我们还可以使用configuration(配置)类中的@Bean注解来声明 bean。
最后,我们可以用 org.springframework.stereotype 包中的一个注解来标记类,其余的留给组件扫描。

  1. Component Scanning

如果启用了组件扫描,Spring 可以自动扫描包装中的 bean。
@ComponentScan配置要扫描哪些包以查找具有注解配置的类。我们可以直接使用 basePackages 或 value 参数之一指定基本包名称(value 是 basePackages 的别名):

@Configuration
@ComponentScan(basePackages = "com.baeldung.annotations")
class VehicleFactoryConfig {}

此外,我们可以使用 basePackageClasses 参数指向基本包中的类:

@Configuration
@ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
class VehicleFactoryConfig {}

这两个参数都是数组,因此我们可以为每个参数提供多个包。
如果未指定参数,则扫描将从存在@ComponentScan注解类的同一包中进行。

@ComponentScan 利用了 Java 8 的重复注解特性,这意味着我们可以用它多次标记一个类:

@Configuration
@ComponentScan(basePackages = "com.baeldung.annotations")
@ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
class VehicleFactoryConfig {}

或者,我们可以使用@ComponentScans来指定多个@ComponentScan配置:

@Configuration
@ComponentScans({ 
  @ComponentScan(basePackages = "com.baeldung.annotations"), 
  @ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
})
class VehicleFactoryConfig {}

使用 XML 配置时,配置组件扫描同样简单:

<context:component-scan base-package="com.baeldung" />
  1. @Component

@Component是类级别注解。在组件扫描期间,Spring 框架会自动检测带有@Component注解的类:

@Component
class CarUtility {
    // ...
}

默认情况下,此类的 Bean 实例与类名具有相同的名称,但首字母为小写。此外,我们可以使用此注释的可选值参数指定不同的名称。

由于@Repository、@Service、@Configuration 和 @Controller 都是 @Component 的元注释,因此它们共享相同的 Bean 命名行为。Spring 还会在组件扫描过程中自动识别它们。

  1. @Repository

DAO 或存储库类通常表示应用进程中的数据库访问层,应使用@Repository进行注释:

@Repository
class VehicleRepository {
    // ...
}

使用此注解的一个优点是它启用了自动持久性异常转换。当使用持久性框架(如Hibernate)时,在用@Repository注释的类中抛出的本机异常将自动转换为Spring的DataAccessExeption的子类。

要启用异常翻译,我们需要声明我们自己的 PersistenceExceptionTranslationPostProcessor bean:

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

请注意,在大多数情况下,Spring 会自动执行上述步骤。
或通过 XML 配置:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
  1. @Service

应用进程的业务逻辑通常驻留在服务层内,因此我们将使用 @Service 注释来指示类属于该层:

@Service
public class VehicleService {
    // ...    
}
  1. @Controller

@Controller是一个类级注解,它告诉 Spring 框架这个类在 Spring MVC 中充当控制器。

@Controller
public class VehicleController {
    // ...
}
  1. @Configuration

配置类可以包含用@Bean注解的 Bean 定义方法:

@Configuration
class VehicleFactoryConfig {

    @Bean
    Engine engine() {
        return new Engine();
    }

}
  1. Stereotype Annotations(构造型注解) and AOP

当我们使用 Spring 构造型注释时,很容易创建一个针对具有特定构造型的所有类的切入点。

例如,假设我们要从 DAO 层测量方法的执行时间。我们将创建以下方面(使用 AspectJ 注释),利用@Repository构造型

@Aspect
@Component
public class PerformanceAspect {
    @Pointcut("within(@org.springframework.stereotype.Repository *)")
    public void repositoryClassMethods() {};

    @Around("repositoryClassMethods()")
    public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint) 
      throws Throwable {
        long start = System.nanoTime();
        Object returnValue = joinPoint.proceed();
        long end = System.nanoTime();
        String methodName = joinPoint.getSignature().getName();
        System.out.println(
          "Execution of " + methodName + " took " + 
          TimeUnit.NANOSECONDS.toMillis(end - start) + " ms");
        return returnValue;
    }
}

在此示例中,我们创建了一个切入点,该切入点与用@Repository注释的类中的所有方法匹配。然后,我们使用@Around建议来定位该切入点,并确定截获的方法调用的执行时间

此外,使用这种方法,我们可以为每个应用层添加日志记录、性能管理、审计和其他行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值