春天@Autowired不工作

Iln*_*nur 10 spring annotations spring-mvc autowired

我有一些自动注释的问题.我的应用程序如下所示:

这是控制器:

@Controller
public class MyController {
    @Autowired
    @Qualifier("someService")
    private SomeService someService;

    ....
}
Run Code Online (Sandbox Code Playgroud)

这是一个服务层:

public interface SomeService {
    ...
}

@Service
public class SomeServiceImpl implements SomeService{    
    @Autowired
    @Qualifier("myDAO")
    private MyDAO myDAO;

    ....
}
Run Code Online (Sandbox Code Playgroud)

和DAO层:

public interface MyDAO{
    ....        
}

@Repository
public class JDBCDAOImpl implements MyDAO {    
    @Autowired
    @Qualifier("dataSource")
    private DataSource dataSource;    
    ....
}
Run Code Online (Sandbox Code Playgroud)

这是一个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" />    
Run Code Online (Sandbox Code Playgroud)

所以......当我启动一个web-app时,MyController自动正确(SomeServiceImpl类对象正确注入someService字段),但someService的myDAO feild有空值(未正确注入).

你能帮我找个问题吗?

PS它很有意思,但是当我将myDAO中的"bean id"更改为另一个(例如myDAO2)时,系统会给我一个错误,即无法执行注入,因为bean myDAO不存在.那么,Spring注射,但它在哪里?为什么它不能正常工作?

Iln*_*nur 11

我找到了解决方案.正如Javi所说(非常感谢你,Javi),我必须使用@Repository@Service注释来注释DAO和服务层类.现在我试着像这样写:

@Service("someService")
public class SomeServiceImpl implements SomeService{    
    @Autowired
    @Qualifier("myDAO")
    private MyDAO myDAO;

    ....
}
Run Code Online (Sandbox Code Playgroud)

@Repository("myDAO")
    public class JDBCDAOImpl implements MyDAO {    
    @Autowired
    @Qualifier("dataSource")
    private DataSource dataSource;    
    ....
}
Run Code Online (Sandbox Code Playgroud)

一切正常!!!

但我仍然没有找到这个问题的答案:如果应用程序将更复杂,并且将具有更复杂的结构,哪些@Repositore@Service注释不是某些类的首选,如何正确注入位于较低级别的bean(在字段中)课程领域,或课堂领域)(@Autowire当然还有注释)?

  • @Component是用于另一个组件的组件,它不是控制器,服务或存储库 (10认同)