我需要帮助理解@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
}
}
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>
答案 0 :(得分:16)
这是因为您的POJO类不受spring容器管理。
@Autowire
注释仅适用于由spring管理的对象(即由spring容器创建)。
在您的情况下,服务和控制器对象由spring管理,但您的POJO类不受spring管理,这就是为什么@Autowire
不会产生您期望的行为。
我注意到的另一个问题是,当spring具有专门为此目的创建的@Service
注释时,您在DAO层中使用@Repository
注释。
也不希望允许spring管理POJO类,因为通常它是必须在容器外创建的数据存储元素。
您能告诉我们POJO类的目的是什么以及为什么使用service
实例?
答案 1 :(得分:5)
使用类路径扫描时,您必须与Spring通信要管理的类。这是使用@Service
注释及其关系(@Controller
,@Repository
等)完成的。
如果您选择 not 来注释您的bean,则必须在配置中明确声明它,就像使用dataSource
和jdbcTemplate
一样。
注释您的类意味着只有包中的那些类由Spring管理;它允许您扫描包而无需管理该包中的所有类。
答案 2 :(得分:2)
将其包含在applicationContext.xml文件中
<context:annotation-config />
答案 3 :(得分:0)
您可以实现此操作以在POJO类中使用spring-managed bean。
http://www.javacodegeeks.com/2015/03/using-spring-managed-bean-in-non-managed-object.html
答案 4 :(得分:-1)
检查配置文件中的上下文组件扫描
<context:component-scan base-package="<your_package>" />