|
|
|
@ -26,7 +26,11 @@ import org.springframework.context.ConfigurableApplicationContext;
@@ -26,7 +26,11 @@ import org.springframework.context.ConfigurableApplicationContext;
|
|
|
|
|
import org.springframework.context.annotation.AdviceMode; |
|
|
|
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
|
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
|
import org.springframework.context.annotation.ConditionContext; |
|
|
|
|
import org.springframework.context.annotation.Conditional; |
|
|
|
|
import org.springframework.context.annotation.Configuration; |
|
|
|
|
import org.springframework.context.annotation.ConfigurationCondition; |
|
|
|
|
import org.springframework.core.type.AnnotatedTypeMetadata; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import org.springframework.tests.transaction.CallCountingTransactionManager; |
|
|
|
|
import org.springframework.transaction.PlatformTransactionManager; |
|
|
|
@ -49,7 +53,8 @@ public class EnableTransactionManagementTests {
@@ -49,7 +53,8 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void transactionProxyIsCreated() { |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(EnableTxConfig.class, TxManagerConfig.class); |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( |
|
|
|
|
EnableTxConfig.class, TxManagerConfig.class); |
|
|
|
|
TransactionalTestBean bean = ctx.getBean(TransactionalTestBean.class); |
|
|
|
|
assertTrue("testBean is not a proxy", AopUtils.isAopProxy(bean)); |
|
|
|
|
Map<?,?> services = ctx.getBeansWithAnnotation(Service.class); |
|
|
|
@ -59,7 +64,19 @@ public class EnableTransactionManagementTests {
@@ -59,7 +64,19 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void transactionProxyIsCreatedWithEnableOnSuperclass() { |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(InheritedEnableTxConfig.class, TxManagerConfig.class); |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( |
|
|
|
|
InheritedEnableTxConfig.class, TxManagerConfig.class); |
|
|
|
|
TransactionalTestBean bean = ctx.getBean(TransactionalTestBean.class); |
|
|
|
|
assertTrue("testBean is not a proxy", AopUtils.isAopProxy(bean)); |
|
|
|
|
Map<?,?> services = ctx.getBeansWithAnnotation(Service.class); |
|
|
|
|
assertTrue("Stereotype annotation not visible", services.containsKey("testBean")); |
|
|
|
|
ctx.close(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void transactionProxyIsCreatedWithEnableOnExcludedSuperclass() { |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( |
|
|
|
|
ParentEnableTxConfig.class, ChildEnableTxConfig.class, TxManagerConfig.class); |
|
|
|
|
TransactionalTestBean bean = ctx.getBean(TransactionalTestBean.class); |
|
|
|
|
assertTrue("testBean is not a proxy", AopUtils.isAopProxy(bean)); |
|
|
|
|
Map<?,?> services = ctx.getBeansWithAnnotation(Service.class); |
|
|
|
@ -69,7 +86,8 @@ public class EnableTransactionManagementTests {
@@ -69,7 +86,8 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void txManagerIsResolvedOnInvocationOfTransactionalMethod() { |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(EnableTxConfig.class, TxManagerConfig.class); |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( |
|
|
|
|
EnableTxConfig.class, TxManagerConfig.class); |
|
|
|
|
TransactionalTestBean bean = ctx.getBean(TransactionalTestBean.class); |
|
|
|
|
|
|
|
|
|
// invoke a transactional method, causing the PlatformTransactionManager bean to be resolved.
|
|
|
|
@ -79,7 +97,8 @@ public class EnableTransactionManagementTests {
@@ -79,7 +97,8 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void txManagerIsResolvedCorrectlyWhenMultipleManagersArePresent() { |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(EnableTxConfig.class, MultiTxManagerConfig.class); |
|
|
|
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( |
|
|
|
|
EnableTxConfig.class, MultiTxManagerConfig.class); |
|
|
|
|
TransactionalTestBean bean = ctx.getBean(TransactionalTestBean.class); |
|
|
|
|
|
|
|
|
|
// invoke a transactional method, causing the PlatformTransactionManager bean to be resolved.
|
|
|
|
@ -95,7 +114,7 @@ public class EnableTransactionManagementTests {
@@ -95,7 +114,7 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
@SuppressWarnings("resource") |
|
|
|
|
public void proxyTypeAspectJCausesRegistrationOfAnnotationTransactionAspect() { |
|
|
|
|
try { |
|
|
|
|
new AnnotationConfigApplicationContext(EnableAspectJTxConfig.class, TxManagerConfig.class); |
|
|
|
|
new AnnotationConfigApplicationContext(EnableAspectjTxConfig.class, TxManagerConfig.class); |
|
|
|
|
fail("should have thrown CNFE when trying to load AnnotationTransactionAspect. " + |
|
|
|
|
"Do you actually have org.springframework.aspects on the classpath?"); |
|
|
|
|
} |
|
|
|
@ -137,15 +156,54 @@ public class EnableTransactionManagementTests {
@@ -137,15 +156,54 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
static class EnableTxConfig { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
|
static class InheritedEnableTxConfig extends EnableTxConfig { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
|
@EnableTransactionManagement |
|
|
|
|
@Conditional(NeverCondition.class) |
|
|
|
|
static class ParentEnableTxConfig { |
|
|
|
|
|
|
|
|
|
@Bean |
|
|
|
|
Object someBean() { |
|
|
|
|
return new Object(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
|
static class ChildEnableTxConfig extends ParentEnableTxConfig { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
Object someBean() { |
|
|
|
|
return "X"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static class NeverCondition implements ConfigurationCondition { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public ConfigurationPhase getConfigurationPhase() { |
|
|
|
|
return ConfigurationPhase.REGISTER_BEAN; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
|
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ) |
|
|
|
|
static class EnableAspectJTxConfig { |
|
|
|
|
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ) |
|
|
|
|
static class EnableAspectjTxConfig { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
|
@EnableTransactionManagement |
|
|
|
|
static class Spr11915Config { |
|
|
|
@ -162,6 +220,7 @@ public class EnableTransactionManagementTests {
@@ -162,6 +220,7 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
|
static class TxManagerConfig { |
|
|
|
|
|
|
|
|
@ -174,9 +233,9 @@ public class EnableTransactionManagementTests {
@@ -174,9 +233,9 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
public PlatformTransactionManager txManager() { |
|
|
|
|
return new CallCountingTransactionManager(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration |
|
|
|
|
static class MultiTxManagerConfig extends TxManagerConfig implements TransactionManagementConfigurer { |
|
|
|
|
|
|
|
|
|