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当然带有注释)?