/ / Spring: Prawidłowo skonfiguruj @ComponentScan - sprężyna, komponenty, rmi, applicationcontext, spring-remoting

Wiosna: Prawidłowo skonfiguruj @ComponentScan - sprężyna, komponenty, rmi, applicationcontext, spring-remoting

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 Controllers z @Component ponieważ jest ich wiele Controllers 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.]