2011-01-06 6 views
8

gibt es eine Möglichkeit, Konstruktor-Arg mit Annotation zu ersetzen?ersetzen <Konstruktor-Arg> mit Spring Annotation

Ich habe diesen Konstruktor:

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

und ich brauche, dass in meiner Fassade zu injizieren:

@Inject 
private GenericDAO<Auto, Long> autoDao; 

Das Problem ist, dass ich weiß nicht, wie der Wert des Parameters übergibt in Konstrukteur.

Vielen Dank im Voraus

[Mehr Infos] Ich versuche, mein Problem zu erklären.

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

Ich möchte diesen Code nur mit Annotation konvertieren. Jemand kann erklären, wie?

Antwort

2

Update: Ich fürchte, es ist nicht möglich zu tun, was Sie versuchen. Aus den Parametern des Injektionspunkts können keine Konstruktorargumente abgerufen werden. Eine FactoryBean wäre der erste Ort, an dem Sie suchen, aber die Metadaten für den Injektionspunkt werden nicht angegeben. (Zu beachten: dieser Fall leicht durch CDI abgedeckt ist)

Ursprüngliche Antwort: (das immer noch funktionieren, wenn Sie Ihre Typen extern konfigurieren)

einfach @Inject auf den Konstruktor verwenden. Beachten Sie jedoch, dass Spring bei der Konstruktorinjektion runzelt. Berücksichtigen Sie die Setter/Feld-Injektion.

In Ihrem Fall haben Sie jedoch wahrscheinlich mehr als eine Beans vom Typ Class. Wenn dies der Fall ist, können Sie @Resource(name="beanName") verwenden.

Aus der Dokumentation von javax.inject.Inject:

injizierbare Bauer ist mit @Inject kommentiert und null oder mehr Abhängigkeiten als Argumente akzeptieren. @Inject kann auf höchstens einen Konstruktor pro Klasse angewendet werden.

@Inject ConstructorModifiersopt SimpleTypeName(FormalParameterListopt) 
    Throwsopt ConstructorBody 
+0

Ich verwende bereits @Inject, aber ich muss auch den Wert der Klasse Typ übergeben. Es gibt einen Weg, es zu tun? oder ich muss xml Ansatz verwenden? –

+0

Was ist das für ein Wert? Woher bekommst du es? – Bozho

+0

@Injekt privat GenericDAO autoDao; Wenn das GenericDAO erstellt wurde, muss ich den Wert der Klasse übergeben –

4

Ich denke @Inject allein werden Sie nicht helfen, wird auch eine @Qualifier Anmerkung verwenden.

Hier ist der relevante Abschnitt des Frühlings Referenz:
3.9.3 Fine-tuning annotation-based autowiring with qualifiers

Wenn ich das richtig verstanden habe, werden Sie den @Qualifier Mechanismus verwenden.

Wenn Sie Spring's @Qualifier annotation verwenden, können Sie es wahrscheinlich tun inline, so etwas wie dieses:

@Repository 
public class DaoImpl implements Dao{ 

    private final Class<?> type; 

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

} 

Aber wenn Sie die JSR-330 @Qualifier annotation verwenden, ich denke, Sie müssen Ihre eigene benutzerdefinierte Anmerkung erstellen, die mit @Qualifier markiert .


würde Eine andere Möglichkeit der @Value Anmerkung sein. Damit können Sie die Ausdruckssprache, z. dies wie:

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

Eine Option, um den Typen in Ihrem Konstruktor zu haben ist:

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

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

aber muß bestimmte unterschiedliche Implementierungen für jeden T.

Vorteil ist, hat, dass Sie nicht brauchen T-Typ als Parameter übergeben.

0

Frühling Java Configuration könnte hier hilfreich sein. Wenn Sie eine Java-Klasse erstellen, die Ihre Bohnen mit den Anmerkungen einfach definiert @Configuration und @Bean es in etwa so aussehen könnten:

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

Vergewissern Sie sich, dass die DaoConfiguration Klasse gescannt wird (in der Regel über @ComponentScan) und ein richtiges DAO-Objekt wird für Sie im Spring-Kontext erstellt. Die Bohne wird den Namen der Methode haben, die in diesem Fall personDao ist, so können Sie es namentlich injizieren mit dem Namen personDao oder nach Typ, wenn der Typ GenericDAO<Person> ist.

Verwandte Themen