我已经为我的Spring Application Context设置了以下内容.
@H_404_6@ @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; } }
@H_404_6@ @Configuration public class LocalContext { @Bean public Controller Controller() { return new ControllerImpl(); } }
@H_404_6@ @Configuration @Import({RmiContext.class,LocalContext.class}) public class MainContext {}
上面的设置工作正常,但我想启用@ComponentScan用@Component注释控制器,因为我的应用程序中有许多控制器,当使用@Bean逐个声明时很乏味.
@H_404_6@ @Configuration @ComponentScan(basePackageClasses = {Controller.class}) public class LocalContext { /* ... */ }
问题是,当我执行@ComponentScan(basePackageClasses = {Controller.class})时,无法识别或无法创建以前正常工作的RmiProxyfactorybean.
那么,如何配置我的MainContext以便通过RMI和本地bean创建两个bean?
最佳答案
@Configuration也是组件扫描的候选者,因此您可以通过以下方式扫描RmiContext中的所有bean以及控制器包中的所有控制器:
@H_404_6@@Configuration @ComponentScan(basePackages = {"org.example.controllers","package.of.RmiContext"}) public class MainContext { }
– 编辑 –
@Configuration是组件扫描的候选者,这是在我的电脑上工作的测试用例:
@H_404_6@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); } }