+++ title = "spring" draft = false tags = [ "code", "java", "spring" ] date = "2013-03-12" +++ # Spring Wiring ## How to access target object behind proxy bean Zie http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/ ```java @SuppressWarnings("unchecked") protected Type getTargetObject(Object proxy, Class targetClass) { try { if ((AopUtils.isJdkDynamicProxy(proxy))) { return (Type) getTargetObject(((Advised) proxy).getTargetSource().getTarget(), targetClass); } return (Type) proxy; // expected to be cglib proxy then, which is simply a specialized class } catch (Exception ex) { throw new IllegalStateException(ex); } } ``` ## Geen loadtime weaving? Geen probleem. Gebruik de **static springContext accessor** (maar met mate(n) natuurlijk: ```java public class ApplicationContextHolder implements ApplicationContextAware { private static AtomicReference appContext; private static void setContext(ApplicationContext context) { appContext = new AtomicReference(context); } public static final EntityUidGenerator getUidGenerator() { if (appContext ###### null) { throw new IllegalStateException("no context loaded yet!"); } synchronized (appContext) { return appContext.get().getBean(EntityUidGenerator.class); } } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextHolder.setContext(applicationContext); } } ``` Als bean in de `spring-config.xml` zetten en klaar. Expose niet de hele context aub! Dan kan je dit op een entiteit toch nog doen, en overriden voor testen: ```java @VisibleForTesting EntityUidGenerator getEntityUidGenerator() { return ApplicationContextHolder.getUidGenerator(); } ``` ############= JPA/Hibernate ############= ############ PersistenceUnit definiƫren ############ Met een transaction manager: ```xml ``` De datasource kan via JNDI gedefiniƫerd worden dan: ```xml ``` Daarna kan je de `entityManager` injecteren in Java: ```java @PersistenceContext(unitName = "vdab_partnerwerking_pu") protected EntityManager entityManager; ``` ######= Werken zonder een persistence.xml ######= Vanaf **Spring 3.1** en JPA kan je via de factory `packagesToScan` property aangeven ipv via een `persistenceUnitManager` te werken - meer info en context: zie http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/ ```xml ``` Vergeet niet de `unitName` van de `PersistenceContext` annotatie af te halen dan. ############ JPA Annotaties en Hibernate HBMs samen gebruiken ############ Een manier om de Hibernate session factory uit de JPA entity manager te prullen: ```java ((org.hibernate.ejb.HibernateEntityManager) entityManagerFactory.createEntityManager()).getSession().getSessionFactory(); ``` In Spring config: ```xml classpath:/be/y/persistence/mapping/x.hbm ```