2012-08-28 41 views
2

我使用註釋創建服務:同時使用註釋和一個實例豆XML配置

@Service 
@Repository 
public class UserServiceImpl implements UserService { 
    private String defaultPassword; 

    @Autowired 
    private UserRepository userRepository; 

    // ... 

    @Override 
    public void setDefaultPassword(String defaultPassword) { 
    this.defaultPassword = defaultPassword; 
    } 

    @Override 
    public String getDefaultPassword() { 
    return defaultPassword; 
    } 
} 

我想用Spring XML配置不是通過註釋配置defaultPassword價值,所以我加入XML以下定義:

<bean id="userServiceImpl" class="com.test.service.UserServiceImpl"> 
    <property name="defaultPassword" value="youmustchangethis" /> 
</bean> 

然後,我寫測試,如:

public class UserServiceImplTest extends AbstractServiceImplTest { 

    @Autowired 
    private UserService userService; 

    // ... 
} 

我在註解和XML聲明(使用bean id)中匹配了bean名稱。我的問題是userService變量UserServiceImplTest總是由同一個配置爲XML和註解的singleton bean注入?我搜索了文檔,但沒有找到像這樣的「混合」方法的解釋。

+0

刪除'@ Repository'註釋,你應該使用'stereotype'註解 –

+0

我想在這裏使用Spring unchecked exception,因爲我在我的服務層注入了Spring Data repository。如果我必須刪除'@ Repository'註釋,是否有另一種方法來使用Spring unchecked exception? – user1629558

回答

4

在這種情況下,在xml文件中定義的bean將覆蓋從註釋生成的bean。這是因爲Spring名稱註釋bean基於第一個字母的類名變成了小寫字母。除非你給它一個明確的名字。不能存在兩個相同名稱的bean,所以xml定義會覆蓋註釋之一。

您最終得到一個叫做userServiceImpl的單身人士。

+1

謝謝你的回答。如果XML定義覆蓋了註釋之一,那麼這是否意味着我丟失了所有註解特性,如'@ Repository'定義的未經檢查的異常支持,或者如果使用'@ Transactional',則會失去事務支持? – user1629558

+2

不,所有註釋仍然存在,並且它們得到正確支持。唯一的區別是你最終只有一個bean定義而不是兩個。 xml bean擁有bean的所有註釋以及'defaultPassword'。 – mrembisz

+0

感謝您的解釋。 – user1629558