【问题标题】:How are the beans retrieved in Spring-MVC?在 Spring-MVC 中如何检索 bean?
【发布时间】:2019-05-10 07:20:06
【问题描述】:

在一个简单的 spring 应用程序中,您使用 @Component 注释在 spring IoC 容器中注册您的 bean,然后检索 bean,您首先读取 spring 配置文件,然后使用以下方法从容器中检索 bean:

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


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

现在,您可以调用theCoach 上的方法了。

我们如何从容器中检索 bean,因为我们不使用

context.getBean();

DispatcherServlet 处理这个吗?

编辑后-

/*********************Spring应用程序**************************** ********/ 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应用程序**************************** ********/

现在是 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 应用程序中,我使用 context.getBean() 从容器中检索 bean,如何在 Spring-MVC 应用程序中检索 Coach bean?

【问题讨论】:

  • 我不确定我是否清楚地理解了您的问题。你能改写一下吗?您想知道框架如何在需要时检索 bean,例如在 MVC 应用程序中?你能举个例子来说明你的观点吗?
  • 也许您缺少的概念是注入:使用 \@Autowired 或 \@Inject,您是在告诉框架将从上下文中检索到的与声明类型匹配的现有对象放在那里。
  • @lealcelderio 是的,是的,这就是我想知道的。 Spring-MVC 框架如何在需要时检索 bean。只是想知道在 Spring-MVC 中实现 context.getBean() 的位置,因为我们没有明确地编写它?
  • @spi 提到了您回答的关键方面。更详细的信息可能是 MVC 框架的内部实现。您可以阅读 spi 提到的内容,如果您有更具体的问题,请返回此处并 edit 发帖。
  • @lealceldeiro 感谢您的建议,我对 \@Autowired 如何工作或它如何注入依赖项有所了解。我已经编辑了我的问题并包含了一个示例。我希望我的查询现在很清楚。

标签: java spring spring-mvc


【解决方案1】:

是的,您可以使用 @Autowired 注释创建字段,然后为您注入它。确保你要使用这个 bean 的类也是 spring bean。

【讨论】:

    【解决方案2】:

    在您的示例中,您通过 bean 查找ApplicationContext 检索 bean。

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

    在这种情况下,您知道所需的确切类名(例如您是 bean 的作者),您只需从上下文中获取它。


    对于DispatcherServlet,这并不容易,因为它对您添加到上下文中的bean 一无所知。

    它的唯一选择是全面扫描上下文 bean 中定义的所有内容并检测它可以识别的任何内容(ControllerRestControllerRequestMapping)。这种 检测器 的示例是 AbstractDetectingUrlHandlerMapping 及其实现。 SpringMvc 有各种此类检测器的实现,如果需要,您可以自己实现。

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      相关资源
      最近更新 更多