如何在不使用spring AOP的情况下创建代理

时间:2013-04-12 11:10:08

标签: java spring aop

我的服务器没有弹簧AOP罐,我无法添加它们。 Spring版本是2.0.6。

我想在我的5项服务中使用代理。

最好的方法是什么

3 个答案:

答案 0 :(得分:1)

查看java.lang.reflect.Proxy API。请注意,它允许仅为接口创建代理。

答案 1 :(得分:1)

您可以实施动态代理或CGLib代理。

答案 2 :(得分:1)

使用Spring bean后处理器代理每个bean的示例:

public class ProxifyingPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {

        Class beanClass = bean.getClass();

        if (Proxy.isProxyClass(beanClass)) {
            return bean;
        }

        List<Class<?>> interfaceList = getAllInterfaces(beanClass);
        Class[] interfaces = (interfaceList.toArray(new Class[interfaceList.size()]));

        return Proxy.newProxyInstance(beanClass.getClassLoader(), interfaces, new InvocationHandler() {

            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                return method.invoke(bean, objects);
            }

        });
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    private List<Class<?>> getAllInterfaces(Class<?> cls) {
        if (cls == null) {
            return null;
        }
        LinkedHashSet<Class<?>> interfacesFound = new LinkedHashSet<Class<?>>();
        getAllInterfaces(cls, interfacesFound);
        return new ArrayList<Class<?>>(interfacesFound);
    }

    private void getAllInterfaces(Class<?> cls, HashSet<Class<?>> interfacesFound) {
        while (cls != null) {
            Class<?>[] interfaces = cls.getInterfaces();
            for (Class<?> i : interfaces) {
                if (interfacesFound.add(i)) {
                    getAllInterfaces(i, interfacesFound);
                }
            }
            cls = cls.getSuperclass();
        }
    }
}