Java 如何在SpringMVC中检索bean?

Java 如何在SpringMVC中检索bean?,java,spring,spring-mvc,Java,Spring,Spring Mvc,在一个简单的spring应用程序中,通过使用@Component注释在spring IoC容器中注册bean,然后要检索bean,首先读取spring配置文件,然后使用以下命令从容器中检索bean: ClassPathXMLApplicationContext context = new ClassPathXMLApplicationContext("spring config file") Coach theCoach=context.getBean("beanId","classname

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

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


Coach theCoach=context.getBean("beanId","classname") 
现在,您可以在Coach上调用方法

在不使用的情况下,如何从容器中检索bean

context.getBean();
DispatcherServlet
是否正在处理此问题

编辑后-

/*********************弹簧应用*******************************/ applicationContext.xml

<beans _______>

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

</beans>
<beans _______>

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

</beans>
TennisCoach.java

public interface Coach{

public String getDailyWorkOut();

}
@Component                                                                                                   

public class TennisCoach implements Coach{

public String getDailyWorkOut(){

return "practise back hand volley"; 

}
public interface Coach{

public String getDailyWorkOut();

}
@Component                                                                                                   

public class TennisCoach implements Coach{

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

return "practise back hand volley"; 

}
/*********************Spring-MVC Application*********************/
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();

}

}
/*********************弹簧应用*******************************/

现在是春季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>
TennisCoach.java

public interface Coach{

public String getDailyWorkOut();

}
@Component                                                                                                   

public class TennisCoach implements Coach{

public String getDailyWorkOut(){

return "practise back hand volley"; 

}
public interface Coach{

public String getDailyWorkOut();

}
@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?

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

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

Coach theCoach=context.getBean(“tennisCoach”,Coach.class)
在本例中,您知道所需的确切类名(例如您是bean的作者),并且只需从上下文中获取它


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


它唯一的选择是完全扫描上下文bean中定义的所有内容,并检测它可以识别的任何内容(
Controller
RestController
RequestMapping
)。这种检测器的例子是它的实现。SpringMvc有各种检测器的实现,如果需要,您可以实现自己的检测器。

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