Spring(16)——使用注解进行bean定义

简介: 16 使用注解进行bean定义 除了在Spring配置文件中通过bean元素定义一个bean外。我们还可以通过在Class上使用特定的注解进行标注,然后让Spring去扫描这些特定的注解,并把它们当做一个bean进行定义。

16 使用注解进行bean定义

除了在Spring配置文件中通过bean元素定义一个bean外。我们还可以通过在Class上使用特定的注解进行标注,然后让Spring去扫描这些特定的注解,并把它们当做一个bean进行定义。

16.1 @Component

@Component是Spring中用来定义bean最基本的注解,通过在Class类上标注对应的注解就可以让Spring扫描到对应的定义,并把其作为一个bean定义到对应的bean容器中。

@Component
public class Hello {
	
}

当Spring扫描到这样一个使用@Component进行标注的类时,默认会定义一个beanName为我们的类名的bean,对应首字母小写。所以在上述示例中默认就会生成一个类型为Hello,beanName为“hello”的bean。当然我们也可以通过@Component的value属性来指定需要生成的bean的beanName。如下示例中就通过value属性指定了对应生成的bean的beanName为“abc”。

@Component("abc")
public class Hello {
	
}

除了@Component外,Spring默认还支持对@Controller、@Service和@Repository注解的扫描。它们可以用来标注在特定bean上,如通常会将@Controller标注在Controller层的类上,将@Service标注在Service层的类上,然后将@Repository标注在Dao层的类上。这些都只是不成文的规定而已,如果用户愿意,我们也可以在Service层上使用@Controller、@Component等进行标注,Spring在扫描到之后都会将它们以对应的bean进行定义。之所以有这么几种不同的注解可以用来定义bean,其中一个主要的原因是我们可以通过不同的注解来区分不同的bean类型,然后可以让Spring在进行扫描的时候只扫描特定类型的注解。当我们使用SpringMVC时,我们常会让SpringMVC对应的ApplicationContext只扫描@Controller,然后让传统的ApplicationContext只扫描除@Controller以外的其它类型的注解,用以将不同类型的bean定义在不同的bean容器中,这样某些针对特定bean容器中的操作就只会针对某些bean产生作用。@Controller、@Service和@Repository也可以通过value属性来指定对应需要生成的bean定义的beanName,默认都是当前Class类名的首字母小写后的结果。

16.2 定义自己的@Component

我们也可以通过@Component定义自己的注解,即在自己的注解上使用@Component进行标注,这样当我们使用自定义的注解标注在Class上时,Spring默认也会将其作为一个bean进行定义。如下我们定义了一个@MyComponent,然后在其上面使用@Component进行了标注,当然这里使用@Controller、@Service和@Repository等进行标注也是可以的,实际上它们的定义也都是使用@Component进行了标注的。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface MyComponent {

	public String value() default "";
	
}

之后我们可以在Class上使用@MyComponent进行标注,Spring在进行扫描时默认也会将它们作为一个bean进行定义。

@MyComponent("abc")
public class Hello {
	
}

其实,我们还可以让Spring扫描自定义的注解,让其将标注了自定义注解的Class定义为对应的bean,而我们的自定义注解可以不必使用@Component等原始就支持的注解进行标记。当然,这种用法也是需要进行些许配置的,主要就是告诉Spring需要扫描哪些注解,这部分内容将在后续讲解扫描时的过滤器时进行讲解。

16.3 设置扫描类路径

其实光使用@Component等标注在Class上还不足以使Spring进行扫描并将它们作为一个bean进行定义。我们必须通过配置来告诉Spring进行扫描的类路径。首先我们必须在Spring的配置文件中引入context命名空间,然后通过<context:component-scan/>标签定义启用Spring扫描@Component等注解的功能。<context:component-scan/>标签有一个必须指定的属性,base-package,其是用来指定我们需要进行扫描的基本包路径的,指定后Spring将扫描base-package指定的包及其子孙包。如果需要指定多个基础包,则可以通过逗号进行分隔。如下示例,则表示Spring将扫描类路径下com.app.service包及其子孙包,以及com.app.dao包及其子孙包下的所有类以寻找使用@Component等注解进行标注的Class定义为对应的bean。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="com.app.service,com.app.dao" />	

