jfinal使用注解实现aop,spring ioc容器一体化

/**
 * aop自动注入注解
 * @version 1.0
 * @create_at 2017年7月24日下午9:21:12
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
public @interface AopBean {
}

package com.information.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
public @interface Aop {
    String value() default "";
}

//次注解可配合service层拦截器使用
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE})
@Documented
public @interface Interceptor {
    String value() default "";
    Class<? extends com.jfinal.aop.Interceptor>[] target();
}

/**
 * aop注入插件
 * @version 1.0
 * @create_at 2017年7月25日上午8:14:05
 */
public class AopBeanPlugin<T> implements IPlugin{

    private static final Log LOG=Log.getLog(AopBeanPlugin.class);
        private List<String> beanList=new ArrayList<String>();
    @SuppressWarnings("rawtypes")
    private List<Class> excludeClasses=new ArrayList<Class>();
    private boolean autoScan;
    public AopBeanPlugin<T> setPackageName(String... packageName){
       if(packageName.length==0||packageName==null)
        throw new NullPointerException("packageName can not be null");
        for(String pack:packageName){
          beanList.add(pack);
        }
     return this;
    }
    public boolean isAutoScan() {
         return autoScan;
    }

    @SuppressWarnings("rawtypes")
    public AopBeanPlugin setAutoScan(boolean autoScan) {
        this.autoScan = autoScan;
        return this;
    }
@Override
public boolean start() {
    List<Class<? extends T>> targetClass = PackageUtil.scanPackage(beanList);
        for(Class<? extends T> target:targetClass){
        if(excludeClasses.contains(target)){
             continue;
        }
    Annotation[] annotations = target.getAnnotations();
        if(target.getAnnotations() != null){
        Object object = null;
        String value = null;
        for(Annotation annotation : annotations){
        if(annotation instanceof Aop){
        object= Duang.duang(target.getName(),target);
        value=target.getAnnotation(Aop.class).value();
        }else if(annotation instanceof Interceptor){
        Class<? extends com.jfinal.aop.Interceptor>[] interceptorClass = ((Interceptor) annotation).target();
        value =((Interceptor) annotation).value();
        object = Duang.duang(target.getName(),target,interceptorClass);
        }
    }
    String simpleName=target.getSimpleName().substring(1, target.getSimpleName().length());
    String key=StrKit.toLowerCaseFirst(target.getSimpleName())+simpleName;
    if(object != null){
        if(StrKit.isNotEmpoty(value)){
        AopManger.beanMap.put(value, object);
    }else{
        AopManger.beanMap.put(key, object);
    }
        LOG.info("create aop bean "+object);
   }
}
   continue;
}
     return true;
}

@Override
public boolean stop() {
      return true;
}
public AopBeanPlugin<T> addExcludeClasses(Class<?>... clazzes) {
        if (clazzes != null) {
            for (Class<?> clazz : clazzes) {
                excludeClasses.add(clazz);
            }
        }
        return this;
    }
}

}
/**
 * aop对象注入拦截器
 * @version 1.0
 * @create_at 2017年7月24日下午9:18:12
 */
public class AopInterceptor implements Interceptor{
private  ApplicationContext ctx;
public AopInterceptor(ApplicationContext ctx){
this.ctx = ctx;
}
public AopInterceptor(){}
@Override
public void intercept(Invocation inv) {
Controller controller = inv.getController();
Field[] fields = controller.getClass().getDeclaredFields();
//controller层aop的自动注入
for (Field field : fields) {
Object bean = null;
if (field.isAnnotationPresent(AopBean.class)){
bean = AopManger.beanMap.get(field.getName());
Class<?> cla = field.getType();
//service层aop的自动注入
for(Field f : cla.getDeclaredFields()){
Object serviceBean = null;
if(f.isAnnotationPresent(AopBean.class)){
serviceBean = AopManger.beanMap.get(f.getName());
}else if(f.isAnnotationPresent(Autowired.class)){
serviceBean = ctx.getBean(f.getName());
}
if(serviceBean != null){
try {
f.setAccessible(true);
f.set(bean, serviceBean);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new NullPointerException("Field can not be null");
}
}
}
}else if(field.isAnnotationPresent(Autowired.class)){
bean = ctx.getBean(field.getName());
}else{
continue ;
   }
try {
if (bean != null) {
field.setAccessible(true);
field.set(controller, bean);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
inv.invoke();
}
}

具体使用方式如下
@Aop
public class SystemAdminService extends BaseService{
}

public class LoginController extends BaseController{
    @AopBean
private SystemRoleService systemRoleService;
    
    @Autowired
private OnlineManger onlineManger;
    }
注:(此方法只对controller和service层有效)

评论区

穿越123

2017-09-14 11:36

@Irin.Chan 要不这样,部分代码上传到你的git,你看怎么样

Irin.Chan

2017-09-14 14:24

@穿越123 好,或者你搞一个简单的能跑的demo打包给我也行。

穿越123

2017-09-14 15:03

@Irin.Chan 不过你那个项目我提交不了代码,这样吧,你邮箱给我个,发你邮箱

穿越123

2017-09-18 15:37

@Irin.Chan 完晚上发你,最近有点忙

穿越123

2017-09-18 21:09

Irin.Chan

2017-09-18 21:58

@穿越123 GG,一加入Tx.class,就NPE, 将你的代码重新整理了扔在这里,你看看。https://gitee.com/itc10/jfinal-study/tree/master/ioc-support。 不知道是不是我的使用方式不对?

热门分享

扫码入社