Gibt es eine Möglichkeit, @Autowire eine Bohne, die erfordert, dass Konstruktor-Argumente?
Ich bin mit Spring 3.0.5 und bin mit @Autowire-Anmerkung für meine Schüler so viel wie möglich. Eine der Bohnen, die ich brauche, um autowire erfordert Argumente an den Konstruktor. Ich habe mir durch die Feder-docs, aber kann nicht scheinen zu finden, jede Bezugnahme auf, wie kommentieren Konstruktor Argumente.
In XML, die ich verwenden kann als Teil der bean-definition. Gibt es einen ähnlichen Mechanismus für @Autowire annotation?
Ex:
@Component
public class MyConstructorClass{
String var;
public MyConstructorClass( String constrArg ){
this.var = var;
}
...
}
@Service
public class MyBeanService{
@Autowired
MyConstructorClass myConstructorClass;
....
}
In diesem Beispiel, wie kann ich den Wert angeben, der "constrArg" in MyBeanService mit der @Autowire annotation? Gibt es eine Möglichkeit, dies zu tun?
Dank,
Eric
- Vielleicht war ich nicht klar, oder vielleicht bin ich Missverständnis, aber ich bin nicht auf der Suche nach autowire constrArg; ich bin auf der Suche nach autowire MyConstructorClass, aber der Konstruktor benötigt eine String. Wenn ich mit XML-Konfiguration, mein bean defn wäre:
- Wenn ich mit XML-Konfiguration, mein bean defn wäre so etwas wie: <bean id="myBeanService" class="MyBeanService"> <property name="myConstructorClass"> <bean class="MyConstructorClass"> <constructor-arg value="MyStringHere" /> </Bohne> </property> </Bohne> Gibt es eine Möglichkeit das zu übersetzen in die Anmerkungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie die
@Value
annotation.Finden Sie unter: Expression Language > Annotation-Konfiguration
Um deutlicher zu sein: in Ihrem Szenario, würden Sie den Draht zwei-Klassen
MybeanService
undMyConstructorClass
so etwas wie dieses:Update: wenn Sie mehrere unterschiedliche Instanzen von
MyConstructorClass
mit verschiedenen Werten, sollte man verwenden Qualifier Anmerkungen@Autowired
für string-Argumente.@Autowired
,@Inject
et alMyConstructorClass
ist autowired auf variablemyConstructorClass
imMyBeanService
. In deinem Beispiel gibt es keinemyConstructorClass
variable gibt. Ich bin verwirrt. Ist esfoo
argument verwendet werden, statt es?private MyConstructorClass myConstructorClass;
, richtig? 🙂@Value("#{ systemProperties['user.region'] }"} String defaultLocale
es muss@Value("#{ systemProperties['user.region'] }") String defaultLocale
. In meinem Spring-Boot-4-Projekt, ich brauchte, um@Value("${user.region}") String defaultLocale
statt. Weiß nicht, der Unterschied aber.Gut, von Zeit zu Zeit Laufe ich in der gleichen Frage. Soweit ich weiß, kann man nicht tun, wenn man will, hinzufügen von dynamischen Parametern an den Konstruktor. Aber das factory-pattern kann helfen.
Nun
MyBean
ist nicht eine spring bean per se, aber es ist nah genug. Dependency Injection funktioniert, obwohl ich Spritzen die Fabrik und nicht die Bohne selber, man muss es Spritzen, ein neues Werk auf seine eigene, neueMyBean
Umsetzung, wenn man will, um es zu ersetzen.Weiter
MyBean
hat Zugang zu anderen Bohnen -, weil Sie möglicherweise Zugang zu der Fabrik autowired Zeug.Und man könnte anscheinend möchten Sie einige Logik auf die
getMyBean
- Funktion, die extra Mühe, die ich zulassen, aber leider habe ich keine bessere Lösung. Da das problem der Regel ist, dass die dynamischen Parameter aus einer externen Quelle stammen, wie ein Datenbank-oder Benutzer-Interaktion, also ich instanziiert werden müssen, dass die Bohne nur in der Mitte laufen, nur wenn diese Informationen leicht verfügbar ist, so dass dieFactory
sollte ganz angemessen.Nein, nicht so, wie du meinst. Die bean repräsentiert
MyConstructorClass
muss konfigurierbar sein, ohne den AUFTRAGGEBER Bohnen, soMyBeanService
will nicht sagen, in wieMyConstructorClass
konfiguriert ist.Dies ist nicht ein autowiring problem, das problem hier ist, wie der Frühling instanziieren
MyConstructorClass
angesichts der Tatsache, dassMyConstructorClass
ist ein@Component
(und Sie sind mit component-scan, und daher nicht die Angabe einerMyConstructorClass
explizit in deiner config).Als @Sean sagte, eine Antwort ist hier zu verwenden
@Value
auf Konstruktor-parameter, so dass der Frühling ruft den Konstruktor mit dem Wert von ein-system-Eigenschaft oder Eigenschaften der Datei. Die alternative ist fürMyBeanService
direkt instanziierenMyConstructorClass
, aber wenn Sie das tun, dannMyConstructorClass
ist nicht mehr ein Spring-bean.Können Sie auch so konfigurieren, dass Ihre Komponente wie folgt :
Mit der
Bean
annotation, teilen Sie das Frühjahr, um registrieren Sie die zurückgegebene bean in derBeanFactory
.So können Sie autowire, wie Sie es wünschen.
Müssen Sie mit @Autowired und @Wert. Finden Sie diese post für mehr Informationen zu diesem Thema.
Wäre eine alternative statt der übergabe der Parameter an den Konstruktor, die Sie haben könnten, die Sie als getter und setter und dann in einer @PostConstruct initialisieren Sie die Werte, wie Sie wollen. In diesem Fall wird der Frühling erstellen der bean mit dem default-Konstruktor. Ein Beispiel ist unten
Meisten Antworten sind ziemlich alt, so könnte es nicht möglich gewesen damals, aber es gibt tatsächlich eine Lösung, erfüllt alle mögliche use-cases.
So Recht wissen, die Antworten sind:
@Value
Sie müssen den Wert in einer Konfigurationsdatei irgendwo)Die Lösung für diese Probleme ist, um das Objekt zu erstellen, die manuell mithilfe der
ApplicationContext
:Dies ist eine Coole Lösung, weil:
@Autowired
offensichtlich, aber auch@Async
zum Beispiel),Die einzige Sache im Auge zu behalten ist, dass Sie einen Konstruktor ohne Argumente (und das auch leer sein kann) in der Klasse, die Sie möchten, zu instanziieren (oder einen
@Autowired
Konstruktor, wenn Sie es brauchen).MyConstructorClass myConstructorClass;
? Sie nie benutzen? Haben Sie zu verwendenmyConstructorClass
stattmyObject
?Andere alternative, wenn Sie bereits eine Instanz des Objekts erstellt, und Sie möchten fügen Sie es als eine @autowired Abhängigkeit initialisiert alle internen @autowired Variablen, könnten die folgenden sein: