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需要对外层用户的行为进行选择。
1:通过 addMapping(...) 预先映射,对接口、抽象类进行代理时会去找这个映射
2:通过在 @Inject 注解中给定类型,例如:@Inject(Banan.class)
再加其它方式的干预,或许并不适合,建议你自己尝试改一下这里的设计,希望有更好的方案
谢谢反馈