Java Spring 3 MVC控制器显式加载服务

时间:2011-04-16 22:01:04

标签: java spring spring-mvc spring-3

我正在研究一些Spring 3注释驱动的控制器和服务,并对如何实现这一点提出疑问?

  1. 我的servlet-context.xml文件中包含以下项目的路径:

    <context:component-scan base-package="com.project.controller, com.project.service"/>

  2. 在控制器下我在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配置项吗?

    再次感谢...

2 个答案:

答案 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");