Spring自动装配不起作用,将`applicationDao`变为null

时间:2014-07-09 06:18:18

标签: spring hibernate

以下是我的课程和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声明。

3 个答案:

答案 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中删除ApplicationDaoApplicationService bean声明。 并且不要使用@Component@Service@Repository注释标记服务和dao类。无需在那里标记@Component。删除它。