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

栏目: Java · 发布时间: 7年前

内容简介:Java总是因为臃肿而受到批评。但是有一些方法可以最小化所有臃肿重复代码。这个Spring beans教程向您展示了如何编写更高效的应用程序。假设我们有50个不同的StateFormParsers用于解析每个传入表单获得所在的州名称,每个、表单都有一组不同的字段。此外,每个表单中表达州名称的格式可能是文本或HTML,因此我们需要100个不同的解析器(50个状态乘以两种不同的格式)。我们绝对可以找到代码共享的地方,但我们仍需要为进入系统的每个表单找到正确的解析器。现在,当我们收到表单时,我们希望找到一种优雅

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

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

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

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

注释类的定义

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

需要创建的注释如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
<b>public</b> @<b>interface</b> StateFormParser {
 
   String state();
   String format() <b>default</b> <font>"text"</font><font>;
}
</font>

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

@StateFormParser(state=<font>"CA"</font><font>, format=</font><font>"html"</font><font>)
<b>public</b> <b>class</b> CaliforniaParser <b>extends</b> StateFormParserBaseClass {
}
</font>

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

@ComponentScan(basePackages = [<font>"com.serverside],includeFilters = [
  @ComponentScan.Filter(type=FilterType.ANNOTATION, value=StateFormParser.<b>class</b>),
  @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Repository.<b>class</b>),
  @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Service.<b>class</b>),                
  @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Controller.<b>class</b>)
  ]
)
</font>

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

但是如何找回它们?

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

Map<String, Object> getBeansWithAnnotation(
Class<? <b>extends</b> Annotation> annotationType) 
throws BeansException;

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

@Autowired Map<String, StateFormParserBaseClass> formParserMap;

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

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

<b>private</b> StateFormParserBaseClass getFormParser(String state, String format) {
  StateFormParserBaseClass beanFormParser = <b>null</b>;
 
  <b>for</b> (StateFormParserBaseClass <b>for</b>mParser: <b>for</b>mParserMap.values()) {
    StateFormParser stateFormParser = formParser.getClass().getAnnotation(StateFormParser.<b>class</b>);
    <b>if</b> (stateFormParser.state().equals(state) && stateFormParser.format().equals(format)) {
    beanFormParser = formParser;
    }
  }
    <b>return</b> beanFormParser
}

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ant Colony Optimization

Ant Colony Optimization

Marco Dorigo、Thomas Stützle / A Bradford Book / 2004-6-4 / USD 45.00

The complex social behaviors of ants have been much studied by science, and computer scientists are now finding that these behavior patterns can provide models for solving difficult combinatorial opti......一起来看看 《Ant Colony Optimization》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具