2014-07-09 45 views
0

下面是我的課和xml:彈簧自動連接不工作,讓'applicationDao`爲空

@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"/> 

這裏自動裝配不working.in ApplicationServiceImpl,我越來越applicationDao爲空。沒有在ApplicationDaoImpl中測試sessionFactory

我知道如果我使用@Component,那麼xmnl中的bean聲明不是必需的。

+0

你可以展示你所看到的棧跟蹤嗎? – geoand

+0

嘗試添加'''到你的xml文件 – Jens

+0

沒有例外。打印道對象時,我只是變爲空。 – VJS

回答

1

試圖改變這樣的:

import org.springframework.beans.factory.annotation.Qualifier; 

@Autowired 
@Qualifier("ApplicationDao") 
private ApplicationDao applicationDao; 

這給春天的提示。

2

你不應該實例化服務這樣的.. 在應用程序加載的時候,Spring容器將創建spring.xml界定或註釋的所有類實例和它的依賴.. 所以,你必須具有下列訪問它們例如代碼..

ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext(); 
      ApplicationService applicationService = (ApplicationService) applicationContext.getBean("ApplicationService");  

由於ApplicationService的屬性,它是ApplicationServiceDAOImpl,它已經被Spring容器創建並返回你..
但由您直接手動實例情況下,具有,你只是創建實例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; 
    } 

} 

希望它能幫助,

+0

好的。什麼是ApplicationContextProvider ..這是可用的包/ jar.I我沒有得到它。 – VJS

+0

這是一種用於從應用程序上下文獲取bean的舊方法。有了註釋,你就不再需要這個了。 –

+0

@ Mr.Chowdary:謝謝。這是有用的信息。 – VJS

0

如果您在應用程序中使用註釋時,應該使用標記表示它:

<mvc:annotation-driven /> 

添加此li ne在組件掃描標籤上的應用程序上下文xml中。 另外,如果您使用註釋,請從xml中刪除ApplicationDaoApplicationService bean聲明。 並且不要用@Component@Service@Repository註釋標記您的服務和dao類。沒有必要在那裏標記它們@Component。去掉它。

+1

添加''不會做太多工作,它可以處理'@ RequestMapping'。同樣使用''則意味着使用基於註解的配置,所以不需要添加你可能意指的''。 –