Mam następujące ustawienia dla mojego 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 {
}
Powyższa konfiguracja działa dobrze, ale chcę ją włączyć @ComponentScan
adnotacja Controller
s z @Component
ponieważ jest ich wiele Controller
s w mojej aplikacji, która jest żmudna, gdy deklarowana jest jedna po drugiej @Bean
.
@Configuration
@ComponentScan(basePackageClasses = {Controller.class})
public class LocalContext {
/* ... */
}
Problem polega na tym, że kiedy to robię @ComponentScan(basePackageClasses = {Controller.class})
, wcześniej dobrze działa RmiProxyFactoryBean
nie są rozpoznawane lub nie można ich utworzyć.
Więc, jak mogę skonfigurować mój MainContext
aby utworzyć obie fasole za pośrednictwem RMI i lokalnych komponentów bean?
Odpowiedzi:
2 dla odpowiedzi № 1@Configuration jest również kandydatem do skanowania komponentów, więc możesz skanować wszystkie komponenty w RmiContext i wszystkie kontrolery w swoim pakiecie kontrolera przez:
@Configuration
@ComponentScan(basePackages = {"org.example.controllers", "package.of.RmiContext"})
public class MainContext {
}
--edytować--
@Konfiguracja jest kandydatem do skanowania składników, tutaj jest przypadek testowy, który działa na moim komputerze:
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 dla odpowiedzi nr 2
Być może możesz spróbować użyć podstawowych pakietów swoich klas (RMI, kontroler):
@ComponentScan(basePackages = {"your controller package", "your rmi package"})
Jeśli pakiet klas RMI jest inny niż kontroler, nie uda się utworzyć instancji wiosną.
0 dla odpowiedzi № 3
Jeśli rozumiem cię poprawnie, używasz "@ComponentScan (basePackageClasses", ale nie wykrywa i nie rejestruje twoich wiosennych nasion fasoli?
Kilka minut temu miałem ten sam problem. Nie poddałem się i wypróbowałem wszystkie śmieszne domysły. Pewnie to zrobiło.
Musiałem dodać wpis XML-skopiuj składnik w XML. Właśnie umieściłem tam fałszywą paczkę, jak poniżej:
component-scan base-package="dummy.filler.to.enable.component.scan"
Wygląda na to, że skanowanie komponentów w formacie XML włącza funkcję @ComponentScan.
[Late Edit: Zauważyłem, mój wiosenny schemat XML to wiosna 2.5. W każdym razie nie wiem, czy to ma znaczenie. Z poważaniem.]