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