繁体   English   中英

使用Spring进行依赖注入失败

[英]Dependency injection with Spring fails

我正在使用Spring4。 我有3类:MyController,ADAo和BDao。

MyController类中的viewAs()方法调用ADao中的getAs()方法,ADAo中的getAs()方法调用BDao中的getB()方法。

注入ADao类中的SessionFactory对象,但不注入BDao类中的sessionFactory对象。 我的问题是为什么不注射? 我收到Null指针异常,因为sessionao对象在BDao类中为null。

是因为我从另一个岛呼叫一个岛吗?

@Controller
public class MyController {
    @Autowired
    private ADao aDao;

    @RequestMapping(value="viewAllItems")
    public String viewAs(HttpServletRequest req, HttpServletResponse res){
        List<Item> list = new ArrayList<Item>();
        list = aDao.getAs();
        return "";
    }
}

@Repository
public class ADao {
    @Autowired
    private SessionFactory sessionFactory;//objected gets injected. 

    public ADao(){}

    public List<A> getAs() throws HibernateException{
        session = sessionFactory.openSession();
        tx = session.beginTransaction();
        new B().getB(null);

        return null;
    }
}

@Repository
public class BDao {

    @Autowired
    private SessionFactory sessionFactory;

    private Session session;

    public BDao(){}

    public void getB(B b) throws HibernateException{
        session = sessionFactory.openSession();// Object does not get injected. Causes NullPointerException 
    }
}

编辑: dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- JSR-303 support will be detected on classpath and enabled automatically -->
    <mvc:annotation-driven/>

        <context:component-scan base-package="com.karmacrafts.web.controller" />
        <context:component-scan base-package="com.karmacrafts.model.dao"/> 
        <context:property-placeholder location="classpath:application.properties" />
        <context:annotation-config/>

        <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
            <property name="viewClass"
                value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/jsp/" />
            <property name="suffix" value=".jsp" />
        </bean> 


           <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
              <property name="dataSource" ref="dataSource" />
              <property name="packagesToScan" value="com.karmacrafts.model.impl" />
              <property name="hibernateProperties">
                 <props>
                    <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                 </props>
              </property>
           </bean>

           <bean id="dataSource"
            class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
              <property name="driverClassName" value="${jdbc.driverClassName}" />
              <property name="url" value="${jdbc.databaseurl}" />
              <property name="username" value="${jdbc.username}" />
              <property name="password" value="${jdbc.password}" />
           </bean>

           <bean id="transactionManager"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
              <property name="sessionFactory" ref="sessionFactory" />
           </bean>

           <bean id="persistenceExceptionTranslationPostProcessor"
            class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>


        <bean id="ADao" class="com.ADao" />
        <bean id="BDao" class="com.BDao"/>
</beans>

在ADAO类中添加以下内容:

**@Autowired

private BDao bdao;//objected gets injected.** 

并使用此对象来调用BDao方法,而不是使用new运算符

当您说new B()您将退出Spring Context。 您自己创建了一个bean,它将不会从spring上下文注入任何东西。 context.getBean()替换new B() context.getBean()

或在您的ADao中自动连线BDao

在ADao类的getAs()方法中,您正在使用new运算符作为

    new B().getB(null);

它不是Spring管理的bean。 因此,自动装配对在BDao类中注入sessionFactory无效。

相反,您可以通过以下方式自动装配将BDao注入ADao:

@Repository
public class ADao {
    @Autowired
    private BDao bdao;//use this to call getB method
    ...
}   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM