我对 Autowiring 注释有一些问题。我的应用程序如下所示:
这是 Controller :
@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" />
所以......当我启动一个网络应用程序时,MyController Autowires 正确(由 SomeServiceImpl 类对象正确注入(inject)的 someService 字段),但 someService 的 myDAO 字段具有空值(未正确注入(inject))。
你能帮我找出问题吗?
附言这很有趣,但是当我将“bean id”从 myDAO 更改为另一个(例如 myDAO2)时,系统会给我一个错误,即无法完成注入(inject),因为 bean myDAO 不存在。那么,Spring 进行了一次注入(inject),但是它在哪里呢?为什么它不能正常工作?
最佳答案
我找到了解决方案。正如 Javi 所说(非常感谢你,Javi),我必须用 @Repository
注释 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
注释对于某些类来说不是首选,如何正确注入(inject)位于较低级别的bean(在类的字段中,或在类的字段中)(当然是@Autowire
注释)?
关于 Spring @Autowired 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287837/