2012-10-12 6 views
6

Potrzebuję pomocy w zrozumieniu pojęcia stojącego za @Autowired i @Service. Mam DAO zdefiniowany z @Service i kontroler z @Autowired i wszystko wydaje się w porządku, jednak używam tego samego @Autowired w innej klasie, to nie działa.@Autowired i @Service działa z kontrolera, ale nie z innego pakietu.

Przykład:

usługi

@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"; 
    } 
} 

Powyższy wszystko działa poprawnie. Jednakże, jeśli chcę użyć MyService w POJO, to po prostu nie działa. Przykład:

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

    @Autowired 
    MyService myService; 

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

Wiosna 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

jest 'MyPojo' wystąpienia do wiosny? –

+0

Nic nie zrobiłem dla 'MyController' w pliku config.xml, więc nie zrobiłem tego również dla' MyPojo'. Co powinienem robić? – birdy

+0

Czy możesz opublikować konfigurację Spring? –

Odpowiedz

12

Dzieje się tak, ponieważ twoja klasa POJO nie jest zarządzana przez kontener sprężynowy.

@Autowire adnotacja będzie działać tylko te obiekty, które są zarządzane przez sprężynę (tj. Utworzone przez pojemnik sprężyny).

W twoim przypadku obiekt usługi i kontrolera jest zarządzany wiosną, ale twoja klasa POJO nie jest zarządzana wiosną, dlatego @Autowire nie wywołuje oczekiwanego zachowania.

Innym problemem, który zauważyłem, jest użycie adnotacji @Service w warstwie DAO, gdy wiosna ma przypisaną do tego celu adnotację @Repository.

Nie jest również pożądane, aby sprężyna zarządzała klasami POJO, ponieważ zwykle będą to elementy do przechowywania danych, które należy utworzyć poza kontenerem.

Czy możesz nam powiedzieć, jaki jest cel klasy POJO i dlaczego jest używana instancja service?

+0

To ma sens.Mogę użyć '@ Repository' zamiast' @ Service. "W moim pojo chcę, aby niektóre zapytania do bazy danych .To jest właśnie dlatego chcę użyć' myService' w moim POJO. Daj mi znać, jeśli istnieje sposób to zrobić? Wszystko, co chcę zrobić z mojego POJO, jest uruchamianie niektórych zapytań do DB – birdy

+0

Jak jest tworzona instancja obiektu POJO? –

+0

kontroler po prostu tworzy instancję pojo w taki sposób: 'MyPojo p = new MyPojo(); p.testFromPojo(); ' – birdy

-1

sprawdzić skan komponentu kontekstowe w pliku konfiguracyjnym

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

Sprawdziłem to. Skanuje wszystkie pakiety. – birdy

2

uwzględnienie tego w applicationContext.xml złożyć

<context:annotation-config /> 
5

Kiedy używając classpa Po skanowaniu musisz przekazać Springowi, które klasy zarządzać. Odbywa się to za pomocą adnotacji @Service i jej relacji (@Controller, @Repository itd.).

Jeśli zdecydujesz nie do opisywania swoją fasolkę, należy jawnie zadeklarować go w konfiguracji, podobnie jak to było z dataSource i jdbcTemplate.

Adnotowanie na zajęciach oznacza, że ​​tylko zajęcia w pakiecie są zarządzane przez Spring; która umożliwia skanowanie pakietu bez konieczności zarządzania klasami wszystkich w tym pakiecie.

+0

Więc powinienem dodać adnotację do mojego POJO za pomocą '@ Service' lub' @ Repository' lub '@ Controller'? – birdy

+0

Wolałbym dodać adnotację zamiast definiować ją w xml – birdy

+0

"Adnotacja na twoich zajęciach zapobiega każdej klasie w pakiecie zarządzanym przez Spring, coś, co nie jest często pożądane." naprawdę? więc w paczce tylko jedna klasa może być opisana? – birdy

Powiązane problemy