Я хочу, чтобы мои классы были организованы в пакеты. Используя следующий пример:
https://spring.io/guides/gs/accessing-data-mongodb/
У меня есть Application.java в "my.main.package". Я определяю собственную реализацию AbstractMongoConfiguration ниже:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
@Configuration
public class MyMongoConfig extends AbstractMongoConfiguration{
@Override
@Bean
public Mongo mongo() throws Exception {
return new MongoClient("remotehost:27018");
}
@Override
protected String getDatabaseName() {
return "mydb";
}
}
Если я поместил класс в тот же пакет, что и приложение Application.java, оно будет работать. Если я поместил MyMongoConfig в свой собственный пакет, то есть "my.config.package.settings", тогда запуск Application.java будет использовать настройки соединения MongoDB по умолчанию, не используя "MyMongoConfig". Почему мое приложение не автоматически находит "MyMongoConfig", когда оно находится в другом пакете? Есть ли правильный способ или возможность сделать это, не перебирая их в одном пакете?
Рекомендуется, чтобы основной класс приложения Spring Boot находился в корневом пакете выше других классов, чтобы базовый "поисковый пакет" был корневым. Все пакеты из корня будут отсканированы для классов конфигурации.
Если вы решите разместить некоторые другие классы конфигурации в других пакетах, я считаю, что их нужно указать. Например, если у вас есть ваш основной класс приложения в пакете "demo" и ваш конфигурационный класс Mongo в пакете "another.demo", аннотация @ComponentScan
для вашего основного класса приложения должна выглядеть так:
@Configuration
@ComponentScan(basePackages={"another.demo", "demo"})
@EnableAutoConfiguration
public class Application {