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

7

我的服务器没有spring AOP的jar包,也无法添加。Spring版本为2.0.6。

我想为我的5个服务使用代理。

怎样是最好的实现方式?

3个回答

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();
        }
    }
}

感谢rees提供的有用答案。不幸的是,我的beanfactory实现是DefaultListableBeanFactory,因此我无法使用BeanPostProcessor。 - Mangoose

1

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


我已经使用Java代码使用它们,但是我不知道如何在不使用Spring提供的代理库的情况下将代理传递给Spring Bean。 - Mangoose
@manish 要将它们传递给Spring,请创建一个返回代理的Spring FactoryBean。 - rees
@manish 实际上那是我想的一个愚蠢的主意。只需使用BeanPostProcessor为所有bean返回代理即可。 - rees

1
你可以实现动态代理或CGLib代理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接