2016-06-01 3 views
0

Я пытаюсь создать трехуровневое приложение с пружиной, view, logic, data, более или менее. view зависит от logic, что зависит от data.Многоуровневое разрешение на использование приложения весны

Как настроить приложение Spring в проекте view, чтобы можно было разрешить граф зависимостей?

Например:

view В слое:

@Controller 
public class SomeView { 
    private final SomeService someService; 

    @Autowired 
    public SomeView(SomeService someService) { 
    this.someService = someService; 
    } 
} 

@Configuration 
@EnableAutoConfiguration 
@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

} 

В logic слое:

@Component 
public class SomeService { 

    private final SomeData someData; 

    @Autowired 
    public SomeService(SomeData someData){ 
    this.someData = someData; 
    } 

} 

В data слое:

@Component 
public class SomeData { 

} 

Эта конфигурация не может загрузиться, поскольку SomeService не может решить SomeData потому SomeData не сканируется в view слоях Application.java

ответ

1

@SpringBootApplication при использовании Spring загрузки использует значения по умолчанию. Если вы посмотрите на @SpringBootApplication определение вы увидите, что:

Многие разработчики Spring Загрузочные всегда имеют свой основной класс с аннотацией @Configuration, @EnableAutoConfiguration и @ComponentScan. Поскольку эти аннотации часто используются вместе (особенно если вы следуете лучшим практикам выше), Spring Boot предоставляет удобную альтернативу @SpringBootApplication.

@SpringBootApplication аннотацию эквивалентно использованию @Configuration, @EnableAutoConfiguration и @ComponentScan с их атрибутами по умолчанию: [...]

Это означает, что:

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

} 

Кроме того, это означает, что при использовании значений по умолчанию для @ComponentScan ваши пакеты будут храниться следующим образом:

  • com.example.model -> ваших лица
  • com.example.repositoriy -> Ваших хранилища
  • com.example.controller -> Контроллеры
  • ком.Пример -> MainApplication класс

Если не следуя этой структуры, вы должны сообщить в @ComponentScan пакет, где найти компоненты:

Пример 1:

@Configuration 
@EnableAutoConfiguration 
@ComponentScan({"com.my.package.controller","com.my.package.domain"}) 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

} 

Exemple 2:

@Configuration 
@EnableAutoConfiguration 
@ComponentScan(basePackageClasses = {SomeService.class, SomeData.class}) 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

} 

Кроме того, я советую вам проверить это guide на то, как структурировать ваш код в приложении Spring Boot.

+0

Это интересно, и я думаю, что он решает мою проблему, но у меня все еще есть проблемы. Если я перемещаю 'Приложение' в' com.example.something' (где все остальные зависимости находятся в 'com.example.something'), он работает; однако, если я оставлю его в 'com.example.something.else' с' ComponentScan ({"com.example.something"}) ', он не работает. Разве это не должно быть одно и то же? – Tom

+0

Что вы уходите в пакет com.example.something.else, Application.cass или другие классы. Это должно быть хорошо, потому что оно остается тем же. Также см. Мое редактирование для дополнительного решения. –

+0

Если это решит вашу проблему, тогда примите ее. Мне нужно знать и для другого помочь :) –

Смежные вопросы