针对项目中采用IBatis+EJB+RCP作为架构,IBatis没有IOC相关的功能,但是系统中可能采用多个数据源和不同的缓存对象,于是自己现实一个简单针对部分对象的的依赖注入功能实现相关的功能。实现思路如下:
在需要注入的类中添加相关的注解,通过EJB的拦截器机制对注解对象进行注入对象。
package com.easyway.inject;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 元数据注解类的应用
* @author longgangbai
* @date 2010-9-7
* @version 1.0
* @since JDK6.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Inject {
/**
* 注解字段的名称
* @return
*/
String fieldName();
}
默认拦截器的类如下:
import java.lang.reflect.Field;
import javax.annotation.PostConstruct;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class InjectorManager {
private static Log log = LogFactory.getLog(InjectorManager.class);
/**
*此处通过PostConstruct对拦截对象是想前置注入
* @param invocation 拦截器上下文
* @return
* @throws Exception
*/
@PostConstruct
//@AroundInvoke
public Object interceptorInjector(InvocationContext invocation)
throws Exception {
log.info("调用注解管理,注入ibatis sqlmapclient和cache!");
try {
Object fromObject = invocation.getTarget();
Field[] fields = fromObject.getClass().getDeclaredFields();
// 获得基类的成员变量
if (fields.length == 0) {
fields = fromObject.getClass().getSuperclass()
.getDeclaredFields();
}
for (Field field : fields) {
field.setAccessible(true);
// 处理ibatis注解
if (field.isAnnotationPresent(MMM.class)) {
//获取MMM的过程
...................................
field.set(fromObject, mmm));
}
// 处理缓存注解
if (field.isAnnotationPresent(XXXXX.class)) {
..................................
}
field.setAccessible(false);
}
return invocation.proceed();
} catch (Exception e) {
e.printStackTrace();
throw new SystemException("");
} finally {
log.info("注入ibatis sqlmapclient和cache完成!");
}
}
}
使用如下:
@Stateless
@Local(GeneralDAO.class)
@Interceptors(InjectorManager.class)
public class IBatisGeneralDAO implements GeneralDAO :
基本代码如上,详细代码忽略。。。O(∩_∩)O哈哈~