前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Spring的注解和反射让代码更精简

使用Spring的注解和反射让代码更精简

作者头像
lyb-geek
发布2022-03-10 11:10:02
5090
发布2022-03-10 11:10:02
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

Java总是因为臃肿而受到批评。但是有一些方法可以最小化所有臃肿重复代码。这个Spring beans教程向您展示了如何编写更高效的应用程序。

假设我们有50个不同的StateFormParsers用于解析每个传入表单获得所在的州名称,每个、表单都有一组不同的字段。此外,每个表单中表达州名称的格式可能是文本或HTML,因此我们需要100个不同的解析器(50个状态乘以两种不同的格式)。我们绝对可以找到代码共享的地方,但我们仍需要为进入系统的每个表单找到正确的解析器。

现在,当我们收到表单时,我们希望找到一种优雅的方法来从控制反转(IoC)容器中检索正确的实现。我们只想要传入数据告诉我们状态和格式就可以了。

我们如何快速简单地找到我们需要的Spring bean?

注解类的定义

首先创建一个自定义注解,可以将其放在每个实现类上,使它们成为可用的一种Spring bean。甚至可能在ComponentScan中使用新的注解,以便这个注解将放在每一个类上,并使每个实现类都成为一个Spring bean,甚至不必在其上添加@Component类型的注解了。

需要创建的注解如下:

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface StateFormParser {

   String state();
   String format() default "text";
}

这样可以在每个解析器上使用此注解,然后设置状态和格式值。以下是支持州名称是HTML格式的解析器示例,CA代表California :

代码语言:javascript
复制
@StateFormParser(state="CA", format="html")
public class CaliforniaParser extends StateFormParserBaseClass {
}

下一步是在Spring组件扫描配置中,将它添加到componentScan配置的includeFilters属性中。使用@ComponentScan时,它看起来像这样:

代码语言:javascript
复制
@ComponentScan(basePackages = ["com.serverside],includeFilters = [
  @ComponentScan.Filter(type=FilterType.ANNOTATION, value=StateFormParser.class),
  @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Repository.class),
  @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Service.class),                
  @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Controller.class)
  ]
)

当Spring IoC容器创建其ApplicationContex/BeanFactory时,解析器bean将存在上下文中。

但是如何找回它们?

Spring在ListableBeanFactory中有一个扩展BeanFactory的方法,你可以在ApplicationContext中找到它。

代码语言:javascript
复制
Map<String, Object> getBeansWithAnnotation(
Class<? extends Annotation> annotationType) 
throws BeansException;

我们用这个方法可以获得所有使用我们自定义注解@StateFormParser标注的所有bean,如果每个bean还实现相同的类StateFormParserBaseClass,我们也可以执行autowiring。

@Autowired MapformParserMap;

map 的String是bean名称,值是bean实例。

下面代码是循环Map寻找出每个Bean,以发现我们需要使用的解析器Bean:

代码语言:javascript
复制
private StateFormParserBaseClass getFormParser(String state, String format) {
  StateFormParserBaseClass beanFormParser = null;

  for (StateFormParserBaseClass formParser: formParserMap.values()) {
    StateFormParser stateFormParser = formParser.getClass().getAnnotation(StateFormParser.class);
    if (stateFormParser.state().equals(state) && stateFormParser.format().equals(format)) {
    beanFormParser = formParser;
    }
  }
    return beanFormParser
}

还有许多其他方法可以检索正确的解析器bean,但是使用这个Spring bean教程,您可以使用注解和简单的反射方法或Spring应用程序方法调用来简化问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档