2011-01-06 22 views
8

có cách nào để thay thế hàm tạo-arg bằng chú thích?thay thế <constructor-arg> bằng chú thích mùa xuân

Tôi có constructor này:

public GenericDAOImpl(Class<T> type) { 
    this.type = type; 
} 

và tôi cần phải tiêm rằng trong Facade tôi:

@Inject 
private GenericDAO<Auto, Long> autoDao; 

Vấn đề là tôi không biết làm thế nào để vượt qua giá trị của tham số trong costructor.

Cảm ơn bạn trước

[More Info] Tôi cố gắng giải thích vấn đề của tôi.

<bean id="personDao" class="genericdao.impl.GenericDaoHibernateImpl"> 
     <constructor-arg> 
      <value>genericdaotest.domain.Person</value> 
     </constructor-arg> 
</bean> 

Tôi muốn chuyển đổi mã đó chỉ bằng chú thích. Ai đó có thể giải thích như thế nào?

Trả lời

2

Cập nhật: Tôi e rằng bạn không thể làm những gì bạn đang cố gắng. Bạn không thể nhận được đối số hàm tạo từ các tham số của điểm chèn. A FactoryBean sẽ là nơi đầu tiên để xem, nhưng nó không được cung cấp siêu dữ liệu điểm tiêm. (Để được lưu ý: trường hợp này có thể dễ dàng bao phủ bởi CDI)

Original câu trả lời: (có thể vẫn làm việc nếu bạn cấu hình các loại của bạn bên ngoài)

Đơn giản chỉ cần sử dụng @Inject trên các nhà xây dựng. Nhưng lưu ý rằng mùa xuân cau mày khi tiêm xây dựng. Cân nhắc việc đặt/tiêm trường.

Trong trường hợp của bạn, tuy nhiên, bạn có thể có nhiều hơn một loại hạt Class. Trong trường hợp này, bạn có thể sử dụng @Resource(name="beanName").

Từ các tài liệu của javax.inject.Inject:

constructors tiêm được chú thích với @Inject và chấp nhận không hay nhiều phụ thuộc như các đối số. @Inject có thể áp dụng cho tối đa một hàm tạo cho mỗi lớp.

@Inject ConstructorModifiersopt SimpleTypeName(FormalParameterListopt) 
    Throwsopt ConstructorBody 
+0

Tôi đã sử dụng @Inject, nhưng tôi cần phải vượt qua giá trị của loại loại quá. Có một cách để làm điều đó? hoặc tôi phải sử dụng phương pháp tiếp cận xml? –

+0

giá trị đó là gì? Bạn lấy nó từ đâu? – Bozho

+0

@Inject riêng GenericDAO autoDao; khi GenericDAO được istantiated tôi cần phải vượt qua giá trị của loại loại –

4

Tôi nghĩ @Inject một mình sẽ không giúp đỡ, bạn sẽ phải sử dụng một chú thích @Qualifier cũng có.

Đây là phần liên quan của Reference mùa xuân:
3.9.3 Fine-tuning annotation-based autowiring with qualifiers

Nếu tôi hiểu được điều này một cách chính xác, bạn sẽ phải sử dụng cơ chế @Qualifier.

Nếu bạn sử dụng Spring's @Qualifier annotation, có lẽ bạn có thể làm điều đó inline, một cái gì đó như thế này:

@Repository 
public class DaoImpl implements Dao{ 

    private final Class<?> type; 

    public DaoImpl(@Qualifier("type") final Class<?> type){ 
     this.type = type; 
    } 

} 

Nhưng nếu bạn sử dụng JSR-330 @Qualifier annotation, tôi đoán bạn sẽ phải tạo chú thích tùy chỉnh của riêng bạn mà được đánh dấu bằng @Qualifier .


Một khả năng khác sẽ là chú thích @Value. Với nó, bạn có thể sử dụng Ngôn ngữ biểu thức, ví dụ: như thế này:

public DaoImpl(
    @Value("#{ systemProperties['dao.type'] }") 
    final Class<?> type){ 
    this.type = type; 
} 
2

Một lựa chọn để có các loại trong constructor của bạn là:

public abstract class GenericDAO<T> { 
    private Class<T> persistentClass; 

    public GenericDAO() { 
     this.persistentClass = (Class<T>) ((ParameterizedType) getClass() 
      .getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 
... 
} 

nhưng PHẢI có triển khai cụ thể khác nhau cho mỗi T.

Advantage là bạn không cần để chuyển kiểu T làm tham số.

0

Spring's Java Configuration có thể trợ giúp tại đây. Nếu bạn tạo một lớp Java mà chỉ đơn giản định nghĩa đậu của bạn bằng cách sử dụng các chú thích @Configuration@Bean nó có thể trông giống như thế này:

@Configuration 
public class DaoConfiguration { 
    @Bean 
    public GenericDAO<Person> personDao() { 
     return new GenericDaoHibernateImpl(Person.class); 
    } 
} 

Hãy chắc chắn rằng lớp DaoConfiguration được quét (thường là qua @ComponentScan) và một DAO-đối tượng thích hợp sẽ được tạo cho bạn trong bối cảnh mùa xuân. Đậu sẽ có tên của phương pháp trong trường hợp này là personDao để bạn có thể tiêm nó theo tên sử dụng tên personDao hoặc theo loại nếu loại là GenericDAO<Person>.

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