2011-04-16 56 views
2

我正在通過Spring 3註釋驅動的控制器和服務的一些工作,並有一個關於如何這可能的問題?Java Spring 3 MVC控制器明確地加載服務

  1. 我在servlet-context.xml文件被加載以下項目的路徑:

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

在控制器我有這樣的初始化類,並初始化爲標記爲:

@PostConstruct 
public void init() { 
    ApplicationContext context = new GenericApplicationContext(); 
    bizServices = (BizServices) context.getBean("bizServices"); 
} 

在我提供的服務有服務標籤的豆GED爲:

@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 

這告訴我,無論是我使用的是錯誤的應用程序上下文服務或豆無法找到。我可以在沒有Autowire的情況下在PostConstruct中明確定位和加載此Service類嗎?如果我讓我的服務類從工廠加載,我可以指定工廠類是什麼,並且這將是xml中的一個bean配置條目嗎?再次

謝謝...

+0

如何有關使用<上下文:組分掃描基包= 「com.project」/> 是否有任何錯誤? – 2011-04-17 02:44:39

回答

2

在你@PostConstruct你實例化一個新的ApplicationContext。這個新實例並不知道任何有關原始ApplicationContext的內容。 如果你要做的是訪問bizServices,在你的控制器中用@Autowire註解聲明一個BizServices類型的字段。

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