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