2010-11-26 17 views
9

Ich habe einige Probleme mit Autowire Annotation. Meine app sieht wie folgt aus:Spring @Autowired funktioniert nicht

Hier Controller:

@Controller 
public class MyController { 
    @Autowired 
    @Qualifier("someService") 
    private SomeService someService; 

    .... 
} 

Es ist eine Service-Schicht:

public interface SomeService { 
    ... 
} 

@Service 
public class SomeServiceImpl implements SomeService{  
    @Autowired 
    @Qualifier("myDAO") 
    private MyDAO myDAO; 

    .... 
} 

Und DAO Schicht:

public interface MyDAO{ 
    ....   
} 

@Repository 
public class JDBCDAOImpl implements MyDAO {  
    @Autowired 
    @Qualifier("dataSource") 
    private DataSource dataSource;  
    .... 
} 

Dies ist ein app-Service .xml-Datei:

.... 
<bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="/WEB-INF/jdbc.properties" /> 

<bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     p:driverClassName="${jdbc.driverClassName}" 
     p:url="${jdbc.url}" 
     p:username="${jdbc.username}" 
     p:password="${jdbc.password}"/> 

<bean id="SomeService" class="com.service.SomeServiceImpl" />  
<bean id="myDAO" class="com.db.JDBCDAOImpl" />  

Also ... Wenn ich eine Web-App starte, MyController Autowires korrekt (das someService-Feld korrekt von SomeServiceImpl-Klasse-Objekt injiziert), aber myDAO feild von someService hat Null-Wert (nicht richtig injiziert).

Können Sie mir helfen, ein Problem zu finden?

P.S. Es ist interessant, aber wenn ich eine "Bean-ID" von myDAO zu einer anderen (z. B. myDAO2) ändere, gibt mir das System einen Fehler, dass das Injizieren nicht möglich war, weil Bean myDAO nicht existiert. Also, Spring machen eine Injektion, aber wo ist es? Und warum funktioniert es nicht richtig?

+0

Warum verwenden Sie nicht @Service-Annotation im Service und @Repository im DAO, wie Sie es mit @Controller im Controller tun? – Javi

+0

ja ... ich benutze es. Bearbeitet ... Ich vergesse, sie zu schreiben, weil meine App komplexer ist, als der Code oben. Aber Fehler an diesem Ort. – Ilnur

+5

Wenn Sie die Annotation @Repository und @ Service hinzufügen, müssen Sie sie nicht in der XML-Datei als Bean definieren. Sie werden mit Javi

Antwort

9

Ich finde die Lösung. Wie Javi sagte (vielen Dank für dich, Javi), muss ich DAO- und Service-Layer-Klassen mit @Repository und @Service Annotation kommentieren. Jetzt habe ich versucht, so zu schreiben:

@Service("someService") 
public class SomeServiceImpl implements SomeService{  
    @Autowired 
    @Qualifier("myDAO") 
    private MyDAO myDAO; 

    .... 
} 

und

@Repository("myDAO") 
    public class JDBCDAOImpl implements MyDAO {  
    @Autowired 
    @Qualifier("dataSource") 
    private DataSource dataSource;  
    .... 
} 

und alles funktioniert gut !!!

Aber ich habe immer noch keine Antwort für diese Frage gefunden: Wenn die Anwendung komplexer sein wird, und komplexere Struktur haben wird, wo @Repositore und @Service Annotation nicht für einige Klassen bevorzugt, wie man Bohnen richtig injiziert, welche in niedrigeren Ebenen (in einem Feld von Klassen oder in einem Feld von Klassenfeldern) (mit @Autowire-Annotation, natürlich)?

+8

@Component ist die Komponente, die für eine andere Komponente verwendet wird, die nicht Controller, Service oder Repositorys ist. – Javi

+0

OK. Danke vielmals! Sie können Ihren Kommentar als Antwort setzen, und ich werde es als Lösung meiner Frage überprüfen. – Ilnur

+0

@Ilnur Markieren Sie Ihre Antwort als die akzeptierte, weil es Sie gewesen sind, die es gefunden haben, obwohl Sie den Kommentar auffrischen können, wenn Sie es auch interessant fanden :) – Javi

4

Ich denke, Sie brauchen <context:annotation-config />.

+0

Es ist in der Datei app-servlet.xml vorhanden.Irgendetwas ist das: Ilnur

+0

Das hat mein Problem gelöst. Sie benötigen Annotation-Config, um Annotationen zu verwenden. – SashikaXP

2
You can use 
<context:component-scan base-package="PATH OF THE BASE PACKAGE"/> entry your configuration .xml file. This entry will scan/read all the stareo type af annotations from the java classes . 
Verwandte Themen