我正在研究一些Spring 3注释驱动的控制器和服务,并对如何实现这一点提出疑问?
我的servlet-context.xml
文件中包含以下项目的路径:
<context:component-scan base-package="com.project.controller, com.project.service"/>
在控制器下我在init类中有这个,init被标记为:
@PostConstruct
public void init() {
ApplicationContext context = new GenericApplicationContext();
bizServices = (BizServices) context.getBean("bizServices");
}
在我的服务中,我有一个标记为:
的服务bean@Service("bizServices")
public class BizServicesImpl implements BizServices { ... }
我得到例外:
SEVERE: Allocate exception for servlet Spring MVC Dispatcher Servlet
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'bizServices' is defined
这告诉我要么使用错误的应用程序上下文服务,要么找不到bean。我可以在没有Autowire的PostConstruct中显式定位和加载此Service类吗?如果我从工厂加载了我的服务类,我可以指定工厂类是什么,并且它是xml中的bean配置项吗?
再次感谢...
答案 0 :(得分:2)
在@PostConstruct中,您将实例化一个新的ApplicationContext。这个新实例对原始ApplicationContext一无所知。 如果你要做的是访问bizServices,在你的控制器中声明一个带有@Autowire注释的BizServices类型的字段。
答案 1 :(得分:1)
您没有完全在init方法上实例化上下文。您必须通过指定应用程序上下文xml的类路径位置来手动加载bean定义。
来自GenricApplicationContext javadoc:
用法示例:
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml")); // load your beans
PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx);
propReader.loadBeanDefinitions(new ClassPathResource("otherBeans.properties"));
ctx.refresh();
MyBean myBean = (MyBean) ctx.getBean("myBean");