beanFactory.getBean没有加载bean

时间:2014-10-30 12:58:16

标签: spring

我有一个使用@Service注释注释为A类的服务类,我在A中实现BeanFactoryAware。现在我使用setBeanFactory方法设置BeanFactory。我正在尝试使用beanFactory.getBean方法加载bean“B”。现在在这种情况下,必须在application-context.xml文件中定义“B”bean吗?

2 个答案:

答案 0 :(得分:1)

有两种方式..

第一个

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="b" class="your.package.B" />

</beans>

第二个

Spring会扫描这个文件夹并找出bean(用@ Component,@ Service,@ Repository等注释)并注册它

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">

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

</beans>

我建议使用..

public class Application implements ApplicationContextAware{

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)throws BeansException    {
        this.applicationContext = applicationContext;
    }

}

和方法

B b = applicationContext.getBean("b");

答案 1 :(得分:1)

如果您在A类中注入BeanFactory,然后尝试使用b获取bean beanFactory.getBean,则必须声明bean b 在与bean a相同的应用程序上下文中,或在此应用程序上下文的父级中。

具有根应用程序上下文和DispatcherServlet的servlet应用程序上下文的标准Web应用程序的具体用例:

  • 如果A in是根应用程序上下文,则B 必须在根应用程序上下文中声明
  • 如果A in是servlet应用程序上下文,B可以在servlet应用程序上下文中或在根目录中声明

但如果唯一的原因是在bean B中使用bean A,最好直接注入它而不是BeanFactory(对应用程序上下文使用相同的规则) )

相关问题