@Autowired и @Service работают с контроллера, но не из другого пакета

Мне нужна помощь в понимании концепции@Autowired а также@Service, У меня есть DAO, определенный с@Service и контроллер с@Autowired и все вроде нормально, однако пользуюсь тем же@Autowired в другом классе, то это не работает.

Пример:

обслуживание

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

контроллер

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

Выше все работает отлично. Однако, если я хочу использоватьMyService в POJO тогда это просто не работает. Пример:

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

    @Autowired
    MyService myService;

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

Spring 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>
 birdy12 окт. 2012 г., 17:23
Я ничего не сделал дляMyController в config.xml, поэтому я не сделал это дляMyPojo или. Что мне делать?
 birdy12 окт. 2012 г., 17:30
обновленный с весенним конфигом, добавленным внизу
 David Grant12 окт. 2012 г., 17:21
ЯвляетсяMyPojo созданный весной?
 David Grant12 окт. 2012 г., 17:25
Можете ли вы опубликовать свой весенний конфиг?

Ответы на вопрос(5)

Включить это в файл applicationContext.xml

<context:annotation-config />

чтобы использовать bean-компоненты bean в вашем классе POJO.

http://www.javacodegeeks.com/2015/03/using-spring-managed-bean-in-non-managed-object.html

 Maciej Lach08 окт. 2015 г., 10:26
Пожалуйста, избегайте ссылки только ответы.

ng, какими классами управлять. Это делается с помощью@Service аннотация и ее отношения (@Controller, @Repository, и т.д).

Если вы выбираетене чтобы комментировать ваш bean-компонент, вы должны явно объявить его в своем конфиге, как вы это делали сdataSource а такжеjdbcTemplate.

Аннотирование ваших классов означает, что Spring управляет только этими классами в пакете; который позволяет сканировать пакет без необходимости управлятьвсе классы в этом пакете.

 birdy12 окт. 2012 г., 17:34
Так что я должен аннотировать мой POJO@Service или же@Repository или же@Controller?
 birdy12 окт. 2012 г., 17:36
Я бы предпочел добавить аннотацию, а не определять ее в XML
 David Grant12 окт. 2012 г., 17:38
@birdy Я имею в виду, аннотируя, вы выбираете, какими классами управлять.
 birdy12 окт. 2012 г., 17:37
«Аннотирование ваших классов предотвращает управление каждым классом в пакете Spring; это не часто желательно». действительно? так в пакете может быть аннотирован только один класс?
 David Grant12 окт. 2012 г., 17:38
@Service является наиболее неспецифическим, так что я бы использовал это.

рации

<context:component-scan base-package="<your_package>" />
 birdy12 окт. 2012 г., 17:24
Я проверил это. Он сканирует все пакеты.
Решение Вопроса

@Autowire аннотация будет работать только с теми объектами, которые управляются пружиной (то есть создаются контейнером пружины).

В вашем случае сервис и объект контроллера управляются Spring, но ваш класс POJO не управляется Spring, поэтому@Autowire не производит ожидаемое вами поведение.

Еще одна проблема, которую я заметил, это то, что вы используете@Service аннотация в слое DAO, когда весна имеет@Repository Аннотация специально создана для этой цели.

Также нежелательно разрешать Spring управлять классами POJO, поскольку обычно это будут элементы хранения данных, которые должны создаваться вне контейнера.

Можете ли вы сказать нам, какова цель класса POJO и почемуservice экземпляр используется в нем?

 birdy12 окт. 2012 г., 18:03
Как вы думаете, лучше предоставить ссылку на сервис, когда контроллер вызывает POJO? любитьMyPojo p = new MyPojo(myService); p.testFromPojo() а сейчасMyPojo будет иметь конструктор, который принимает экземплярmyService
 Arun P Johny12 окт. 2012 г., 18:03
В этом случае@Autowired не будет работать, вам нужно создать метод установки и вызвать метод установки из контроллера послеMyPojo p = new MyPojo() сделано.
 Arun P Johny12 окт. 2012 г., 17:57
Как создается экземпляр объекта POJO?
 birdy12 окт. 2012 г., 18:01
контроллер просто создает экземпляр pojo следующим образом:MyPojo p = new MyPojo(); p.testFromPojo();
 birdy12 окт. 2012 г., 17:54
Это имеет смысл. я могу использовать@Repository вместо@Service, В моем pojo я хочу сделать несколько запросов к базе данных. Вот почему я хочу использоватьmyService в моем POJO. Пожалуйста, дайте мне знать, если есть лучший способ сделать это? Все, что я хочу сделать из своего POJO - это запустить несколько запросов к БД

Ваш ответ на вопрос