Java 如何实例化通用Springbean?

Java 如何实例化通用Springbean?,java,spring,hibernate,generics,spring-mvc,Java,Spring,Hibernate,Generics,Spring Mvc,我正在尝试创建一个泛型类,它将帮助我减少样板代码。为此,我使用Spring3(MVC)和Hibernate4 类看起来像这样: @Repository("AutoComplete") public class AutoComplete<T extends Serializable> implements IAutoComplete { @Autowired private SessionFactory sessionFactory; private Cla

我正在尝试创建一个泛型类,它将帮助我减少样板代码。为此,我使用Spring3(MVC)和Hibernate4

类看起来像这样:

@Repository("AutoComplete")
public class AutoComplete<T extends Serializable> implements IAutoComplete {

    @Autowired
    private SessionFactory sessionFactory;

    private Class<T> entity;

    public AutoComplete(Class<T> entity) {
        this.setEntity(entity);
    }

    @Transactional(readOnly=true)
    public List<String> getAllFTS(String searchTerm) {
        Session session = sessionFactory.getCurrentSession();
        return null;
    }

    public Class<T> getEntity() {
        return entity;
    }

    public void setEntity(Class<T> entity) {
        this.entity = entity;
    }

}
IAutoComplete place = new AutoComplete<Place>(Place.class);
place.getAllFTS("something");

这是为什么?我如何解决这个问题?我猜问题是因为bean没有被Spring本身实例化,所以它不能自动连接字段。我想自己实例化bean,但如果可能的话,仍然让spring管理它。

spring容器将为您实例化这个bean,在这种情况下,将注入sessionFactory。您可以用自己的代码实例化这个bean:new AutoComplete(),当然sessionFactory为null。

永远不要用带有@Autowired注释的字段实例化类。如果您这样做,该字段将导致null。您应该做的是获得对Spring的ApplicationContext的引用(可以通过实现ApplicationContextAware接口来实现),并在AutoComplete类的默认构造函数中使用以下代码

public AutoComplete() {
    sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory");
}

使用Spring时的一个主要实践是我们自己消除对象的实例化。我们应该在spring配置中指定所有内容,以便spring在需要时为我们实例化对象。但是在您的情况下,您需要使用通用方法。

确保您已经在XMLBean定义文件中添加了

由于@Repository是原型,Spring容器将进行类路径扫描,添加它的bean定义并注入它的依赖项


稍后,您可以使用bean名称从ApplicationContext获取bean的句柄(自动完成).

我实现了ApplicationContextAware接口,但在默认构造函数中出现NullPointer异常。所有修改完成后,它仍会在默认构造函数中引发NullPointer异常。您的bean配置中是否有sessionFactory bean。是的,applicationContext.xml设置正确。我可以使用带有注入DAO(注入sessionFactory)的服务访问数据库,而不会出现问题。我用于sessionFactory的Bean是org.springframework.orm.hibernate4.LocalSessionFactoryBean。您查看过SpringData吗?您不必为存储库编写这样的泛型类。
public AutoComplete() {
    sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory");
}