我正在使用Spring 3和Hibernate 4
如何在非ManagedBean中使用以下内容
@Inject
EmployeeService employeeService
或者,如果我想访问DAO方法,我必须将ManagedBean设为
@Named("mymanagedbean")
@ViewAccessScoped
我有一些Converter
类,为了访问DAO
服务方法,我必须将其用作ManagedBean,即使它们不是ManagedBeans。
调用DAO
服务方法的最佳方法是什么?
由于
答案 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")