我有一个使用@Service注释注释为A类的服务类,我在A中实现BeanFactoryAware。现在我使用setBeanFactory方法设置BeanFactory。我正在尝试使用beanFactory.getBean方法加载bean“B”。现在在这种情况下,必须在application-context.xml文件中定义“B”bean吗?
答案 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
(对应用程序上下文使用相同的规则) )