Aop.get 小问

package test;

import com.jfinal.aop.Aop;

public class AopTest {

    public void say() {// 系统方法
        IFruit iFruit = Aop.get(IFruit.class);// 这块如果用基类比如BaseFruit就没有问题,如果是interface或者abstract 就会抛abstract class or interface can not be proxied
        //作为系统方法或者插件的话这里一般都会get(接口)这种方式
        if (null == iFruit) {// 否则用默认实现
            iFruit = new Apple();
        }
        iFruit.say();
    }

    public class BaseFruit{
        void say() {
            System.out.println("I am baseFruit");
        }
    }
    
    public interface IFruit {
        void say();
    }

    public static class Apple implements IFruit {
        @Override
        public void say() {
            System.out.println("I am an apple");
        }
    }

    public static class Banana implements IFruit {
        @Override
        public void say() {
            System.out.println("I am a banana");
        }
    }

    public static void main(String[] args) {
        //AopManager.me().addMapping(IFruit.class, Banana.class);
        //AopManager.me().addSingletonObject(IFruit.class, new Banana());
        new AopTest().say();
    }
}

我觉得Aop的职责太多了,生成代理和实例化bean放在一起了,Aop.get(接口)有无判断太重要了(而不是直接报异常),很多plugins需要对外层用户的行为进行选择。

评论区

JFinal

2019-12-20 12:11

目前内部有两个处理机制:
1:通过 addMapping(...) 预先映射,对接口、抽象类进行代理时会去找这个映射
2:通过在 @Inject 注解中给定类型,例如:@Inject(Banan.class)

再加其它方式的干预,或许并不适合,建议你自己尝试改一下这里的设计,希望有更好的方案

谢谢反馈

idreamblue

2019-12-20 12:54

我尝试一下,@Inject的字段时候进行check,框架行为确实应该抛异常;非@Inject行为不抛异常,这又涉及上一次提的“ProxyFactory.get(Class target)是不是返回增强代理类就好“那个提议,因为该异常是在返回增强抛的;我建议还是分开来,既然知道是接口或者抽象类找不到对应映射的话,增强肯定没有意义,在之前进行校验,校验后如果有实现再增强就ok了。

JFinal

2019-12-20 13:00

@idreamblue 在这个贴子里不断追加你的改进代码,我仍然不太知道你讲的方案

idreamblue

2019-12-20 13:00

按照现在JFinal的流程if (injectDependency) {com.jfinal.aop.Aop.inject(controller);}从这里典型的mvc走下去是没有任何问题的,这个流程注入、增强、生成bean可以混在一起的。没有映射肯定跑不起来,因为大部分是Service层的映射,肯定存在;拿到外边来就会有问题,因为你不知道外层或者使用plugin的人是否会addMapping。

热门反馈

扫码入社