2017-06-22 194 views
0

我定義的類加載器,並加入我的所有庫,然後我定義了一個ApplicationContext中,我試圖從外部罐子一類ApplicationContext來的getBean,這裏是我的主要代碼:可以註釋配置工作在Java應用程序項目?

 ApplicationContext context = new FileSystemXmlApplicationContext(beanPath) { 
      @Override 
      protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) { 
       super.initBeanDefinitionReader(reader); 
       reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE); 
       reader.setBeanClassLoader(classLoader); 
      } 
     }; 

我試過的getBean這樣:

AswanService instance = (AswanService)context.getBean("aswanService", AswanService.class); 

但問題是,如果我定義哪些屬性具有設定器/ getter方法目標類,實例對象可以用兩個屬性注入時,類定義是這樣的:

public class AswanServiceImpl implements AswanService { 
     SpringInjectFaker springInjectFaker; 

     ItemDO itemDO; 

     public AswanResponse request(AswanRequest aswanRequest) { 
      springInjectFaker.fake(); 

      AswanResponse response = new AswanResponse(); 
      response.setName("response: " + aswanRequest.getName() + "; " + itemDO.getItemId()); 
      return response; 
     } 

     public SpringInjectFaker getSpringInjectFaker() { 
      return springInjectFaker; 
     } 

     public void setSpringInjectFaker(SpringInjectFaker springInjectFaker) { 
      this.springInjectFaker = springInjectFaker; 
     } 

     public ItemDO getItemDO() { 
      return itemDO; 
     } 

     public void setItemDO(ItemDO itemDO) { 
      this.itemDO = itemDO; 
     } 
    } 

但如果它與自動裝配Autowired註釋中定義的,它不工作:

public class AswanServiceImpl implements AswanService { 
     @Autowired 
     SpringInjectFaker springInjectFaker; 

     @Autowired 
     ItemDO itemDO; 

     public AswanResponse request(AswanRequest aswanRequest) { 
      springInjectFaker.fake(); 

      AswanResponse response = new AswanResponse(); 
      response.setName("response: " + aswanRequest.getName() + "; " + itemDO.getItemId()); 
      return response; 
     } 
    } 

實例= context.getBean( 「aswanService」,AswanService.class),實例被注入,但其兩個屬性itemDO和springInjectFaker都是null。

我試圖添加配置,但沒有奏效。

<?xml version="1.0" encoding="UTF-8"?> 
<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-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:annotation-config/> 

    <bean id="aswanService" class="com.taobao.qa.perf.tr.AswanServiceImpl" autowire="byName"></bean> 
    <bean id="springInjectFaker" class="com.taobao.qa.perf.tr.SpringInjectFakerImp" autowire="byName"></bean> 
    <bean id="itemDO" class="com.taobao.qa.perf.tr.ItemDO" autowire="byName"> 
     <constructor-arg index="0" value="1"></constructor-arg> 
     <constructor-arg index="1" value="2"></constructor-arg> 
    </bean> 
</beans> 

我的項目是Java項目,我運行的主要功能的程序(公共靜態無效的主要(字串[] args)),感謝您的幫助~~~

回答

0

請添加<context:component-scan base-package="com.taobao.qa" />到您的config

0

mvc:註釋驅動用於啓用Spring MVC組件的默認配置。

如果你不包括MVC:註解驅動的,如果你還使用了背景下你的MVC應用程序會工作:在你的XML文件組件掃描創建豆或定義的豆

上下文:spring配置文件中的組件掃描元素將消除在XML文件中聲明所有bean的需要。看看下面的聲明在Spring配置文件:

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

Spring應用程序配置文件中的上述聲明將掃描指定的包中的類和創建豆實例。請注意,只有當該類使用正確的註釋註釋時,纔可以創建bean。以下是此元素掃描註釋:

  • @Component
  • @Repository
  • @Service
  • @Controller
+0

我的項目是一個java應用程序項目而不是web應用程序。我試圖添加組件掃描配置。但它也行不通... – liefdiy

0

我看着辦吧。

Add or are both ok。

我來一個問題,當我添加任何上述配置後,IDE拋出一個異常:

org.springframework.beans.factory.BeanDefinitionStoreException: Parser configuration exception parsing XML from URL [file:xxxxxxx/beans.xml]; nested exception is javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [[email protected]] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support. 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93) 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) 
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451) 
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140) 
    at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84) 
    at com.alibaba.middleware.Application$2.<init>(Application.java:159) 
    at com.alibaba.middleware.Application.main(Application.java:159) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [[email protected]] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Upgrade to Apache Xerces (or Java 1.5) for full XSD support. 
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:102) 
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:70) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388) 
    ... 20 more 
Caused by: java.lang.IllegalArgumentException: No attributes are implemented 
    at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.setAttribute(DocumentBuilderFactoryImpl.java:93) 
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:99) 
    ... 22 more 

所以我放棄了,我剛剛又試了一次,直到我發現,在VM添加有兩個參數選項可以解決這個異常,我的問題也解決了。我不知道爲什麼,我還在學習。

-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl 
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl 

非常感謝。