java - @Autowired 和 @Service 从 Controller 工作,而不是从不同的包工作

标签 java spring-mvc spring-3 autowired

我需要帮助理解@Autowired@Service 背后的概念。我有一个用 @Service 定义的 DAO 和一个用 @Autowired 定义的 Controller ,一切看起来都很好,但是,我在不同的地方使用相同的 @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");
    }
}

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

以上一切正常。但是,如果我想在 POJO 中使用 MyService 那么它就不起作用了。示例:

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

    @Autowired
    MyService myService;

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

Spring 配置:

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

最佳答案

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

@Autowire 注释将只对那些由 s​​pring 管理的对象(即由 spring 容器创建)起作用。

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

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

另外,也不希望让 spring 管理 POJO 类,因为通常它是必须在容器外部创建的数据存储元素。

关于java - @Autowired 和 @Service 从 Controller 工作,而不是从不同的包工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12862203/

相关文章:

java - 如何在一个项目中同时使用Androidx库和支持库?

java - 基于 Web 的项目的基本架构指南 : cloud

java - java线程中的唯一id

spring-mvc - java.lang.ClassNotFoundException : org. springframework.security.access.expression.SecurityExpressionHandler 使用 <security:authorize > 标签时

spring-security - 在哪里可以找到使用 <http> 元素时注册的所有安全过滤器的列表?

java - 为什么 Facebook 访问 token 会更改每次访问?

java - 从 spring multiple <form :select> 绑定(bind)对象

java - Spring Web MVC 项目 404 错误

java - 发生异常时不会调用 ResponseEntityExceptionHandler

java - Spring @Autowired 不适用于急切初始化的 bean