2017-01-04 17 views
0

Injecting a prototype bean into a singleton beanコードのコードを開発していますが、これまでのコードを以下のように作成しましたが、mainメソッドを実行すると、ルックアップの方法 - シングルトンBeanの問題にプロトタイプBeanを注入する

Jan 04, 2017 2:59:41 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing org[email protected]6ed322: startup date [Wed Jan 04 14:59:41 IST 2017]; root of context hierarchy 
Jan 04, 2017 2:59:41 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [spring.xml] 
Constructor:: RequestProcessor instance created! 
Constructor:: RequestProcessor instance created! 
Request ID : 1212 
Exception in thread "main" java.lang.AbstractMethodError: com.injection.testing.RequestProcessor.createValidator()Lcom/injection/testing/RequestValidator; 
    at com.injection.testing.RequestProcessor.handleRequest(RequestProcessor.java:12) 
    at com.injection.testing.MainDemo.main(MainDemo.java:13) 

spring.xml

<!-- Lookup way --> 
    <bean id="requestProcessor" class="com.injection.testing.RequestProcessor" > 
     <lookup-method name="getValidator" bean="validator" /> 
    </bean> 

    <bean id="validator" class="com.injection.testing.RequestValidator" scope="prototype" /> 

RequestProcessor.java

public abstract class RequestProcessor { 
    private RequestValidator validator; 

    public RequestProcessor(){ 
     System.out.println("Constructor:: RequestProcessor instance created!"); 
    } 

    public void handleRequest(String requestId){ 
     System.out.println("Request ID : "+ requestId); 
     RequestValidator validator = createValidator(); //here Spring will create new instance of prototype bean 
     validator.validate(requestId); 
    } 

    public RequestValidator getValidator() { 
     return validator; 
    } 

    public void setValidator(RequestValidator validator) { 
     this.validator= validator; 
    } 

    protected abstract RequestValidator createValidator(); 
} 

RequestValidator.java

public class RequestValidator { 
    private List<String> errorMessages = new ArrayList<String>(); 

    public RequestValidator() { 
     System.out.println("Constructor:: RequestValidator instance created!"); 
    } 

    // Validates the request and populates error messages 
    public void validate(String requestId){ 
     System.out.println("RequestValidator :"+requestId); 
    } 

    public List<String> getErrorMessages() { 
     return errorMessages; 
    } 
} 

MainDemo.java

public class MainDemo { 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 

     //RequestValidator requestValidator = (RequestValidator) context.getBean("validator"); 

     RequestProcessor processor = (RequestProcessor) context.getBean("requestProcessor"); 
     processor.handleRequest("1212"); 
     System.out.println("------------------------"); 
     processor.handleRequest("1213"); 
    } 
} 

のpom.xml

<properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>4.3.5.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.3.5.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>cglib</groupId> 
      <artifactId>cglib-nodep</artifactId> 
      <version>3.2.4</version> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
+0

設定がOKに見えますが、おそらくそれは、既にクラスパスに存在する –

+0

そのをクラスパスに追加行方不明CGLIBライブラリ試みがあります。上記のpom.xmlも追加されました。今すぐご案内ください –

答えて

1

更新しますspring.xml基本的にはの名前を指定する必要が

<bean id="requestProcessor" class="com.injection.testing.RequestProcessor"> 
    <lookup-method name="createValidator" bean="validator" /> 
</bean> 

の下に表示しますabstractメソッド名はlookup-method xml属性です。リフレッシュorg.springframework.context.support:

私は修正した構成

2017年1月4日4時11分20秒PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh INFO後出力の下になりました。 ClassPathXmlApplicationContext @ 13c675d:起動日[Wed Jan 04 16:11:20 IST 2017];コンテキスト階層のルート 2017年1月4日4時11分20秒PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO:クラスパスリソース[spring.xml]
コンストラクタ::のRequestProcessorからの読み込みXMLのBean定義インスタンスが作成されました!
リクエストID:1212
コンストラクタ:: RequestValidatorインスタンスが作成されました!
RequestValidator:1212
リクエストID:1213
コンストラクタ:: RequestValidatorインスタンスが作成されました!
RequestValidator:1213

関連する問題