2016-05-09 8 views
1

Angenommen, ich habe die Klasse SomeClass, die im Konstruktor Wert annimmt und das Feld füllt.Spring-Autowire-Objekt mit Wert

String text; 
String sometext; 

public someClass(String text, String sometext){ 
this.text = text; 
this.sometext = sometext; 
} 

SomeClass hat eine Methode, die ein neues Objekt erstellt. In Java, wenn wir ein neues Objekt anlegen können wir mit Werten wie

ClassName variable = new ClassName(text, sometext); 

und füllen Sie die Felder in ClassName wie dieser Konstruktor instanziiert

public ClassName(String text, String sometext){ 
this.text = text; 
this.sometext = sometext; 
} 

Aber im Frühjahr autowired Verwendung, wie wir das tun können?

@Autowired 
public ClassName(SomeClass someClass){ 
this.text = someClass.text; 
this.sometext = someClass.sometext; 
} 

Dies wird nicht funktionieren. wie Frühling wissen, welche die Instanz von SomeClass


UPDATE:

Ich war falsch. Ich habe nicht auf DI-Art gedacht. anstelle von Autowiring SomeClass. Ich musste ClassName autowire.

Ohne DI habe ich ein neues Objekt in einer Methode der Klasse ClassName

Wenn DI mit i in der Methode der Klasse ClassName

@Autowired 
ClassName className; 

ich die Felder autowire hatte die Herstellung direkt bevölkern kann Felder öffentlich

className.text = text; 
className.sometext = sometext; 

und ich kann mit Javabeans tun. aber wie über Konstruktor zu tun.

HINWEIS: Mit der Federkonfiguration ist nichts falsch. Basisscan ist aktiviert.

Antwort

1

Sie sind in dem Sinne richtig sein woud, dass der Frühling nicht automatisch von allen Klassen wissen, oder die erforderlichen Bohnen erstellen. Der Frühling funktioniert nicht wie Magie. Wir können Annotationen verwenden, aber wir müssen Spring noch mitteilen, welche Bohnen zu schaffen und wie man sie verursacht. Hier kommt die @Component, @Service, @Repository, @Controller ins Spiel. Schau mal here. Wenn Sie möchten, SomeClass eine Abhängigkeit in ClassName zu sein, müssen Sie Spring explizit wissen, dass eine Bean von SomeClass erstellt werden muss, bevor es als Abhängigkeit in ClassName injiziert werden kann, und Sie tun, indem Sie SomeClass mit der richtigen Anmerkung kommentieren. Außerdem müssen Sie eine <context:component-scan base-package="com.your.package"/> für Spring tun, um alle Anmerkungen korrekt aufzulösen, bevor sie Abhängigkeiten automatisch auslösen können.

Darüber hinaus müssen Sie die Tatsache erkennen, dass, wenn Ihre SomeClass Konstruktor Argumente von dynamischen Werten abhängen, Sie die Bean nicht sofort erstellen können, und Sie es nicht als Abhängigkeit in ClassName injizieren können Verwenden Sie @Autowired, da der Frühling diese Werte während der Bereitstellungszeit kennen muss. Wenn das der Fall ist, würde ich lieber Getter Setter Methoden stattdessen in ClassName für eine Instanz von SomeClass verwenden.

Hinweis: Dies ist die Antwort berücksichtigt Anmerkungen im Frühjahr. Sie können das auch tun, indem Sie Spring Beans in XML definieren.

+0

Sie sagen also, ich kann keinen dynamischen Wert mit Autowiring über Konstruktor einfügen? – user2471976

+0

@ user2471976 Ja, das geht einfach nicht. Spring muss zum Zeitpunkt der Bereitstellung alle Konstruktorargumentwerte kennen, da die Anwendung nur bereitgestellt wird, wenn alle Beans ordnungsgemäß erstellt wurden. Schauen Sie sich [http://stackoverflow.com/questions/6739566/anyway-to-autowire-a-bean-that-requires-constructor-arguments] und [dies] (http://stackoverflow.com) an/questions/34046451/spring-autowire-with-dynamic-Konstruktor-Parameter-Using-Annotation-Ansatz) post. Ihre beste Wette für diese Art von Situation ist ** Getter Setter Methoden ** wie ich in meiner Antwort erwähnt. –

+0

Danke für die schnelle Antwort. – user2471976

1

Sie können nicht neu mit Spring verwenden, alles muss im Frühling Kontext erstellt werden. In Ihrem Beispiel würde Ihre Feder Config

seine
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <bean class="SomeClass"> 
     <constructor-arg index="0" name="text" value="some value" /> 
     <constructor-arg index="1" name="sometext" value="some other value" /> 
    </bean> 

</beans> 

Ihr Code

@Autowired 
private SomeClass someClass; 
+0

Text und sometext sind keine Werte. sie sind String-Variablen – user2471976

+0

Diese Antwort hat ein falsches Code-Snippet. Es sollte '' –

+0

Vereinbaren Sie mit den 2 obigen Kommentaren, ein bisschen schnell mit meiner Antwort. –