Spring 数据表之后的Bean注入

Spring 数据表之后的Bean注入,spring,jsf,dependency-injection,datatable,lazy-initialization,Spring,Jsf,Dependency Injection,Datatable,Lazy Initialization,我有一个带有datatable的页面,它从服务类读取数据。该服务类应该被注入一个contactDAO,但它不会立即被注入。事实上,当页面第一次加载时,数据表是空的,因为DAO还没有被注入。但是,如果调用addContact(),则列表“contacts”会很好地更新,因为此时contactDAO已被注入 如何确保在datatable需要使用服务类之前注入contactDAO?我正在使用Spring3和JSF2.0 带有数据表的页面绑定到列表“contactserviceinpl.contacts

我有一个带有datatable的页面,它从服务类读取数据。该服务类应该被注入一个contactDAO,但它不会立即被注入。事实上,当页面第一次加载时,数据表是空的,因为DAO还没有被注入。但是,如果调用addContact(),则列表“contacts”会很好地更新,因为此时contactDAO已被注入

如何确保在datatable需要使用服务类之前注入contactDAO?我正在使用Spring3和JSF2.0

带有数据表的页面绑定到列表“
contactserviceinpl.contacts
”:

<h:dataTable var="contact" value="#{contactServiceImpl.contacts}">
...
</h:dataTable>

...
我的ContactServiceImpl如下所示:

@Service
public class ContactServiceImpl implements ContactService {

    private static List<Contact> contacts = new ArrayList<Contact>();

    @Autowired
    private static ContactDAO contactDAO;

    private ContactServiceImpl() {
        contacts = new ArrayList<Contact>();

        //TODO: need to inject contactDAO at the same time as instantiation
        contacts.clear();
        try {
            contacts.addAll( contactDAO.getContacts() );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void addContact(Contact contact) {
        contacts.add(contact);
        contactDAO.addContact(contact);

        contacts.clear();
        contacts.addAll( contactDAO.getContacts() );
    }

    @Autowired
    public void setContactDAO(ContactDAO contactDAO) {
        ContactServiceImpl.contactDAO = contactDAO;
        System.out.println("DAO is injected");
    }
}
@服务
公共类ContactServiceImpl实现ContactService{
private static List contacts=new ArrayList();
@自动连线
私有静态ContactDAO ContactDAO;
私有ContactServiceImpl(){
联系人=新的ArrayList();
//TODO:需要在实例化的同时注入contactDAO
contacts.clear();
试一试{
contacts.addAll(contactDAO.getContacts());
}捕获(例外e){
e、 printStackTrace();
}
}
公共联系人(联系人联系人){
联系人。添加(联系人);
contactDAO.addContact(contact);
contacts.clear();
contacts.addAll(contactDAO.getContacts());
}
@自动连线
公共无效setContactDAO(ContactDAO ContactDAO){
ContactServiceImpl.contactDAO=contactDAO;
System.out.println(“DAO被注入”);
}
}
和applicationContext.xml

  <bean id="contactServiceImpl" class="com.example.service.ContactServiceImpl"
        scope="session">
        <property name="contactDAO" ref="contactDAOImpl"/>
  </bean>

Spring总是在使用构造函数注入属性之前创建bean,所以不能在注入属性之前使用它们。要解决这个问题,您必须重写逻辑或将contactDAO作为构造函数arg(我知道非常难看的解决方案,但可以工作)

private contactserviceinpl(ContactDAO costrContactDAO){
联系人=新的ArrayList();
//TODO:需要在实例化的同时注入contactDAO
contacts.clear();
试一试{
contacts.addAll(costrContactDAO.getContacts());
}捕获(例外e){
e、 printStackTrace();
}
}

强烈建议搜索其他解决方案(例如,我在我的项目中使用Wicket,还有另一个呈现表的概念-使用DataProviders,所以我不会有这样的问题,可能你可以在JSF项目中使用这个概念)

Spring总是在向构造函数注入属性之前创建bean,所以在注入属性之前不能使用它们。要解决这个问题,您必须重写逻辑或将contactDAO作为构造函数arg(我知道非常难看的解决方案,但可以工作)

private contactserviceinpl(ContactDAO costrContactDAO){
联系人=新的ArrayList();
//TODO:需要在实例化的同时注入contactDAO
contacts.clear();
试一试{
contacts.addAll(costrContactDAO.getContacts());
}捕获(例外e){
e、 printStackTrace();
}
}

强烈建议搜索其他解决方案(例如,我在我的项目中使用Wicket,还有另一个呈现表的概念-使用数据提供程序,所以我不会有这样的问题,可能您可以在JSF项目中使用这个概念)

构造函数注入工作正常。如果我找到另一个解决方案,我会发布。谢谢,你的注射成功了。如果我找到另一个解决方案,我会发布。谢谢
    private ContactServiceImpl(ContactDAO costrContactDAO) {
    contacts = new ArrayList<Contact>();

    //TODO: need to inject contactDAO at the same time as instantiation
    contacts.clear();
    try {
        contacts.addAll( costrContactDAO.getContacts() );
    } catch (Exception e) {
        e.printStackTrace();
    }
  }


  <bean id="contactServiceImpl" class="com.example.service.ContactServiceImpl"
    scope="session">
    <constructor-arg ref="contactDAOImpl"/>
    <property name="contactDAO" ref="contactDAOImpl"/>
  </bean>