手动实例化Spring bean

时间:2016-02-25 12:01:13

标签: spring servlets tomcat7 spring-jdbc spring-4

我正在尝试在具有传统Java(控制器)servlet(而不是Spring的Dispatcher servlet)的项目中重用基于Spring-JDBC的DAO类和代码。如下所示,我尝试使用ClassPathXmlApplicationContext手动启动application-config.xml。但是,我得到了下面进一步显示的错误。

private static final String CONFIG_PATH = "classpath*:application-config.xml";

private signupDao SignupDao;


ApplicationContext context = new ClassPathXmlApplicationContext(CONFIG_PATH);

signupDao = context.getBean(SignupDao.class);
  

org.springframework.beans.factory。 NoSuchBeanDefinitionException 未定义[com.abc.dao.SignupDao]类型的合格bean           at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371)           在org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)           在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)

之前,我没有将以下条目添加到application-config.xml中,但即使添加它之后,我仍然得到与上面相同的错误(“没有定义类型的限定bean”)。

<bean id="signupDao" class="com.abc.dao.SignupDao"></bean>

有什么想法吗?

控制器servlet不是我自己的,我是从第三方获得的,我只是试图扩展他们的处理程序,这是我正在尝试使用Spring自动装配,JDBC等。

编辑:

我能加载的唯一bean是context.getBean(MessageSource.class),我的bean都不能加载。我之前尝试时getBeanDefinitionNames返回空数组。你认为这是一个类路径问题吗?

2 个答案:

答案 0 :(得分:2)

要缩小问题范围,请确保已成功创建正在创建的ApplicationContext。

这应该返回给定应用程序上下文中的所有bean名称。

 context.getBeanDefinitionNames();

<强>更新

如果ApplicationContext没有列出xml配置中的任何bean,则可能表明ClassPathXmlApplicationContext无法访问资源文件。

检查的一种方法是做这样的事情:

ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream("application-config.xml")

如果资源可访问,这应返回有效的非空流。

注意资源名称的格式。它不应包含classpath:classpath*:

之类的任何前缀

答案 1 :(得分:2)

  1. classpath*:中移除CONFIG_PATH部分,因为ClassPathXmlApplicationContext已经在文件的类路径中查找(查看它的名称);

  2. 确保您的application-config.xml文件位于Web应用程序的WEB-INF/classes目录的根目录中,否则它将不在类路径中(这假定文件不是包装在另一个罐子里)。