2013-01-06 103 views
0

我在主题Spring和Hibernate注入其他类

新我有配置

并尝试把它注射

@Controller 
public class HelloController { 
    @Autowired 
    HibernateTemplate hibernateTemplate; 

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET) 
    public @ResponseBody String save() throws Exception { 
     hibernateTemplate.save(new Some(Long.valueOf("33"), Integer.valueOf("1"), Double.valueOf("1"), Short.valueOf("0")));  
    } 
} 

它的工作。

但如果我尝试在其他类中使用@Autowired我有NPE 例如

public class SomeFacade extends AbstractFacade<Some> { 

    @Autowired 
    HibernateTemplate hibernateTemplate; 

    @Override 
    public HibernateTemplate getHibernateTemplate() { 
     return hibernateTemplate; 
    } 

} 

@Controller 
public class HelloController { 

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET) 
    public @ResponseBody String save() throws Exception { 
     SomeFacade df = new SomeFacade(); 
     HibernateTemplate ht = df.getHibernateTemplate(); 
    } 
} 

使用它,我有 “HT” 是空

我不知道该代码中发生了什么,以及为什么它不工作,我认为这是因为我的类没有在xml文件中注册。 请帮助这个例子。 谢谢!

+2

是的,这个工作,SomeFacade将需要一个Spring bean,并需要被注入到HelloContr中oller - 而不是HelloController构造它。 – GreyBeardedGeek

回答

1

像@GreybeardedGeek表示它需要成为一个Spring bean。您可以添加注释@Component到类,因此将被Spring管理:

@Component 
public class SomeFacade extends AbstractFacade<Some> { 

    @Autowired 
    HibernateTemplate hibernateTemplate; 

    @Override 
    public HibernateTemplate getHibernateTemplate() { 
     return hibernateTemplate; 
    } 

} 

不要忘了添加组件,扫描您的xml文件(根上下文),如果它已不存在:

<context:component-scan base-package="your.package" /> 

如果您使用此解决方案,注入的,而不是使用new关键字组件:

@Controller 
public class HelloController { 

    @Autowired 
    private SomeFacade df; 

    @RequestMapping(value = "/hello.htm", method = RequestMethod.GET) 
    public @ResponseBody String save() throws Exception { 
     HibernateTemplate ht = df.getHibernateTemplate(); 
    } 
}