【问题标题】:Spring MVC 3.0 - Service layer using annonationsSpring MVC 3.0 - 使用注解的服务层
【发布时间】:2011-10-29 07:29:12
【问题描述】:

在我的带有单个 Controller 类的 Spring MVC 应用程序中,

@Controller
public class MyController {
@RequestMapping(method = RequestMethod.POST, value = "/*.htm")
public myMethod{@RequestBody final MyRequestBean myRequest}

}

我的输入是 JSON 格式,我使用 Jackson 将其转换为 Java 对象。 现在,基于 Java 对象中的属性,我想发送到适当的服务类。 如果是的话,

myRequest.value == "1" -> FirstService
myRequest.value == "2" -> SecondService

所有这些服务类都将实现一个基本接口。 我不想在我的 Java 代码中进行这种实例化。如何将其移至配置文件。如何根据请求值动态注入这些对象。请注意,我正在使用注释。 我是Spring新手。请指教

编辑:包括我的解决方案
在我的 dispatcher.xml 中,

`<util:map id="myMap">
<entry key="service1" value="com.service.MyService1" /> 
<entry key="service2" value="com.service.MyService1" />
</util:map>` 

在我的控制器中,

@Resource private Map myMap;

在控制器内部的方法中,
MyService myService = (MyService) Class.forName((String)myMap.get(myRequest.getValue())).newInstance(); System.out.println("My value" + myService.doService());

可以看出,已经使用 Java 反射从我的 XML 返回的字符串中获取实例。这是正确的方法吗?

【问题讨论】:

    标签: spring model-view-controller spring-mvc annotations inversion-of-control


    【解决方案1】:
    1. 创建一个可以创建所有可能实例之一的 FactoryBean
    2. 使用线程本地持有者RequestAttributes获取请求
    3. 制作@Scope("request")的控制器
    4. 通过接口注入服务

    这对控制器来说应该很容易。但这是一种丑陋的方法。这是另一个:

    1. 注入List&lt;YourInterface&gt;
    2. 在接口getImplementationId()中定义一个方法
    3. 在每个请求上迭代列表并选择返回正确 id 的实现

    这种变化可以是:

    • 用 key 预填充 Map - 来自 json 的 key 和 value - 一个特定的 impl
    • 在实现bean名称中包含jsod键并注入Map&lt;String, YourInterface&gt;

    然后按键查找

    【讨论】:

    • 第二种方法(使用列表)类似于我的想法。但是有更清洁的方法吗?不是遍历列表,而是可以直接映射。如果这是建议的最后一个选项,请您详细说明
    • 是的,它可以是一个地图,你只需要以某种方式指定键
    • 我会使用枚举作为键,我也会让枚举提供实现类
    • @Bozho:感谢您的回复。最后我做了这样的事情:在我的 dispatcher.xml 中,' 在我的控制器中,'@Resource private Map myMap;' 和控制器内部的方法中, 'MyService myService = (MyService) Class.forName((String)myMap.get(myRequest.getValue())).newInstance(); System.out.println("我的价值" + myService.doService());'
    • 抱歉格式化。无法弄清楚如何正确使用格式。如果您注意到,我会使用 Java 反射从 xml 返回的字符串创建类。这是正确的方法吗
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 2023-04-09
    • 2013-12-18
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2013-10-09
    • 2021-07-12
    相关资源
    最近更新 更多