package com.github.signed.sandbox.spring.ioc.proxies; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.ResourceTransactionManager; import static org.hamcrest.MatcherAssert.assertThat; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class ProxiesForBeansFromProducerMethod { @Configuration @EnableTransactionManagement public static class Config { @Bean public Protocol protocol() { return new GhostProtocol(); } @Bean public PlatformTransactionManager platformTransactionManager(){ return new ResourceTransactionManager() { @Override public Object getResourceFactory() { return null; } @Override public TransactionStatus getTransaction(TransactionDefinition transactionDefinition) throws TransactionException { return null; } @Override public void commit(TransactionStatus transactionStatus) throws TransactionException { } @Override public void rollback(TransactionStatus transactionStatus) throws TransactionException { } }; } } public interface Protocol { void invoke(); } public static class GhostProtocol implements Protocol { @Override @Transactional public void invoke() { System.out.println("ghost activated"); } } @Autowired private Protocol protocol; @Test public void springCanProxyObjectsEvenIfTheyWhereNotInstantiatedBySpring() throws Exception { protocol.invoke(); assertThat("expected the transaction proxy", AopUtils.isJdkDynamicProxy(protocol)); } }