2011-10-04 172 views
3

我們可以在控制器中注入一個沒有默認構造函數的Service bean嗎?注入控制器中沒有默認構造函數的bean

我有以下控制器

@Controller 
public class ArticleController { 
    @Autowired 
    private WithConstructorService withConstructorService; 
    ... 
} 

我的服務是:

@Service 
public class WithConstructorServiceImpl implements WithConstructorService { 
    String name; 
    String address; 

    public WithConstructorServiceImpl(String name, String address) { 
     super(); 
     this.name = name; 
     this.address = address; 
    } 
} 

我得到異常

SEVERE: Servlet /springheat threw load() exception 
java.lang.NoSuchMethodException: WithConstructorServiceImpl.<init>() 

更新:

我在這裏猜測,但我們可以做一些AOP魔術,並仍然使用帶註釋的構造函數arg服務方法嗎?

+0

從技術上講,這不是一個java「豆」,如果它沒有默認構造函數。 – digitaljoel

+0

我從spring bean的角度提及它。 – tintin

回答

0

不,你不能。因爲當注入bean時,它使用默認的構造函數創建bean本身,並且只在注入了所有的屬性後才創建bean。

你可以做的只是爲名稱和地址創建setter,然後將其添加到注入的bean中。

2

如果您使用彈簧3,則可以使用@Value註釋來連接名稱和地址字段,然後不需要通過構造函數設置它們。或者,不要使用@Service註釋,而是用適當的<constructor-arg>標籤在xml中聲明您的bean。

無論採用哪種方式,spring容器都需要知道從何處獲取名稱和地址的值,或者無法構造您的WithConstructorServiceImpl。

+0

我在這裏猜測,但我們可以做一些AOP魔術,仍然使用帶註釋的構造函數參數服務方法?...用相同的查詢更新了問題。 – tintin

2

你可以這樣做,但由於Spring必須實例化bean,所以你必須告訴他哪些值要傳遞給構造函數。

第一種可能性:自動裝配兩個參數:

@Autowired 
public WithConstructorServiceImpl(@Qualifier("theNameBean") String name, 
            @Qualifier("theAdressBean") String address) { 

在這種情況下,你必須聲明String類型的兩個bean在context.xml文件,用適當的名稱。

第二種可能性:在context.xml文件中聲明bean本身並告訴Spring它必須傳遞給構造函數的參數。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-collaborators

+0

請分享如何在完整性中聲明「context.xml中的兩個字符串類型的bean」? – zengr

相關問題