Как бобы извлекаются в Spring-MVC? - PullRequest
2 голосов
/ 10 мая 2019

В простом приложении Spring вы регистрируете боб в контейнере IoC пружины с помощью аннотации @Component, а затем для получения бина вы сначала читаете файл конфигурации пружины, а затем извлекаете бин из контейнера с помощью:

ClassPathXMLApplicationContext context = new ClassPathXMLApplicationContext("spring config file")


Coach theCoach=context.getBean("beanId","classname") 

Теперь вы можете вызывать методы для theCoach.

Как мы получаем бин из контейнера, поскольку мы не используем

context.getBean();

Является ли DispatcherServletсправиться с этим?

После редактирования -

/ ********************* Spring Application ******************************* / applicationContext.xml

<beans _______>

<context:component-scan base-package="packageName"/>

</beans>

Coach.java

public interface Coach{

public String getDailyWorkOut();

}

TennisCoach.java

@Component                                                                                                   

public class TennisCoach implements Coach{

public String getDailyWorkOut(){

return "practise back hand volley"; 

}

ApplicationDemo.java

public class ApplicationDemo{

public static void main(String[] args){

ClassPathXMLApplicationContext context = new ClassPathXMLApplicationContext("applicationContext.xml");

Coach theCoach=context.getBean("tennisCoach",Coach.class)

theCoach.getDailyWorkOut();

}

}

/ ********************* Spring Application ******************************* /

Теперь для Spring MVC -

/*****************Spring-MVC Application**************************/

web.xml

<web-app>
<servlet>
      <servlet-name>HelloWeb</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigurationLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
</servlet>

    <servlet-mapping>
    <servlet-name>HelloWeb</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>


</web-app>

applicationContext.xml

<beans _______>

<context:component-scan base-package="packageName"/>

</beans>

Coach.java

public interface Coach{

public String getDailyWorkOut();

}

TennisCoach.java

@Component                                                                                                   

public class TennisCoach implements Coach{

@RequestMapping("/")
public String getDailyWorkOut(){

return "practise back hand volley"; 

}
/*********************Spring-MVC Application*********************/

Что я хочузнаю, что -

, что в вышеДля данного Spring-приложения я получаю bean-компонент из контейнера с помощью context.getBean (), как получается bean-компонент Coach в Spring-MVC-приложении?

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

В вашем примере вы получаете бин через поиск бина из ApplicationContext.

Coach theCoach=context.getBean("tennisCoach",Coach.class)

В этом случае вы знаете точное имя класса, которое вам нужно (например, вы являетесь автором вашего компонента), и вы просто получаете его из контекста.


Для DispatcherServlet это не так просто, потому что он ничего не знает о бинах, которые вы добавили в контекст.

Единственная опция, которую он имеет, - это полное сканирование всех определенных в контексте компонентов и обнаружение всего, что он может распознать (Controller, RestController, RequestMapping).Пример такого детектора : AbstractDetectingUrlHandlerMapping с его реализациями.SpringMvc имеет различные реализации таких детекторов, вы можете реализовать свои собственные, если вам нужно.

0 голосов
/ 10 мая 2019

Да, вы можете просто создать поле с аннотацией @Autowired и весной добавить его для вас.Убедитесь, что ваш класс, где вы собираетесь использовать этот боб, также является бобовым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...