10

我需要帮助理解 and 背后的@Autowired概念@Service。我有一个用@Service和控制器定义的 DAO @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
    }
}

弹簧配置:

<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>
4

5 回答 5

16

这是因为你的 POJO 类不是由 spring 容器管理的。

@Autowire注释仅适用于由 spring 管理的那些对象(即由 spring 容器创建)。

在您的情况下,服务和控制器对象由 spring 管理,但您的 POJO 类不由 spring 管理,这就是为什么@Autowire不会产生您期望的行为。

@Service我注意到的另一个问题是,当 spring 有@Repository专门为此目的创建的注释时,您正在使用DAO 层中的注释。

此外,不允许 spring 管理 POJO 类也是不可取的,因为通常它将是必须在容器外部创建的数据存储元素。

于 2012-10-12T15:47:40.550 回答
5

使用类路径扫描时,您必须与 Spring 通信要管理哪些类。这是使用@Service注释及其关系(@Controller@Repository等)完成的。

如果您选择注释您的 bean,您必须在配置中显式声明它,就像您对dataSourceand所做的那样jdbcTemplate

注释你的类意味着只有包中的那些类由 Spring 管理;它允许您扫描一个包,而无需管理该包中的所有类。

于 2012-10-12T15:32:44.053 回答
2

将其包含在 applicationContext.xml 文件中

<context:annotation-config />
于 2012-10-12T15:32:14.610 回答
0

您可以实现它以在 POJO 类中使用弹簧管理的 bean。

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

于 2015-10-08T08:09:43.183 回答
-1

检查配置文件中的上下文组件扫描

<context:component-scan base-package="<your_package>" />
于 2012-10-12T15:22:44.583 回答