Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于春季国际奥委会的一个简单问题_Java_Spring_Ioc Container - Fatal编程技术网

Java 关于春季国际奥委会的一个简单问题

Java 关于春季国际奥委会的一个简单问题,java,spring,ioc-container,Java,Spring,Ioc Container,让我们想象一下,有1000个类(X1…X1000)都是在库abc.jar中定义的 X*类使用了一些JSR-330注释,如: class X12 { @Inject Foo foo; @Inject Bar bar; } 我的主类是一个测试用例@RunWith(SpringJUnit4ClassRunner.class),引用的Foo,Bar在bean XML文件中定义良好 问题是,我不想在任何XML文件中定义X1…X1000。但我想自动连接它们,例如: X

让我们想象一下,有1000个类(X1…X1000)都是在库
abc.jar
中定义的

X*类使用了一些JSR-330注释,如:

class X12 {

    @Inject
    Foo foo;

    @Inject
    Bar bar;

}
我的主类是一个测试用例
@RunWith(SpringJUnit4ClassRunner.class)
,引用的
Foo
Bar
在bean XML文件中定义良好

问题是,我不想在任何XML文件中定义X1…X1000。但我想自动连接它们,例如:

X173 x173 = new X173();
但问题是,使用Java新实例时,foo/bar没有连接

这也不起作用:

X173 x173 = applicationContext.getBean(X173.class);
因为没有定义X173的bean

而且,X173还可能包含X258类的成员,该类成员也应连接。直到我解决了这个问题,我才知道如何实现它。

您可以使用它将它们声明为SpringBean

最明显的方法是使用Spring注释(如
@Component
)对这些类进行注释,然后将
添加到XML中

如果注释不是选项,
支持可配置过滤器。例如,如果这些类实际命名为
X1…X1000
,则可以使用regexp过滤器:

<context:component-scan base-package="com.example">
     <context:include-filter type="regex" expression="com\.example\.X\d{1,4}"/>
</context:component-scan>

好的。有不同类型的测试。我们也来看看它们

  • 在模块化测试中,您应该测试单个类并模拟它的依赖关系。因此,应避免使用任何喷油器

  • 在集成中,您应该测试一些类的交互,这样您就可以像在通常的应用程序中一样使用注入器


不幸的是,类名是任意的。隐马尔可夫模型。。我认为
组件扫描
会产生不必要的副作用。当我编写
applicationContext.getBean(X173.class)
时,我确切地知道将注入什么,但是
组件扫描
看起来很粗糙@继雷'Lenik:您的问题与Spring的概念背道而驰,因为Spring从预定义的bean定义创建bean,而不是以特别的方式。您可以使用
applicationContext.getAutowireCapableBeanFactory().createBean(X173.class)
创建一个没有定义的bean,但它不能满足最后一个要求(bean的相互依赖性)。很棒的提示!假设F=autowiredcapablebeanfactory,那么我可以用库实现中的
F.createBean(X.class)
替换所有
newx
。这正是我想要的。我认为这是清楚的,无论如何,这并不违背春天的概念。谢谢。对于模块化测试,为什么不直接注入模拟实例呢?(通过指定测试目的上下文xml)@谢继雷'Lenik,最好的注入是构造函数注入。所以,在模块化测试中,您应该向构造函数提供一些实例。它可以而且应该是mock的@谢继雷'Lenik,我没有得到“模拟实例”。你能澄清一下吗?我的意思是假实例,例如,文件系统的模拟实例可能只是打印日志,但不要做任何有害的事情。对不起,我的英语,嗯@谢继雷'莱尼克,我的模仿依赖,我是说完全是假的实例。所以我不需要在你们的模块化测试中做任何SpringIOC。顺便说一句,我的英语也很抱歉)