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)
再加其它方式的干预,或许并不适合,建议你自己尝试改一下这里的设计,希望有更好的方案
谢谢反馈