Как автоматически подключить бин к двум различным контроллерам (Spring) - PullRequest
0 голосов
/ 30 января 2020

Я учусь весной, и у меня есть проблема, которую я не знаю, как решить.

@Service
@Transactional
public class SchoolService {

   @Autowired
   private CourseDao courseDao;
   @Autowired
   private EducationDao educationDao;
   @Autowired
   private StudentDao studentDao;
   @Autowired
   private TeacherDao teacherDao;
   @Autowired
   private StatisticsDao statisticsDao;


............
}

Этот код внедряет мой DAOS в этот класс обслуживания, но затем мне нужно внедрить указанный выше класс в два контроллера. Один способ, которым я пытался, был с этим кодом, но это не сработало.

    @Autowired
    SchoolService sm;

Как бы я внедрил его в мой класс контроллера. Я попытался сделать класс контроллера @Component, но, похоже, ничего не работает.

ClassPathXmlApplicationContext container = new ClassPathXmlApplicationContext("application.xml");

SchoolService sm = container.getBean(SchoolService.class);

Этот способ работает, но я не хочу создавать новый контекст приложения для каждого раза, когда я хочу получить этот бин.

Да, сейчас я пользуюсь xml, пожалуйста, не стреляйте в меня: D Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Поскольку этот вопрос, очевидно, является образовательным, я постараюсь дать как можно более подробный ответ:

Как только вы поймете c вещь о весне, что все автомагистраль волхвы c происходит только с bean-компонентами, которые управляются пружиной.

Итак:

  • Ваши контроллеры должны управляться пружиной
  • Ваша служба должна управляться пружиной
  • Ваши DAO должны управляться весной

В противном случае автоматическое подключение не будет работать, я не могу больше это подчеркнуть.

Теперь рассмотрим контекст приложения как один глобальный реестр всех бобов. По умолчанию бины являются синглетонами (одноэлементная область в терминах весны), что означает, что в контексте приложения существует только один объект (экземпляр) этого бина.

Актуальное подключение означает, что bean (управляется Spring) - контроллер в вашем случае имеет зависимости, которые Spring может внедрить, просматривая этот глобальный реестр, получая соответствующий bean-компонент и устанавливая поле данных, для которого вызывается аннотация @Autowired.

Итак, если у вас есть два контроллера (опять же, оба управляются весной), вы можете:

@Controller
public class ControllerA {
   @Autowired
   private SchoolService sm;
}


@Controller
public class ControllerB {
   @Autowired
   private SchoolService sm;
}

В этом случае тот же экземпляр школьной службы будет введен в два разных контроллера, поэтому вы должны хорошо go.

0 голосов
/ 30 января 2020

Попробуйте создать компонент контроллера в приложении . xml вместо аннотирования контроллера.

...