2010-09-27 24 views
6

Tôi muốn sử dụng @Repository chú thích mùa xuân để tránh thêm đậu trong context.xml. tôi sử dụng tích hợp ibatis, vì vậy lớp kho của tôi trông như thế nàyinjecting tài sản có nguồn gốc cho @Repository đậu mà không @Autowired trong siêu lớp

@Repository("userDao") 
public class UserDaoMybatis extends SqlMapClientDaoSupport implements UserDao { 
    // ... 
} 

SqlMapClientDaoSupport (mùa xuân thư viện lớp) có phương pháp cuối cùng cho thiết lập thuộc tính cần thiết mà không chú thích với @Autowired hoặc @Resourse

public final void setSqlMapClient(SqlMapClient sqlMapClient) { 
    if (!this.externalTemplate) { 
     this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient); 
    } 
} 

SqlMapClient bean được định nghĩa trong spring.xml.xml. Nếu userDao đậu được định nghĩa trong XML nó hoạt động tốt, nhưng khi tôi đặt chú thích @Repository và gỡ bỏ tuyên bố đậu tôi nhận được ngoại lệ sau đây

java.lang.IllegalArgumentException: Property 'sqlMapClient' is required 

Một cách giải quyết có thể để thêm phương pháp mới như

@Aitowired 
injectSqlMapClient(SqlMapClient sqlMapClient) { 
    setSqlMapClient(sqlMapClient); 
} 

nhưng có vẻ xấu xí

Có cách nào khác mà yo tiêm thuộc tính mà không được xác định không?

+1

Tôi nghĩ rằng cách giải quyết của bạn là một cách khá tốt. – Bozho

Trả lời

3

Làm thế nào để giới thiệu một siêu lớp trung gian?

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport { 

    @Autowired 
    injectSqlMapClient(SqlMapClient sqlMapClient) { 
     setSqlMapClient(sqlMapClient); 
    } 
} 

và sau đó

@Repository("userDao") 
public class UserDaoMybatis extends AutoringSqlMapClientDaoSupport implements UserDao { 
    // ... 
} 

Có, đó là lạm dụng quyền thừa kế, nhưng không hề thua kém so với SqlMapClientDaoSupport hiện có, và nếu bạn đang tuyệt vọng để tránh sự móc tiêm trong lớp DAO bản thân, tôi có thể 't nghĩ một cách tốt hơn.

+0

Tôi cũng nghĩ về việc có một lớp như vậy (tôi có nhiều hơn một DAO, vì vậy nó chắc chắn tốt hơn có injectSqlMapClient trong mỗi DAO), nhưng nó trông xấu xí cho tôi vì tôi cần giới thiệu lớp mới mà tôi thực sự không cần - Tôi loại bỏ một thứ (định nghĩa bean) nhưng thay vào đó lấy một thứ khác (lớp mới). Nhưng dù sao, cảm ơn những suy nghĩ của bạn –

Các vấn đề liên quan