Spring @Autowired 不工作

标签 spring spring-mvc annotations autowired

我对 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/

相关文章:

java - Spring AOP错误: java. lang.NoClassDefFoundError:org/springframework/cglib/core/SpringNamingPolicy

java - 访问构造的注释参数进行修改

java - 在 Spring MVC 中显示带有复选框的列表

java.lang.NoClassDefFoundError : org/apache/commons/fileupload/FileItemFactory

java - Hibernate 注解 Java 映射

java - 添加多个 mongoTemplates 到 servlet-context

java - Weblogic 12c 与 Oracle 数据库 18c : setTransactionOnly() called on transaction error

java - 在 Spring MVC 中,无法使用 Jackson @JsonFormat 将输入绑定(bind)到日期字段

java - Spring 是否生成验证代码?

java - 如何仅在一个目标上弃用注释