2013-04-12 10 views

risposta

1

Un esempio usando un bean Spring post-processore per proxy ogni fagiolo:

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

Grazie per la risposta utile. Sfortunatamente la mia implementazione beanfactory è DefaultListableBeanFactory, quindi non posso usare BeanPostProcessor. – Mangoose

+0

@manish nessun problema, grazie per il controllo indietro! – rees

1

Date un'occhiata a java.lang.reflect.Proxy API. Si noti che consente di creare proxy solo per le interfacce.

+1

Per la headstart: http://java.dzone.com/articles/power-proxies-java –

+0

Ho usato usando il codice java ma non so come passare il proxy ai bean di primavera senza usare le librerie proxy fornite da Spring – Mangoose

+0

@manish per passarle a Spring, creare un FactoryBean Spring che restituisce i proxy. – rees

1

È possibile implementare proxy dinamici o proxy CGLib.

Problemi correlati