我已为我的Spring Application Context
设置了以下内容。
@Configuration
public class RmiContext {
@Bean
public RmiProxyFactoryBean service() {
RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
rmiProxy.setServiceUrl("rmi://127.0.1.1:1099/Service");
rmiProxy.setServiceInterface(Service.class);
return rmiProxy;
}
}
@Configuration
public class LocalContext {
@Bean
public Controller Controller() {
return new ControllerImpl();
}
}
@Configuration
@Import({RmiContext.class, LocalContext.class})
public class MainContext {
}
上述设置工作正常,但我想@ComponentScan
使用Controller
注释@Component
,因为我的应用程序中有许多Controller
,声明时很繁琐使用@Bean
一个接一个地。
@Configuration
@ComponentScan(basePackageClasses = {Controller.class})
public class LocalContext {
/* ... */
}
问题在于,当我执行@ComponentScan(basePackageClasses = {Controller.class})
时,无法识别或无法创建以前正常工作的RmiProxyFactoryBean
。
那么,如何配置我的MainContext
以便通过RMI和本地bean创建两个bean?
答案 0 :(得分:2)
@Configuration也是组件扫描的候选对象,因此您可以通过以下方式扫描RmiContext中的所有bean以及控制器包中的所有控制器:
@Configuration
@ComponentScan(basePackages = {"org.example.controllers", "package.of.RmiContext"})
public class MainContext {
}
- 编辑 -
@Configuration是组件扫描的候选者,这是在我的电脑中运行的测试用例:
package scan.controllers;
@Controller
public class ExampleController {
}
package scan;
public interface RMIService {
}
package scan;
@Configuration
public class RmiContext {
@Bean
public RmiProxyFactoryBean service() {
RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
rmiProxy.setServiceUrl("rmi://127.0.1.1:1099/Service");
rmiProxy.setServiceInterface(RMIService.class);
rmiProxy.setLookupStubOnStartup(false);
return rmiProxy;
}
}
package scan;
@Configuration
//MainContext will auto scan RmiContext in package scan and all controllers in package scan.controllers
@ComponentScan(basePackages = {"scan", "scan.controllers"})
public class MainContext {
}
package scan;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={MainContext.class})
public class TestContext {
@Autowired private RMIService rmi;
@Autowired private ExampleController controller;
@Test
public void test() {
//both controller and rmi service are autowired as expected
assertNotNull(controller);
assertNotNull(rmi);
}
}
答案 1 :(得分:1)
可能您可以尝试使用类的基础包(RMI,Controller):
@ComponentScan(basePackages = {"your controller package", "your rmi package"})
如果RMI类包与控制器不同,则它们将无法通过spring实例化。
答案 2 :(得分:0)
如果我理解正确,你使用" @ComponentScan(basePackageClasses"但它没有检测并注册你的春豆?
几分钟前我遇到了同样的问题。我并没有放弃并尝试了所有有趣的猜测。有人猜测了。
我不得不在XML中添加XML组件扫描条目。我只是在那里放了一个虚拟包,如下所示:
component-scan base-package="dummy.filler.to.enable.component.scan"
似乎XML中的组件扫描启用了@ComponentScan。
[后期编辑:我注意到,我的春季xml架构是2.5级。无论如何,我不知道这是否重要。最诚挚的问候。]