Java 关于春季国际奥委会的一个简单问题
让我们想象一下,有1000个类(X1…X1000)都是在库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
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。顺便说一句,我的英语也很抱歉)