从非托管bean访问DAO服务方法

时间:2013-02-28 05:34:47

标签: java spring hibernate managed-bean

我正在使用Spring 3和Hibernate 4

如何在非ManagedBean中使用以下内容

@Inject 
EmployeeService employeeService 

或者,如果我想访问DAO方法,我必须将ManagedBean设为

@Named("mymanagedbean")
@ViewAccessScoped 

我有一些Converter类,为了访问DAO服务方法,我必须将其用作ManagedBean,即使它们不是ManagedBeans。

调用DAO服务方法的最佳方法是什么?

由于

4 个答案:

答案 0 :(得分:1)

您需要实现Spring接口ApplicationContextAware,然后设置ApplicationContext。然后,您需要提供静态方法来获取bean实例。

public class SpringApplicationContext implements ApplicationContextAware {

private static ApplicationContext CONTEXT;

public void setApplicationContext(ApplicationContext context)
        throws BeansException {
    CONTEXT = context;
}
    public static Object getBean(String beanName) { ...}
    public static <T> T getBean(Class<T> arg0) {...}

然后在您的非托管bean中,您可以通过传递SpringApplicationContext.getBean作为参数或bean名称作为参数来调用EmployeeService.class方法。

答案 1 :(得分:1)

如果你想让你的Converter类保持清洁并使用依赖注入(强烈建议这样做以便能够轻松地测试类)而不是类中的类手动依赖,您可以使用Spring的功能来配置在应用程序上下文之外创建的预先存在的对象。请参阅Spring的参考文档here中的相关部分。

答案 2 :(得分:1)

这是一个工作示例(与zagyi的答案相关)。应用程序使用Spring Roo,因此使用了aspectj。

@FacesConverter("example.entity.converter")
@Configurable
public class EntityConverter implements Converter {

    @Resource
    MyDAO dao;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
        String value) {

        Entity obj;

        try {
            obj = dao.getEntity(Long.valueOf(value));
        } catch( NumberFormatException e ) {
            throw new ConverterException( message );
        }
        return obj;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
         Object value) {

        Entity obj = (Entity) value;
        return (obj != null) ? obj.getId().toString() : "";
    }
}

dao类

@Repository("myDAO")
public class MyDAOImpl implements MyDAO {
    ...
}

答案 3 :(得分:0)

我已经设法在Converter中使用@Inject使用以下内容获取DAO方法,并在实现EmployeeService的{​​{1}}类中定义为Interface

@Service(value="employeeService")