Java @自动连线和@Service从控制器工作,但不从其他包工作

Java @自动连线和@Service从控制器工作,但不从其他包工作,java,spring-mvc,spring-3,autowired,Java,Spring Mvc,Spring 3,Autowired,我需要帮助理解@Autowired和@Service背后的概念。我有一个用@Service定义的DAO和一个用@Autowired定义的控制器,一切看起来都很好,但是,我在不同的类中使用相同的@Autowired,那么它就不起作用了 例如: 服务 @Service public class MyService { private JdbcTemplate jdbcTemplate; @Autowired public void setDataSource (DataSo

我需要帮助理解
@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";
  }
}
以上各项都很好。然而,如果我想在POJO中使用
MyService
,那么它就是不起作用。例如:

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>

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

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

将其包含在applicationContext.xml文件中

<context:annotation-config />

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

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


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

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

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

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

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

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


您能告诉我们POJO类的用途是什么以及为什么在其中使用
服务
实例吗?

您可以在POJO类中使用spring管理的bean来实现它


是Spring实例化的
MyPojo
吗?我没有为config.xml中的
MyController
做任何事情,所以我也没有为
MyPojo
做任何事情。我应该怎么做?你能发布你的Spring配置吗?在底部添加了Spring配置更新我已经检查过了。它正在扫描所有的包。所以我应该用
@Service
@Repository
@Controller
对我的POJO进行注释。我更喜欢添加注释,而不是在xml中定义注释“注释您的类会阻止包中的每个类都由Spring管理;这通常是不可取的。”真的吗?所以在一个包中只有一个类可以被注释?
@Service
是最不具体的,所以这就是我要使用的。@birdy我的意思是,通过注释,你可以选择要管理的类。这很有意义。我可以使用
@Repository
而不是
@Service
。在我的pojo中,我想对数据库进行一些查询。这就是为什么我想在POJO中使用
myService
。如果有更好的方法,请告诉我?我想从POJO中执行的所有操作都是对数据库运行一些查询POJO对象实例是如何创建的?控制器只是像这样实例化POJO:
MyPojo p=new MyPojo();p、 testFromPojo()您认为在控制器调用POJO时提供对服务的引用更好吗?like
mypojop=newmypojo(myService);p、 testFromPojo()
因此现在
MyPojo
将有一个构造函数,该构造函数将引用
myService
的一个实例。在这种情况下,
@Autowired
将无法工作,您需要创建一个setter方法,并在
MyPojo p=new MyPojo()
完成后从控制器调用setter方法。请避免仅链接的答案。