|
|
|
|
@@ -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 {
|
|
|
|
|
|
|
|
|
|
@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 {
|
|
|
|
|
|
|
|
|
|
@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 {
|
|
|
|
|
|
|
|
|
|
@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 {
|
|
|
|
|
|
|
|
|
|
@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 {
|
|
|
|
|
@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 {
|
|
|
|
|
static class EnableTxConfig {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
static class InheritedEnableTxConfig extends EnableTxConfig {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
|
|
|
|
|
static class EnableAspectJTxConfig {
|
|
|
|
|
@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 {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
@EnableTransactionManagement
|
|
|
|
|
static class Spr11915Config {
|
|
|
|
|
@@ -162,6 +220,7 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
static class TxManagerConfig {
|
|
|
|
|
|
|
|
|
|
@@ -174,9 +233,9 @@ public class EnableTransactionManagementTests {
|
|
|
|
|
public PlatformTransactionManager txManager() {
|
|
|
|
|
return new CallCountingTransactionManager();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Configuration
|
|
|
|
|
static class MultiTxManagerConfig extends TxManagerConfig implements TransactionManagementConfigurer {
|
|
|
|
|
|
|
|
|
|
|