使用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应用程序方法调用来简化问题。


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

查看所有标签

猜你喜欢:

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

金融数量分析

金融数量分析

郑志勇 / 北京航空航天大学出版社 / 2014-7-1 / CNY 58.00

《金融数量分析——基于MATLAB编程(第3版)》一书中的案例均来源于作者的工作实际,并充分体现“案例的实用性、程序的可模仿性”,程序中附有详细的注释。例如,投资组合管理、KMV模型计算、期权定价模型与数值方法、风险价值VaR的计算等案例程序,读者可以直接使用或根据需要在源代码的基础上修改、完善。 本书共23章。前两章分别对金融市场的基本概况与MATLAB的基础知识进行概述;接下来为20个金......一起来看看 《金融数量分析》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

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

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器