2015-04-29 53 views
1

用於方法注入的Spring lookup-method屬性,它有助於在每次調用該方法時創建新實例。容器也會動態地爲該類創建子類並重寫該方法。但是,對於我而言,只有一個爲正常注射和方法注射創建的實例。我已經發布了我所嘗試過的完整代碼。我想完全理解lookup-method的工作方式以及它與正常注入的不同之處。Spring查詢方法實例創建

<bean id="processor" class="org.RequestProcessor"> 
     <lookup-method name="getResourceA" bean="resourceA"/> 
    </bean> 

    <bean id="resourceA" class="org.ResourceA"/> 
    <bean id="resourceB" class="org.ResourceB"/> 


public abstract class RequestProcessor { 
    @Autowired 
    ResourceB resourceB; 
    public ResourceB getResourceB(){ 
     return resourceB; 
    } 

    abstract ResourceA getResourceA(); 
} 


public class ResourceA { 
    String url ="http://localhost:8080"; 
    public ResourceA(){ 
     System.out.println("Resource A instance creation"); 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 
} 


public class ResourceB { 
    String url ="http://localhost:8081"; 
    public ResourceB(){ 
     System.out.println("Resource B instance creation"); 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 
} 


public class SpringExample { 
    public static void main(String[] args) { 
     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("org/applicationContext.xml"); 
     RequestProcessor processor = (RequestProcessor)applicationContext.getBean("processor");  
     for (int i=0;i<3;i++){ 
      ResourceA resource = processor.getResourceA(); 
      System.out.println(resource.getUrl()); 
     } 
     for (int i=0;i<3;i++){ 
      ResourceB resource = processor.getResourceB(); 
      System.out.println(resource.getUrl()); 
     }  
    } 
} 

輸出上面的程序是:

Resource B instance creation 
Resource A instance creation 
http://localhost:8080 
http://localhost:8080 
http://localhost:8080 
http://localhost:8081 
http://localhost:8081 
http://localhost:8081 
+0

你能告訴我流通過Java代碼來設置查找法,我在運行時創建bean並希望連接lookup-method。 –

回答

1

我已經找到了我的問題的答案。我錯過了兩個bean中的scope屬性。我要補充範圍=「原型」兩個豆狀:

<bean id="resourceA" class="org.ResourceA" scope="prototype"/> 
<bean id="resourceB" class="org.ResourceB" scope="prototype"/> 

變化後,現在輸出的是:

Resource B instance creation 
Resource A instance creation 
http://localhost:8080 
Resource A instance creation 
http://localhost:8080 
Resource A instance creation 
http://localhost:8080 
http://localhost:8081 
http://localhost:8081 
http://localhost:8081