Весна: Правильная настройка @ComponentScan

У меня есть следующие настройки для моего 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 s в моем приложении, которое утомительно, когда объявляется один за другим, используя @Bean,


@Configuration
@ComponentScan(basePackageClasses = {Controller.class})
public class LocalContext {
    /* ... */
}
Проблема в том, что когда я делаю @ComponentScan(basePackageClasses = {Controller.class}) ранее хорошо работала RmiProxyFactoryBean не распознаются или не могут быть созданы.

Итак, как мне настроить мой MainContext так что оба бина через RMI и локальные бины созданы?

3 ответа

@Configuration также является кандидатом для сканирования компонентов, поэтому вы можете сканировать все bean-компоненты в RmiContext и все контроллеры в вашем пакете контроллеров:

@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);
    }
}

Может быть, вы могли бы попробовать использовать базовые пакеты ваших классов (RMI, Controller):


@ComponentScan(basePackages = {"your controller package", "your rmi package"})

Если пакет классов RMI отличается от контроллера, он не сможет создать экземпляр к весне.

Если я вас правильно понимаю, вы используете "@ComponentScan(basePackageClasses"), но он не обнаруживает и не регистрирует ваши бобы весны?

У меня была такая же проблема несколько минут назад. Я не сдался и перепробовал все смешные догадки. Одна догадка сделала это.

Мне пришлось добавить запись сканирования компонента XML в XML. Я просто положил туда пустышку, как показано ниже:

 component-scan base-package="dummy.filler.to.enable.component.scan"

Кажется, что компонентное сканирование в XML включает @ComponentScan.

[Позднее редактирование: я заметил, моя весенняя XML-схема - это весна 2.5. Во всяком случае, я не знаю, если это имеет значение. С уважением.]

Другие вопросы по тегам