Spring Bean 管理注解解析

本文探讨了Spring框架中最常见的Bean注解,包括组件扫描、@Component、@Repository、@Service、@Controller及@Configuration等。介绍了如何使用这些注解来定义不同类型的Bean,并展示了组件扫描的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同系列文章java 常用注解教程

目录

1.概述

2.组件扫描

3. @Component

4. @Repository

5. @Service

6. @Controller

7. @Configuration

8.原型注释和AOP

9.结论


1.概述

在本文中,我们将讨论用于定义不同类型bean的最常见的springbean注释。

有几种方法可以在Spring容器中配置bean。我们可以使用XML配置声明它们。我们可以在配置类中使用@Bean注释来声明Bean。

或者我们可以用org.springframework.stereotype打包,剩下的留给组件扫描。

2.组件扫描

如果启用了组件扫描,Spring可以自动扫描包中的bean。

@ComponentScan配置使用注释配置扫描类的包。我们可以使用其中一个本地文件夹或value参数直接指定基包名称(value是本地文件夹的别名):

@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" />

3. @Component

@Component 是类级别的注释。在组件扫描期间,springframework自动检测用@component注释的类。

例如:

@Component
class CarUtility {
    // ...
}

默认情况下,这个类的bean实例与类名具有相同的名称,并以小写字母开头。除此之外,我们可以使用此注释的可选值参数指定不同的名称。

因为@Repository、@Service、@Configuration和@Controller都是@Component的元注释,它们共享相同的bean命名行为。另外,在组件扫描过程中,Spring会自动加载它们。

4. @Repository

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

@Repository
class VehicleRepository {
    // ...
}

使用此注释的一个优点是它启用了自动持久性异常转换。当使用@execution的本地访问类的@accession时,将自动将此类持久性转换为带有@execption的本地类的持久性。

要启用异常转换,我们需要声明自己的PersistenceExceptionTranslationPostProcessor 类:

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

注意,在大多数情况下,Spring会自动执行上述步骤。

或者,通过XML配置:

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

5. @Service

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

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

6. @Controller

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

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

7. @Configuration

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

@Configuration
class VehicleFactoryConfig {
 
    @Bean
    Engine engine() {
        return new Engine();
    }
 
}

8.原型注释和AOP

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

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

@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建议,然后以该切入点为目标,并确定截获的方法调用的执行时间。

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

9.结论

在本文中,我们研究了Spring原型注释,并了解了这些注释代表了什么类型的语义。

我们还学习了如何使用组件扫描来告诉容器在哪里可以找到带注释的类。

最后,我们看到了这些注释如何导致一个干净的、分层的设计以及应用程序关注点之间的分离。它们还使配置更小,因为我们不再需要显式地手动定义bean。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值