</beans>

定义了<context:component-scan/>标签后,Spring默认将隐式的启用对注解的支持,即之前介绍的@Autowired等注解的使用,所以使用了该标签以后我们没必要再在Spring配置文件中显式的定义<context:annotation-config/>了。这可以通过annotation-config属性进行定义,默认是true,改成false就可以禁用自动启用对注解支持。

<context:component-scan base-package="com.app" annotation-config="true"/>	

除了必须指定的属性base-package之外,<context:component-scan/>还可以指定如下属性。

  • resource-pattern:表示可以被自动检测的Class的形式,默认为“**/*.class”,即所有的class文件。这个只是用来告诉Spring需要对哪些文件进行扫描,而并不是把它们自动定义为对应的bean。这个需要与后续需要介绍的filter区分开。
  • use-default-filters:表示使用使用默认的filter,。<context:component-scan/>将把哪些Class自动注册到bean容器是由对应的filter来控制的。该属性的值默认为true,即默认会使用默认的filter。而默认的filter会将标注了@Component、@Controller、@Service和@Repository的类,包括这四个注解所标注的注解所标注的类,都会将它们自动注册到bean容器中。
  • annotation-config:是否启用对注解的支持,即隐式的启用<context:annotation-config/>,默认为true。
  • name-generator:默认的beanName生成器,即在没有显式的指定beanName时,自动注册的bean将如何使用默认的beanName。默认将使用Class的简称,即不包含包名的类名称,并将首字母小写作为当前bean的名称。用户可以通过实现org.springframework.beans.factory.support.BeanNameGenerator接口并指定其为当前的name-generator来改变对应的策略。
  • scope-resolver:指定用于解析bean定义的scope的ScopeMetadataResolver,默认将通过AnnotationScopeMetadataResolver进行解析,而该解析器将根据类上标注的@Scope注解来解析对应的scope。默认没有指定@Scope的都是单例。
  • scoped-proxy:表示是否需要为自动检测到的需要加入bean容器中的bean生成对应的代理。默认是不生成。可选值有“no”、“interfaces”和“targetClass”,分别对应不生成、根据接口生成和根据目标class生成。这对需要使用代理的scope是非常有必须要的,如request、session等。更详细的内容请参考先前专门介绍scope的那篇文章。

16.4 使用@Scope指定scope

Spring在通过<context:component-scan/>自动检测需要添加到bean容器中的bean定义时,默认会将检测到的类单例形式添加到bean容器。如果用户希望使用其它类型的scope,则可以通过在类定义上使用@Scope进行指定。具体的scope是由@Scope的value属性进行指定的,默认是单例。如下是一个通过@Scope指定对应bean的scope为prototype的示例,即是多例形式,每次从bean容器中请求时都会获取一个全新的bean对象。

@Component
@Scope("prototype")
public class Hello {
	
}

此外,我们还可以通过@Scope的proxyMode属性指定当前bean的代理模式。其对应ScopedProxyMode类型的枚举,可选值有DEFAULT、NO、INTERFACES和TARGET_CLASS,默认是不代理。DEFAULT的作用等同于NO。

 

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Hello {
	
	
}

 

目录
相关文章
|
3月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
550 128
|
3月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
423 0
|
3月前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
298 126
|
4月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
383 2
|
3月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
369 1
使用Spring的@Retryable注解进行自动重试
|
3月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
297 12
|
3月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
185 0
探索Spring Boot的@Conditional注解的上下文配置
|
3月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
135 0
Spring中最大化@Lazy注解,实现资源高效利用