弹簧动态注入,工厂化模式

2024-01-19

延续自依赖注入、延迟注入实践 https://stackoverflow.com/questions/10384473/dependency-injection-delayed-injection-praxis/10414747。我有主课:

package test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Scanner;

@Component
public class Main {
    @Autowired
    private StringValidator stringValidator;

    @Autowired
    private StringService stringService;

    @Autowired
    private ValidationService validationService;

    public void main() {
        scanKeyboardCreateLists();

        stringValidator.validate();

        final List<String> validatedList = stringValidator.getValidatedList();
        for (String currentValid : validatedList) {
            System.out.println(currentValid);
        }
    }

    private void scanKeyboardCreateLists() {
        //Let's presume the user interacts with the GUI, dynamically changing the object graph...
        //Needless to say, this is past container initialization...
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();

        //Delayed creation, dynamic
        if (choice == 0) {
            stringService.createList();
            validationService.createList();
        } else {
            stringService.createSecondList();
            validationService.createSecondList();
        }
    }

    public static void main(String[] args) {
        ApplicationContext container = new ClassPathXmlApplicationContext("/META-INF/spring/applicationContext.xml");
        container.getBean(Main.class).main();
    }
}

对象图是根据用户交互动态创建的。我解决了应用程序耦合问题,使我能够非常简单地进行测试。此外,由于列表是由容器维护的,因此该应用程序(以及其他应用程序)的动态性质是无关紧要的,因为可以在应用程序需要它们时随时请求它们,从而维护它们的元素。

其余的代码在这里:

package test;

import java.util.List;

public interface Stringable {
    List<String> getStringList();
}

package test;

import org.springframework.stereotype.Component;

import java.util.ArrayList;

@Component
public class StringList extends ArrayList<String> {
}

package test;

import org.springframework.stereotype.Component;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;

@Component
public class StringService implements Stringable {

    private List<String> stringList;

    @Inject
    public StringService(final ArrayList<String> stringList) {
        this.stringList = stringList;
    }

    //Simplified
    public void createList() {
        stringList.add("FILE1.txt");
        stringList.add("FILE1.dat");
        stringList.add("FILE1.pdf");
        stringList.add("FILE1.rdf");
    }

    public void createSecondList() {
        stringList.add("FILE2.txt");
        stringList.add("FILE2.dat");
        stringList.add("FILE3.pdf");
        stringList.add("FILE3.rdf");
    }

    @Override
    public List<String> getStringList() {
        return stringList;
    }
}

package test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class StringValidator {
    private List<String> stringList;
    private List<String> validationList;

    private final List<String> validatedList = new ArrayList<String>();

    @Autowired
    public StringValidator(final ArrayList<String> stringList,
                           final ArrayList<String> validationList) {
        this.stringList = stringList;
        this.validationList = validationList;
    }

    public void validate() {
        for (String currentString : stringList) {
            for (String currentValidation : validationList) {
                if (currentString.equalsIgnoreCase(currentValidation)) {
                    validatedList.add(currentString);
                }
            }
        }
    }

    public List<String> getValidatedList() {
        return validatedList;
    }
}

package test;

import java.util.List;

public interface Validateable {
    List<String> getValidationList();
}

package test;

import org.springframework.stereotype.Component;

import java.util.ArrayList;

@Component
public class ValidationList extends ArrayList<String> {
}

package test;

import org.springframework.stereotype.Component;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;

@Component
public class ValidationService implements Validateable {

    private List<String> validationList;

    @Inject
    public ValidationService(final ArrayList<String> validationList) {
        this.validationList = validationList;
    }

    //Simplified...
    public void createList() {
        validationList.add("FILE1.txt");
        validationList.add("FILE2.txt");
        validationList.add("FILE3.txt");
        validationList.add("FILE4.txt");
    }

    public void createSecondList() {
        validationList.add("FILE5.txt");
        validationList.add("FILE6.txt");
        validationList.add("FILE7.txt");
        validationList.add("FILE8.txt");
    }

    @Override
    public List<String> getValidationList() {
        return validationList;
    }
}

有谁知道我将如何解决方法调用 createList() 或 createSecondList() - 不使用几乎强制设计的构造函数。我正在考虑建立一个工厂,但是在一个更大的项目中为每个班级建立一个工厂似乎不是一个好主意。

就像是:

<bean ... factory-method="..." depends-on="..." lazy-init="..."/>

并在工厂方法中实例化该类并调用方法createList()。 或者从某种方法中这样调用它 - 这又看起来很糟糕,迫使该方法有责任实例化对象图。

我想在运行时解决的运行时依赖关系的图片如下:

是否有其他方法可以根据用户交互使用容器来实现动态延迟初始化?

谢谢。


如果您希望在每次调用相应的 getter 时动态初始化/填充类的某些成员,您可以尝试查找方法注入。读第 3.3.4.1 页 here http://static.springsource.org/spring/docs/1.2.x/reference/beans.html.

因此,即使包含动态成员的类是在scope=singletone(spring bean容器的默认值)每次访问分配了查找方法的字段时,您都会根据查找方法内实现的业务逻辑获得适当的对象。在您的情况下,列表是一个接口,因此您可以轻松地在查找方法中实现验证并返回经过验证的列表。

Edit:

我找到了更好的example http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lookup-method-injection在Spring文档中-我认为它非常清楚。 看一下《3.4.6.1 Lookup方法注入》

当您配置Main类为其分配一个查找方法Listmember - 每当您需要新的实例时都会调用它List bean.

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

弹簧动态注入,工厂化模式 的相关文章

