Javassist的春天方式

时间:2014-01-07 11:41:21

标签: spring javassist cglib

用Javassist编写的代码片段的Spring方式是什么?我知道Spring正在使用CGLib,但我确信春天世界还有一些有用的良好实践。

ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Dog.class);
factory.setFilter(
        new MethodFilter() {
            @Override
            public boolean isHandled(Method method) {
                return Modifier.isAbstract(method.getModifiers());
            }
        }
    );

MethodHandler handler = new MethodHandler() {
    @Override
    public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
        System.out.println("Handling " + thisMethod + " via the method handler");
        return null;
    }
};

Dog dog = (Dog) factory.create(new Class<?>[0], new Object[0], handler);
dog.bark();
dog.fetch();

产生此输出:

Woof!
Handling public abstract void mock.Dog.fetch() via the method handler

编辑:

目前我正在使用Spring 3.2.x中包含的CGLib Enhancer,我对方便的方法和最佳实践表示怀疑。

编辑:

我不得不说我的代理类不是spring bean。它们不是由Spring管理的。

1 个答案:

答案 0 :(得分:0)

在Spring中你会用Spring AOP做这样的事情。这是一种更高级的方法,根据配置,它使用CGLIB或JDK代理。

以下是一个示例方面:

@Aspect
public class LoggingAspect{

    static final Logger LOG = LoggerFactory.getLogger(LoggingAspect.class);
    @Pointcut("call(* *.*(*)")
    public void methodCall(){}

    @Before("methodCall()")
    public void logMethodCall(Joinpoint jp){
        LOG.debug("About to call method {} with args {}", jp.getSignature(), jp.getArgs());
    }
}

缺点是:这只适用于由Spring管理的对象的公共方法。