Java Spring控制器中的自连线bean注入

Java Spring控制器中的自连线bean注入,java,spring,Java,Spring,不知道怎么回事。我一次又一次地犯同样的错误。我搜索过谷歌,但没能解决这个问题。我在这里找同一个帖子,试图解决问题,但还是一样 JobsDAOImp.java public class JobsDAOImp implements JobsDAO { @Autowired private SessionFactory sessionFactory; .. } public interface JobsService { .... }

不知道怎么回事。我一次又一次地犯同样的错误。我搜索过谷歌,但没能解决这个问题。我在这里找同一个帖子,试图解决问题,但还是一样

JobsDAOImp.java

public class JobsDAOImp implements JobsDAO {

    @Autowired 
    private SessionFactory sessionFactory;
        ..        
}
public interface JobsService {
       ....
}
@Service
@Transactional(readOnly=true)
public class JobsServiceImp implements JobsService {

    @Autowired private JobsDAOImp jobsDAOImp;
        ..
}
@Controller
@RequestMapping(value="/")
public class JobsController {

    @Autowired
    private JobsService jobsService;
            ...
}
JobService.java

public class JobsDAOImp implements JobsDAO {

    @Autowired 
    private SessionFactory sessionFactory;
        ..        
}
public interface JobsService {
       ....
}
@Service
@Transactional(readOnly=true)
public class JobsServiceImp implements JobsService {

    @Autowired private JobsDAOImp jobsDAOImp;
        ..
}
@Controller
@RequestMapping(value="/")
public class JobsController {

    @Autowired
    private JobsService jobsService;
            ...
}
JobServiceImp.java

public class JobsDAOImp implements JobsDAO {

    @Autowired 
    private SessionFactory sessionFactory;
        ..        
}
public interface JobsService {
       ....
}
@Service
@Transactional(readOnly=true)
public class JobsServiceImp implements JobsService {

    @Autowired private JobsDAOImp jobsDAOImp;
        ..
}
@Controller
@RequestMapping(value="/")
public class JobsController {

    @Autowired
    private JobsService jobsService;
            ...
}
JobsController.java

public class JobsDAOImp implements JobsDAO {

    @Autowired 
    private SessionFactory sessionFactory;
        ..        
}
public interface JobsService {
       ....
}
@Service
@Transactional(readOnly=true)
public class JobsServiceImp implements JobsService {

    @Autowired private JobsDAOImp jobsDAOImp;
        ..
}
@Controller
@RequestMapping(value="/")
public class JobsController {

    @Autowired
    private JobsService jobsService;
            ...
}
spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">

        <context:annotation-config/>        

        <!-- DAO Implementations -->
        <bean id="usersImp" class="org.delance.daoimplementation.UsersImp" />
        <bean id="jobsDAOImp" class="org.delance.daoimplementation.JobsDAOImp" />

        <!-- Service Implementations -->
        <bean id="jobsServiceImp" class="org.delance.serviceimp.JobsServiceImp" />  

        <bean id="dataSource" class="${jdbc.dataSource}" destroy-method="close">
               <property name="driverClass" value="${jdbc.driverClass}"/>
               <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
               <property name="user" value="${jdbc.user}"/>
               <property name="password" value="${jdbc.password}"/>
               <property name="maxStatements" value="${jdbc.maxStatements}"/>

               <property name="acquireIncrement" value="${jdbc.acquireIncrement}" />                   

               <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" />  
               <property name="checkoutTimeout" value="${jdbc.checkoutTimeout}" /> 
               <property name="unreturnedConnectionTimeout" value="${jdbc.unreturnedConnectionTimeout}" /> 
               <property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
               <property name="minPoolSize" value="${jdbc.minPoolSize}" />
               <property name="automaticTestTable" value="${jdbc.automaticTestTable}" /> 
               <property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}" />                 
        </bean>

        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
               <property name="dataSource" ref="dataSource"/>

               <property name="packagesToScan">
                            <array>
                               <value>org.delance.models</value>
                            </array>
               </property>               

               <property name="hibernateProperties">
                 <value>
                   hibernate.dialect = org.hibernate.dialect.MySQLDialect
                   hibernate.cache.provider_class = org.hibernate.cache.NoCacheProvider
                   hibernate.show_sql = true
                   hibernate.hbm2ddl.auto = create
                 </value>
               </property>               

        </bean>                

        <context:property-placeholder location="application.properties" />
</beans>    

使用接口而不是
JobsController
中的实现,因为spring为
JobServiceImpl
bean生成了一个java代理,并且java代理基于接口

 @Autowired
 private JobsService jobsService;

我看不到您的整个项目以及具体的配置,但在我看来,您只加载了mvc-dispatcher-servlet.xml,而没有加载spring.xml。在您的情况下,这是可以的,因为您已经定义了

<context:component-scan base-package="org.delance" />

扫描bean定义。因此,假设您只加载了mvc-dispatcher-servlet.xml,那么您应该检查控制器和服务是否都在一个包含公共基本包“org.delance”的包中,否则spring类路径扫描将无法获取它们。另外,您应该去掉限定符——这是在您有两个或更多给定类型的bean的情况下。 不管怎样,我以前也有过这样的问题,我相信这将是一个小问题


关于这个事实,你有2个配置(或者上下文),你还有更多的事情要考虑。您不应该两次定义一个bean(一次通过包扫描,第二次在xml配置中),除非是有意这样做。话虽如此,如果您解决了第一个问题,那么在加载这两个上下文(spring.xml和mvc dispatcher servlet.xm)时,您将遇到其他问题。

您需要指定jobService.java类。向其添加立体类型注释,如@Component。

如果使用此类定义:

您并没有利用Spring依赖项注入特性,因为接口和实现类之间并没有区别;在Spring中,您可能希望在整个代码中使用接口,并在应用程序上下文配置中声明它们的实现(这被定义为关注点分离);这在您决定更改实现时也很有用,因为您只需要更改xml配置

请尝试以下操作:


Salvatore

为什么你们都在xml配置中放置
@Service
注释和定义bean?顺便问一下(不相关)为什么不将
jobserviceimp
字段声明为
jobservice
(接口)