随机推荐

  • gdb coredump - 调用函数或继续执行

    我寻找过与我类似的问题 但我发现的最接近的是GDB 出现 SegFault 后继续调试 https stackoverflow com q 58374854 1667513 我的目标是从 coredump 调用 GDB 中的函数 我有一个
  • 哈希表大小和键的有效位

    我有一个关于哈希表大小和模块化哈希的问题 我指的哈希算法如下 hash key table size array index 我正在阅读一本算法教科书 其中给出了以下建议 如果表大小不是素数 则可能会出现键的所有位在确定 array ind
  • 如何在 Django RESTful API 和 React 中使用 csrf_token?

    我以前有过以下经验Django 如果加行 csrf token in Django然后模板Django处理以下功能csrf token 但是当我尝试使用开发 API 时Django REST Framework然后我就卡住了 我如何添加和处
  • 给定不同大象的寿命,找出大象生存数量最多的时期

    我遇到一个面试问题 给定不同大象的生命周期 找出大象存活数量最多的时期 例如 Input 5 10 6 15 2 7 输出 6 7 3头大象 我想知道这个问题是否可以与 n 个字符串的最长子字符串问题相关 这样每个字符串代表一个时间段的连续
  • 在 WooCommerce 订单和电子邮件通知中显示自定义字段值

    基于 选择 WooCommerce 交付方式后选择日期和时间 https stackoverflow com questions 54886638 choosing a date and time after choosing the wo
  • REST 和非 RESTful URL 一起不起作用

    我所有尝试获取纯静态配置和至少一个非静态 URL 的工作示例都失败了 我有这个页面作为指南 https cwiki apache org confluence display WW REST Plugin https cwiki apach
  • 错误:ExpressionChangedAfterItHasBeenCheckedError:先前值:“ng-untouched:true”。当前值:'ng-untouched: false'

    我已重现该问题堆栈闪电战 https stackblitz com edit angular iah7up用最少的代码 第1步 点击文字 第 2 步 将焦点放在文本字段上 步骤 3 输入 Enter 并检查控制台是否有此错误 错误 Expr
  • 为什么VS2013在使用不同机器时会发布所有网站文件?

    我有一台家用计算机和一台办公室计算机 用于使用 Visual Studio 2013 发布网站 如果我在同一台计算机上进行更改并重新发布 则只会发布更改 而不是所有文件 但是 当在办公室使用我的克隆机时 即使我获取最新版本 进行一小部分更改
  • Python:“就地”更改值的函数?

    我想实现一个函数 允许其参数的值 就地 重新分配 举个例子 一个将增加参数的函数x并减少参数y 这只是一个简单的例子来说明 动机是X and Y实际上是大型数据框的单个元素 他们的表情笨拙 并且这个操作会经历多次迭代 def incdec
  • 在 C# 中对 HTTP 请求进行单元测试

    我正在编写一些代码来调用 Web 服务 读回响应并对其执行某些操作 我的代码名义上看起来像这样 string body CreateHttpBody regularExpression strategy HttpWebRequest req
  • Angular 2:如何从 JSON 响应渲染 HTML,而不向用户显示标签? [复制]

    这个问题在这里已经有答案了 Edit 对那些只浏览了标题的人进行澄清 我的问题是角2 not 1 我有一个类似这样的组件模板 div post body div 该对象类似于 title Some Title body p The em p
  • 在 Rails 3 中从 application.js 访问 current_user 变量

    我希望从 application js 访问 current user 变量 我将 application js 重命名为 application js erb 以便服务器可以理解我的 ruby 代码 所以我得到了类似的内容 functio
  • 在单行 CSS 中添加 // 作为个人注释样式是一种不好的做法吗?

    我最近开始使用 注释 单行 CSS 代码 我知道我实际上并没有注释掉该行 我只是打破它 我应该使用 但效果是一样的 然后该行终止于 并且以下代码工作正常 我可以删除它 但通常我不喜欢这样做 以防万一我想稍后将其放回去 或者如果我回来查看我一
  • 模糊滤镜在 HTML5 Kinetic.Filters.Blur 中如何工作

    如何在 HTML5 中使用模糊滤镜 我发现这个 Kinetic Filters Blur imageData config 及参数 imageData Object config Object config radius Integer 用
  • 如何解析MultipartFormDataContent

    我正在编写一个 Web API 服务 我想在其中接受一个文件 图像 和一个包含图像关键信息的序列化对象 JSON 图像部分没有问题 但是当我添加包含反序列化对象的字符串内容时 我在尝试确定哪个是哪个并采取相应行动时遇到问题 客户端代码如下所
  • 如何在 pandas 中创建叠加条形图

    在更新我之前的一些代码以使用 pandas DataFrame 时 我遇到了以下问题 这是我的原始代码将创建的参考图 import pandas as pd import matplotlib pyplot as plt a range 1
  • 获取 CGEvent Tap 中按下的修改键

    设置事件点击后 我无法识别在给定 CGEvent 的情况下按下了哪个修饰键 CGEventFlags flagsP flagsP CGEventGetFlags event NSLog flags 0x llX flagsP NSLog s
  • 如何消除 php5 Strict 标准错误?

    将 PHP 升级到 5 4 3 WAMP 服务器 2 2 后 我用 CakePHP 1 3 制作的 Web 应用程序在索引中显示以下错误 严格标准 重新定义类的已定义构造函数 第 63 行 C cake cake libs object p
  • sql查询不打印

    我正在尝试运行动态查询 但由于某些奇怪的原因它没有运行 它甚至没有打印 请任何人告诉我为什么下面的动态查询不打印 DECLARE CLIENTPK NEW AS VARCHAR 50 DECLARE CGNEEPK AS VARCHAR 5
  • 弹簧动态注入,工厂化模式

    延续自依赖注入 延迟注入实践 https stackoverflow com questions 10384473 dependency injection delayed injection praxis 10414747 我有主课 pa