Ich habe ein seltsames Problem bekam (oder vielleicht nur einige Missverständnis über Spring 4.1.7):@Autowired überschreibt @Bean
Es gibt eine Komponente, nennen wir es MyComponent, dass so aussieht ...
@Component
public class MyComponent extends BaseComponent {
...
}
BaseComponent ist so etwas wie dieses ...
public class BaseComponent {
@Autowired
private HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}
Während die Klasse mit @Component aus historischen Gründen mit Anmerkungen versehen ist, bauteil Scannen nicht für dieses Paket aktiviert wird, so dass die Komponente nicht automatisch gefunden werden. So habe ich eine Definition in meinem @Configuration ...
@Configuration
public class MyConfiguration {
@Bean
public HibernateTemplate hibernateTemplate() { ... create one ... }
@Bean
public HibernateTemplate hibernateTemplateSecondary() { ... create another one ... }
@Bean
public MyComponent myComponent() {
MyComponent component = new MyComponent();
component.setHibernateTemplate(hibernateTemplateSecondary());
return component;
}
}
Leider jetzt, was passiert ist, dass myComponent zuerst richtig mit den sekundären HibernateTemplate
initialisiert werden, aber danach spritzt Frühling die „normalen“ hibernateTemplate
hinein (was falsch ist).
Ich habe versucht explizit autowire = Autowire.NO
auf die @Bean Definition hinzuzufügen, auch wenn das schon der Standard ... Auch gibt es keine zwei myComponent Bohnen, es ist immer die gleiche ...
Hat jemand eine Idee, warum das passiert und wenn ja, wie kann man das verhindern? Ich dachte immer, wenn @Bean beteiligt ist, überschreibt @Autowired das nicht?
Bitte beachten Sie: Da MyComponent
auch in anderen Projekten verwendet wird, kann ich es absolut nicht anfassen. Ich kann das @Autowired
nicht entfernen und ich kann kein @Qualifier
oder ähnliches hinzufügen, weil das viele andere Projekte brechen würde. Normalerweise funktioniert es gut, da es die "primäre" (und normalerweise nur) Datenbankverbindung verwendet. Nur in diesem Modul sollte eine andere Datenbank die primäre Datenbank sein und daher muss MyComponents
angewiesen werden, die sekundäre Datenbank zu verwenden.
Warum nicht einfach den '@ Autowired' entfernen? – Henry
Das ist nicht möglich, da 'MyComponent' in vielen anderen Modulen verwendet wird, in denen es von Komponenten gescannt wird. Nur in diesem Modul sollte es nicht sein (da dieses Modul eine andere "primäre" Datenbank verwendet). –
Um Ihr Problem zu verstehen, erste Mal HibernateTemplate-Variable in BaseComponent verdrahtet mit HibernateTemplate-Objekt von HibernateTemplateSecondary() -Methode und später die gleiche HibernateTemplate-Variable überschreiben die ursprüngliche HibernateTemplate mit der HibernateTemplate() -Methode. Ist das dein Punkt richtig? –