2017-07-26 123 views
1

XML配置:無法自動裝配Autowired子bean父對象在春季啓動分配

<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-2.5.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 


    <bean class="com.fossians.maven_courses.Say_Impl" id="id_Say_Impl" /> 
</beans> 

Say_I

public interface Say_I 
    { 
     public void Say_I_m1(); 
    } 

Say_Impl

public class Say_Impl implements Say_I 
    { 
     public void Say_I_m1() 
      { 
       System.out.println("inside : public void Say_I_m1() \n"); 
      } 
    } 

控制器:

public class Controller_Test implements SpringApplicationContextInterface 
    { 
     @Autowired 
     private Say_Impl say_Impl; 

     //Below line not assigning, need to reassign into method 
     private Say_I say_I = (Say_I) say_Impl; 
//  private Say_I say_I = (Say_I) applicationContext.getBean("id_Say_Impl"); 

     @RequestMapping(value = "/test10") 
     public String Test1() 
     { 
      say_I = say_Impl; 
      System.out.println("Say_Impl_auto : "+say_Impl); 
      System.out.println("Say_I : "+say_I); 
      say_I.Say_I_m1(); 
      return " request value = test10 "; 
     } 
    } 

public interface SpringApplicationContextInterface 
{ 
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beanConfig.xml"); 
} 


@SpringBootApplication 
@ImportResource("classpath:beanConfig.xml") 
public class Courses extends SpringBootServletInitializer 
{ 
    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 
    { 
     return application.sources(Courses.class); 
    } 

} 

上面的代碼是彈簧啓動的應用程序的一部分。

內部 「Controller_Test」 級這行代碼:

private Say_I say_I = (Say_I) say_Impl; 

未分配Say_Impl對象 「say_Impl」 參考到它的父對象say_I。但是,如果我再次將它分配到Test1()方法,那麼它正在工作。

但下面的代碼行將say_Impl引用賦值給say_I對象。

private Say_I say_I = (Say_I) applicationContext.getBean("id_Say_Impl"); 

現在的問題是,當我通過自動裝配爲什麼我需要將其重新分配到方法服用say_impl對象?有沒有辦法讓它工作而不需要重新分配?

當我通過應用程序上下文獲取bean時,我不需要重新分配,爲什麼?

+1

你應該自動佈線類型Say_I'的'字段,而不能'Say_Impl'。基本上你不應該在使用接口時注入一個具體的類型。此外,爲了給出更好的答案,您的問題中有太多缺失的部分以及不清楚的部分。 –

+0

@M。 Deinum,你需要更多的信息? –

+0

你的xml配置是缺少的部分,這是如何加載的,你的控制器實現了什麼'SpringApplicationContextInterface'等等。但是編程到接口時,你仍然應該在你的代碼中使用'Say_I'而不是'Say_Impl'。 –

回答

1

非常難看的代碼,遺留xml與春季啓動WTF?

試試這個

@Autowired 
private Say_I say_I; 

或更好:

@SpringBootApplication 
public class Courses { 

    public static void main(String[] args) { 
     SpringApplication.run(Courses.class, args); 
    } 

    @RestController 
    public class Controller_Test { 

     @Autowired 
     private Say_I say_I; 

     @RequestMapping(value = "/test10") 
     public String Test1() { 
      System.out.println("Say_I : " + say_I); 
      say_I.Say_I_m1(); 
      return " request value = test10 "; 
     } 
    } 

    @Component 
    public class Say_I {  
     void Say_I_m1() { 
      System.out.println("inside : public void Say_I_m1() \n"); 
     } 
    } 

} 
+0

XML有什麼問題? –

+1

xml不可編譯:)看看上面的例子,所有代碼都是可編譯的,並且容易出錯/類型安全。 – MariuszS

+0

實際上我對XML更感興趣:) :) –