2017-07-21 47 views
1

我想在具有基於xml配置的項目中創建spring-hibernate配置。當打印sessionFactory對象時,它應該返回一個像內存地址一樣的值,但它會給出空值。sessionfactory在Spring基於xml的配置中總是返回null

我想用@ Autowire註釋在bean中注入sessionFactory。 我打算使用hibernate管理事務。

我的代碼是

春天-config.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:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation= 
    http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/context 

http://www.springframework.org/schema/context/spring-context-3.0.xsd「>

<context:annotation-config /> 

<context:property-placeholder location="classpath:application.properties" /> 
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="${database.driverClassName}" /> 
    <property name="url" value="${database.url}" /> 
    <property name="username" value="${database.username}" /> 
    <property name="password" value="${database.password}" />  
</bean> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto} 
    </prop> 
      <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
     </props> 
    </property> 

    </bean> 
    <bean id="abc" class="pkg.A"/> 

</beans> 

這裏是我的接口

Abc.java

package pkg; 

public interface Abc { 
    public void m1(); 

} 

接口實現

A.java

  package pkg;  

      import org.hibernate.SessionFactory; 
      import org.springframework.beans.factory.annotation.Autowired; 
      import org.springframework.stereotype.Repository; 

      @Repository 
      public class A implements Abc { 

       @Autowired 
       SessionFactory sessionFactory; 



       public SessionFactory getSessionFactory() { 
        System.out.println("sys factory : "+sessionFactory); 
        return sessionFactory; 
       } 



       public void setSessionFactory(SessionFactory sessionFactory) { 
        this.sessionFactory = sessionFactory; 
       } 



       public void m1() { 
        System.out.println("session factory obj : "+sessionFactory); 

       } 

      } 

它給了我零

Tomcat的輸出:

  Jul 21, 2017 8:38:47 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
      INFO: Root WebApplicationContext: initialization completed in 9610 ms 
      Jul 21, 2017 8:38:47 PM org.apache.coyote.AbstractProtocol start 
      INFO: Starting ProtocolHandler ["http-nio-8082"] 
      Jul 21, 2017 8:38:47 PM org.apache.coyote.AbstractProtocol start 
      INFO: Starting ProtocolHandler ["ajp-nio-8011"] 
      Jul 21, 2017 8:38:47 PM org.apache.catalina.startup.Catalina start 
      INFO: Server startup in 24169 ms 
      session factory obj : null 

下面是JSP文件從此我打電話像SessionFactory對象

   <%@page import="pkg.A"%> 
      <%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
       pageEncoding="ISO-8859-1"%> 
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
      <html> 
      <head> 
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
      <title>Insert title here</title> 
      </head> 
      <body> 

      <h2>H2 heading</h2> 

      <% 

      A a = new A(); 
      a.m1(); 

      %> 
      </body> 
      </html> 

回答

0

我得到了答案依賴注入

首先我配置的一些研究後是正確的..這個問題是在做法,我按照..每個春天,你的應用程序應該鬆散耦合到bean的注入依賴。對於鬆散耦合的接口應該使用。 這樣做後,自動裝入bean中的這些接口,spring會自動添加依賴到bean中

0

你忘記添加<context:component-scan base-package="pkg"/>spring-config.xml

+0

我做了那麼那麼它也會返回null –

+0

如何調用m1()方法? –

+0

從jsp頁面的scriplet標記中獲取A a = new A(); a.m1(); –