An example of using the Spring bean post processor for a proxy server every 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(); } } }
source share