以下是我的课程和xml:
@Component
@Service("ApplicationService")
public class ApplicationServiceImpl implements ApplicationService{
public ApplicationDao getApplicationDao() {
return applicationDao;
}
public void setApplicationDao(ApplicationDao applicationDao) {
this.applicationDao = applicationDao;
}
@Autowired
private ApplicationDao applicationDao;
// some methods..
}
@Service
public interface ApplicationService {
// methods...
}
@Component
@Repository("ApplicationDao")
public class ApplicationDaoImpl implements ApplicationDao {
@Autowired
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// other methods...
}
public interface ApplicationDao {
// methods...
}
xml文件:
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven/>
<context:component-scan base-package="com" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- <property name="dataSource" ref="dataSource" /> -->
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<bean id="ApplicationDao" class="com.dao.impl.ApplicationDaoImpl"/>
<bean id="ApplicationService" class="com.service.impl.ApplicationServiceImpl"/>
此处自动装配不起作用。在ApplicationServiceImpl
中,我将applicationDao
视为空。尚未在ApplicationDaoImpl中测试sessionFactory
。
我知道如果我使用@Component,则不需要xmnl中的bean声明。
答案 0 :(得分:2)
你不应该像那样实例化服务.. 在加载应用程序时,spring容器将创建在spring.xml或带注释的类中定义的所有实例及其依赖项。 所以你必须使用以下示例代码访问它们。
ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
ApplicationService applicationService = (ApplicationService) applicationContext.getBean("ApplicationService");
由于ApplicationService
具有ApplicationServiceDAOImpl
的属性,因此它已由弹簧容器创建并将返回给您。
但是,如果您手动直接实例化,则只需创建ApplicationService
的实例,但不能创建ApplicationServiceDAOImpl
..因此它显然会返回null
我目前只使用这种方法访问bean或服务..
更新评论
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
applicationContext = arg0;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
希望它有所帮助,
答案 1 :(得分:1)
尝试这样的改变:
import org.springframework.beans.factory.annotation.Qualifier;
@Autowired
@Qualifier("ApplicationDao")
private ApplicationDao applicationDao;
这给了春天一个暗示。
答案 2 :(得分:0)
如果您在应用程序中使用注释,则应使用标记表示:
<mvc:annotation-driven />
在组件扫描标记上方的应用程序上下文xml中添加此行。
此外,如果您使用注释,请从xml中删除ApplicationDao
和ApplicationService
bean声明。
并且不要使用@Component
和@Service
或@Repository
注释标记服务和dao类。无需在那里标记@Component
。删除它。