2012-10-12 7 views
6

Ich brauche Hilfe, das Konzept hinter @Autowired und @Service zu verstehen. Ich habe ein DAO mit @Service und Controller mit @Autowired definiert und alles scheint in Ordnung, aber ich benutze das gleiche @Autowired in einer anderen Klasse, dann funktioniert es nicht.@Autowired und @Service arbeiten von Controller, aber nicht aus einem anderen Paket

Beispiel:

Dienst

@Service 
public class MyService { 
    private JdbcTemplate jdbcTemplate; 

    @Autowired 
    public void setDataSource (DataSource myDataSource) { 
     this.jdbcTemplate = new JdbcTemplate(myDataSource); 
    } 

    public void testUpdate(){ 
      jdbcTemplate.update("some query"); 
    } 
} 

-Controller

package com.springtest.mywork.controller; 

@Controller 
@RequestMapping(value = "/test.html") 
public class MyController 
{ 
    @Autowired 
    MyService myService; 

    @RequestMapping(method = RequestMethod.GET) 
    public String test(Model model) 
    { 
    systemsService.testUpdate(); 
    return "view/test"; 
    } 
} 

Die vor allem gut funktioniert. Wenn ich jedoch MyService in einem POJO verwenden möchte, dann funktioniert es einfach nicht. Beispiel:

package com.springtest.mywork.pojos; 
public class MyPojo { 

    @Autowired 
    MyService myService; 

    public void testFromPojo() { 
     myService.someDataAccessMethod(); //myService is still null 
    } 
} 

Frühling Config:

<beans> 
    <mvc:annotation-driven /> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
    <context:component-scan base-package="com.springtest.mywork" /> 
    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb" /> 
     <property name="username" value="hello" /> 
     <property name="password" value="what" /> 
    </bean> 

    <bean name="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> 
     <constructor-arg ref="dataSource"/> 
    </bean> 
</beans> 
+0

Ist 'MyPojo' von Spring instanziiert? –

+0

Ich habe nichts für 'MyController' in config.xml getan, also habe ich es auch nicht für' MyPojo' gemacht. Was soll ich tun? – birdy

+0

Können Sie Ihre Spring-Konfiguration posten? –

Antwort

12

Dies liegt daran, dass Ihre POJO-Klasse nicht von Spring Container verwaltet wird.

@Autowire Annotation funktioniert nur die Objekte, die von Feder verwaltet werden (dh durch den Federbehälter erstellt).

In Ihrem Fall werden das Service- und das Controller-Objekt vom Frühling verwaltet, aber Ihre POJO-Klasse wird nicht im Frühling verwaltet, deshalb produziert das @Autowire nicht das von Ihnen erwartete Verhalten.

Ein weiteres Problem, das ich festgestellt habe, ist, verwenden Sie die @Service Annotation in der DAO-Schicht, wenn Frühling die Annotation speziell für diesen Zweck erstellt hat.

Es ist auch nicht wünschenswert, Spring die POJO-Klassen verwalten zu lassen, da es sich normalerweise um Datenspeicherelemente handelt, die außerhalb des Containers erstellt werden müssen.

Können Sie uns sagen, was der Zweck der POJO-Klasse ist und warum die service-Instanz darin verwendet wird?

+0

Das macht Sinn.Ich kann '@ Repository' anstelle von' @ Service' verwenden.In meinem pojo möchte ich einige Abfragen an die Datenbank machen.Das ist einfach, warum ich 'myService' in meinem verwenden möchte POJO Bitte lass es mich wissen, wenn es ein sein sollte tter Weg, dies zu tun? Alles was ich von meinem POJO machen möchte, ist einige Abfragen an den DB – birdy

+0

Wie wird die POJO Objektinstanz erstellt? –

+0

der Installateur instanziiert das Pojo einfach so: 'MyPojo p = new MyPojo(); p.testFromPojo(); ' – birdy

-1

überprüfen Sie Ihren Kontext Komponente Scan in der Konfigurationsdatei

<context:component-scan base-package="<your_package>" /> 
+1

Ich habe dies überprüft. Es scannt alle Pakete. – birdy

2

dieses In applicationContext.xml

Datei
<context:annotation-config /> 
5

Wenn mit Classpa Beim Scannen müssen Sie Spring mitteilen, welche Klassen zu verwalten sind. Dies geschieht unter Verwendung der @Service Annotation und ihrer Beziehungen (@Controller, @Repository, usw.).

Wenn Sie nicht Bean zu annotieren, müssen Sie dies explizit in der Config erklären, so wie du mit dataSource und jdbcTemplate tat.

Wenn Sie Ihre Klassen annotieren, bedeutet dies, dass nur die Klassen im Paket von Spring verwaltet werden. Damit können Sie ein Paket scannen, ohne alle Klassen in diesem Paket zu verwalten.

+0

Also sollte ich mein POJO mit '@ Service' oder' @ Repository' oder '@ Controller' kommentieren? – birdy

+0

Ich würde lieber Annotation hinzufügen, anstatt sie im XML-Code zu definieren. – birdy

+0

"Die Annotation Ihrer Klassen verhindert, dass jede Klasse in einem Paket von Spring verwaltet wird; etwas, was nicht oft wünschenswert ist." Ja wirklich? also in einem Paket kann nur eine Klasse kommentiert werden? – birdy

Verwandte Themen