spring@Autowired无法正常工作
问题内容:
我在使用自动装配注释时遇到了一些问题。我的应用程序如下所示:
这是控制器:
@Controller
public class MyController {
@Autowired
@Qualifier("someService")
private SomeService someService;
....
}
这是一个服务层:
public interface SomeService {
...
}
@Service
public class SomeServiceImpl implements SomeService{
@Autowired
@Qualifier("myDAO")
private MyDAO myDAO;
....
}
和DAO层:
public interface MyDAO{
....
}
@Repository
public class JDBCDAOImpl implements MyDAO {
@Autowired
@Qualifier("dataSource")
private DataSource dataSource;
....
}
这是一个app-service.xml文件:
....
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"/>
<bean id="SomeService" class="com.service.SomeServiceImpl" />
<bean id="myDAO" class="com.db.JDBCDAOImpl" />
所以…当我启动一个Web应用程序时,MyController
Autowires正确(SomeServiceImpl类对象正确注入了someService字段),但是someService的myDAO字段具有空值(未正确注入)。
您能帮我发现问题吗?
PS它很有趣,但是当我将“ bean id”从myDAO更改为另一个(例如myDAO2)时,系统给我一个错误,由于bean
myDAO不存在,无法进行注入。那么,Spring会打针,但是它在哪里?以及为什么它不能正常工作?
问题答案:
我找到了解决方案。正如Javi所说的(非常感谢您,Javi),我必须用@Repository
和@Service
注释DAO和Service层类。现在,我尝试这样写:
@Service("someService")
public class SomeServiceImpl implements SomeService{
@Autowired
@Qualifier("myDAO")
private MyDAO myDAO;
....
}
和
@Repository("myDAO")
public class JDBCDAOImpl implements MyDAO {
@Autowired
@Qualifier("dataSource")
private DataSource dataSource;
....
}
一切正常!!!
但是我仍然没有找到这个问题的答案:如果应用程序会更复杂,并且结构会更复杂,某些类在哪里不喜欢使用注解@Repositore
和@Service
注解,如何正确注入位于较低级别(在字段中)的bean类,或在类的字段中(@Autowire
当然带有注释)?