《Spring攻略(第2版)》——1.10 用@Required注解检查属性

简介: 为了要求Spring检查所有序列生成器实例上这些属性是否已经设置,你必须在IoC容器中注册一个RequiredAnnotationBeanPostProcessor实例。如果你打算使用Bean工厂,就必须通过API注册这个Bean后处理器,否则,只能在应用上下文中声明这个Bean后处理器的实例。

本节书摘来自异步社区《Spring攻略(第2版)》一书中的第1章,第1.10节,作者: 【美】Gary Mak , Josh Long , Daniel Rubio著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.10 用@Required注解检查属性

1.10.1 问题
Spring的依赖检查功能仅能检查某些类型的所有属性。它的灵活性不够,不能仅检查特定的属性。在大部分情况下,你希望检查特定的属性是否设置,而不是特定类型的所有属性。

1.10.2 解决方案
RequiredAnnotationBeanPostProcessor是一个Spring bean后处理器,检查带有@Required注解的所有Bean属性是否设置。Bean后处理器是一类特殊的Spring bean,能够在每个Bean初始化之前执行附加的工作。为了启用这个Bean后处理器进行属性检查,必须在Spring IoC容器中注册它。注意,这个处理器只能检查属性是否已经设置,而不能测试属性是否非空。

1.10.3 工作原理
假定对于序列生成器来说,prefixGenerator和suffix属性都是必要的。你可以用@Required注解它们的设值方法。

package com.apress.springrecipes.sequence;

import org.springframework.beans.factory.annotation.Required;

public class SequenceGenerator {
   private PrefixGenerator prefixGenerator;
   private String suffix;
   ...
   @Required
   public void setPrefixGenerator(PrefixGenerator prefixGenerator) {
     this.prefixGenerator = prefixGenerator;
   }

   @Required
   public void setSuffix(String suffix) {
     this.suffix = suffix;
   }
   ...
}

为了要求Spring检查所有序列生成器实例上这些属性是否已经设置,你必须在IoC容器中注册一个RequiredAnnotationBeanPostProcessor实例。如果你打算使用Bean工厂,就必须通过API注册这个Bean后处理器,否则,只能在应用上下文中声明这个Bean后处理器的实例。

<bean class="org.springframework.beans.factory.annotation.![C:\Documents and Settings\cmm09a\桌面\0.tif{9}](/api/storage/getbykey/screenshow?key=1505ff37ffe85a509ae6)
   RequiredAnnotationBeanPostProcessor" />

如果你正在使用Spring 2.5或者更高版本,可以简单地在Bean配置文件中包含元素,这将自动地注册一个RequiredAnnotationBeanPostProcessor实例。

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:annotation-config />
   ...
</beans>

如果任何带有@Required的属性未设置,Bean后处理器将抛出一个BeanInitializationException异常。

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'sequenceGenerator' defined in class path resource [beans.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.
BeanInitializationException: Property 'prefixGenerator' is required for bean
'sequenceGenerator'

除了@Required注解之外,RequiredAnnotationBeanPostProcessor还能用自定义的注解检查属性。例如,你可以创建如下注解类型:

package com.apress.springrecipes.sequence;
...
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Mandatory {
}

然后将这个注解应用到必要属性的设值方法。

package com.apress.springrecipes.sequence;

public class SequenceGenerator {

   private PrefixGenerator prefixGenerator;
   private String suffix;
   ...
   @Mandatory
   public void setPrefixGenerator(PrefixGenerator prefixGenerator) {
     this.prefixGenerator = prefixGenerator;
   }

   @Mandatory
   public void setSuffix(String suffix) {
     this.suffix = suffix;
   }
   ...
}

为了用这个注解类型检查属性,你必须在RequiredAnnotationBeanPostProcessor的required AnnotationType属性中指定。

<bean class="org.springframework.beans.factory.annotation.
   RequiredAnnotationBeanPostProcessor">
   <property name="requiredAnnotationType">
     <value>com.apress.springrecipes.sequence.Mandatory</value>
   </property>
</bean>
相关文章
|
19天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
8天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
28 4
SpringBoot必须掌握的常用注解!
|
9天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
44 2
|
9天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
26 1
|
1天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
7 0
|
4天前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
8 0
|
16天前
|
存储 Java 数据管理
强大!用 @Audited 注解增强 Spring Boot 应用,打造健壮的数据审计功能
本文深入介绍了如何在Spring Boot应用中使用`@Audited`注解和`spring-data-envers`实现数据审计功能,涵盖从添加依赖、配置实体类到查询审计数据的具体步骤,助力开发人员构建更加透明、合规的应用系统。
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
29天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
149 2
下一篇
无影云桌面