Browse Source

Polishing

pull/26515/head
Juergen Hoeller 5 years ago
parent
commit
b6677ccbff
  1. 7
      spring-aop/src/main/java/org/springframework/aop/config/AdviceEntry.java
  2. 5
      spring-aop/src/main/java/org/springframework/aop/config/AdvisorEntry.java
  3. 5
      spring-aop/src/main/java/org/springframework/aop/config/AspectEntry.java
  4. 6
      spring-aop/src/main/java/org/springframework/aop/config/PointcutEntry.java
  5. 6
      spring-beans/src/main/java/org/springframework/beans/factory/parsing/BeanEntry.java
  6. 30
      spring-beans/src/main/java/org/springframework/beans/factory/parsing/ParseState.java
  7. 8
      spring-beans/src/main/java/org/springframework/beans/factory/parsing/PropertyEntry.java
  8. 11
      spring-beans/src/main/java/org/springframework/beans/factory/parsing/QualifierEntry.java
  9. 5
      spring-beans/src/main/java/org/springframework/beans/factory/support/ReplaceOverride.java
  10. 14
      spring-context/src/test/java/org/springframework/tests/mock/jndi/SimpleNamingContext.java
  11. 2
      spring-core/src/main/java/org/springframework/util/FastByteArrayOutputStream.java
  12. 12
      spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java
  13. 4
      spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/MutablePersistenceUnitInfo.java
  14. 14
      spring-test/src/main/java/org/springframework/mock/jndi/SimpleNamingContext.java
  15. 30
      spring-test/src/main/java/org/springframework/test/context/support/AbstractGenericContextLoader.java
  16. 10
      spring-tx/src/main/java/org/springframework/transaction/config/TxAdviceBeanDefinitionParser.java

7
spring-aop/src/main/java/org/springframework/aop/config/AdviceEntry.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -30,13 +30,14 @@ public class AdviceEntry implements ParseState.Entry {
/** /**
* Creates a new instance of the {@link AdviceEntry} class. * Create a new {@code AdviceEntry} instance.
* @param kind the kind of advice represented by this entry (before, after, around, etc.) * @param kind the kind of advice represented by this entry (before, after, around)
*/ */
public AdviceEntry(String kind) { public AdviceEntry(String kind) {
this.kind = kind; this.kind = kind;
} }
@Override @Override
public String toString() { public String toString() {
return "Advice (" + this.kind + ")"; return "Advice (" + this.kind + ")";

5
spring-aop/src/main/java/org/springframework/aop/config/AdvisorEntry.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -30,13 +30,14 @@ public class AdvisorEntry implements ParseState.Entry {
/** /**
* Creates a new instance of the {@link AdvisorEntry} class. * Create a new {@code AdvisorEntry} instance.
* @param name the bean name of the advisor * @param name the bean name of the advisor
*/ */
public AdvisorEntry(String name) { public AdvisorEntry(String name) {
this.name = name; this.name = name;
} }
@Override @Override
public String toString() { public String toString() {
return "Advisor '" + this.name + "'"; return "Advisor '" + this.name + "'";

5
spring-aop/src/main/java/org/springframework/aop/config/AspectEntry.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2007 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -34,7 +34,7 @@ public class AspectEntry implements ParseState.Entry {
/** /**
* Create a new AspectEntry. * Create a new {@code AspectEntry} instance.
* @param id the id of the aspect element * @param id the id of the aspect element
* @param ref the bean name referenced by this aspect element * @param ref the bean name referenced by this aspect element
*/ */
@ -43,6 +43,7 @@ public class AspectEntry implements ParseState.Entry {
this.ref = ref; this.ref = ref;
} }
@Override @Override
public String toString() { public String toString() {
return "Aspect: " + (StringUtils.hasLength(this.id) ? "id='" + this.id + "'" : "ref='" + this.ref + "'"); return "Aspect: " + (StringUtils.hasLength(this.id) ? "id='" + this.id + "'" : "ref='" + this.ref + "'");

6
spring-aop/src/main/java/org/springframework/aop/config/PointcutEntry.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -28,14 +28,16 @@ public class PointcutEntry implements ParseState.Entry {
private final String name; private final String name;
/** /**
* Creates a new instance of the {@link PointcutEntry} class. * Create a new {@code PointcutEntry} instance.
* @param name the bean name of the pointcut * @param name the bean name of the pointcut
*/ */
public PointcutEntry(String name) { public PointcutEntry(String name) {
this.name = name; this.name = name;
} }
@Override @Override
public String toString() { public String toString() {
return "Pointcut '" + this.name + "'"; return "Pointcut '" + this.name + "'";

6
spring-beans/src/main/java/org/springframework/beans/factory/parsing/BeanEntry.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2006 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -24,11 +24,11 @@ package org.springframework.beans.factory.parsing;
*/ */
public class BeanEntry implements ParseState.Entry { public class BeanEntry implements ParseState.Entry {
private String beanDefinitionName; private final String beanDefinitionName;
/** /**
* Creates a new instance of {@link BeanEntry} class. * Create a new {@code BeanEntry} instance.
* @param beanDefinitionName the name of the associated bean definition * @param beanDefinitionName the name of the associated bean definition
*/ */
public BeanEntry(String beanDefinitionName) { public BeanEntry(String beanDefinitionName) {

30
spring-beans/src/main/java/org/springframework/beans/factory/parsing/ParseState.java

@ -20,23 +20,17 @@ import java.util.Stack;
/** /**
* Simple {@link Stack}-based structure for tracking the logical position during * Simple {@link Stack}-based structure for tracking the logical position during
* a parsing process. {@link Entry entries} are added to the stack at * a parsing process. {@link Entry entries} are added to the stack at each point
* each point during the parse phase in a reader-specific manner. * during the parse phase in a reader-specific manner.
* *
* <p>Calling {@link #toString()} will render a tree-style view of the current logical * <p>Calling {@link #toString()} will render a tree-style view of the current logical
* position in the parse phase. This representation is intended for use in * position in the parse phase. This representation is intended for use in error messages.
* error messages.
* *
* @author Rob Harrop * @author Rob Harrop
* @since 2.0 * @since 2.0
*/ */
public final class ParseState { public final class ParseState {
/**
* Tab character used when rendering the tree-style representation.
*/
private static final char TAB = '\t';
/** /**
* Internal {@link Stack} storage. * Internal {@link Stack} storage.
*/ */
@ -51,7 +45,7 @@ public final class ParseState {
} }
/** /**
* Create a new {@code ParseState} whose {@link Stack} is a {@link Object#clone clone} * Create a new {@code ParseState} whose {@link Stack} is a clone
* of that of the passed in {@code ParseState}. * of that of the passed in {@code ParseState}.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -79,7 +73,7 @@ public final class ParseState {
* {@code null} if the {@link Stack} is empty. * {@code null} if the {@link Stack} is empty.
*/ */
public Entry peek() { public Entry peek() {
return this.state.empty() ? null : this.state.peek(); return (this.state.empty() ? null : this.state.peek());
} }
/** /**
@ -96,16 +90,18 @@ public final class ParseState {
*/ */
@Override @Override
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder(64);
for (int x = 0; x < this.state.size(); x++) { int i = 0;
if (x > 0) { for (ParseState.Entry entry : this.state) {
if (i > 0) {
sb.append('\n'); sb.append('\n');
for (int y = 0; y < x; y++) { for (int j = 0; j < i; j++) {
sb.append(TAB); sb.append('\t');
} }
sb.append("-> "); sb.append("-> ");
} }
sb.append(this.state.get(x)); sb.append(entry);
i++;
} }
return sb.toString(); return sb.toString();
} }

8
spring-beans/src/main/java/org/springframework/beans/factory/parsing/PropertyEntry.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -30,14 +30,12 @@ public class PropertyEntry implements ParseState.Entry {
/** /**
* Creates a new instance of the {@link PropertyEntry} class. * Create a new {@code PropertyEntry} instance.
* @param name the name of the JavaBean property represented by this instance * @param name the name of the JavaBean property represented by this instance
* @throws IllegalArgumentException if the supplied {@code name} is {@code null}
* or consists wholly of whitespace
*/ */
public PropertyEntry(String name) { public PropertyEntry(String name) {
if (!StringUtils.hasText(name)) { if (!StringUtils.hasText(name)) {
throw new IllegalArgumentException("Invalid property name '" + name + "'."); throw new IllegalArgumentException("Invalid property name '" + name + "'");
} }
this.name = name; this.name = name;
} }

11
spring-beans/src/main/java/org/springframework/beans/factory/parsing/QualifierEntry.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -26,16 +26,21 @@ import org.springframework.util.StringUtils;
*/ */
public class QualifierEntry implements ParseState.Entry { public class QualifierEntry implements ParseState.Entry {
private String typeName; private final String typeName;
/**
* Create a new {@code QualifierEntry} instance.
* @param typeName the name of the qualifier type
*/
public QualifierEntry(String typeName) { public QualifierEntry(String typeName) {
if (!StringUtils.hasText(typeName)) { if (!StringUtils.hasText(typeName)) {
throw new IllegalArgumentException("Invalid qualifier type '" + typeName + "'."); throw new IllegalArgumentException("Invalid qualifier type '" + typeName + "'");
} }
this.typeName = typeName; this.typeName = typeName;
} }
@Override @Override
public String toString() { public String toString() {
return "Qualifier '" + this.typeName + "'"; return "Qualifier '" + this.typeName + "'";

5
spring-beans/src/main/java/org/springframework/beans/factory/support/ReplaceOverride.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2019 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -38,7 +38,7 @@ public class ReplaceOverride extends MethodOverride {
private final String methodReplacerBeanName; private final String methodReplacerBeanName;
private List<String> typeIdentifiers = new LinkedList<String>(); private final List<String> typeIdentifiers = new LinkedList<String>();
/** /**
@ -69,6 +69,7 @@ public class ReplaceOverride extends MethodOverride {
this.typeIdentifiers.add(identifier); this.typeIdentifiers.add(identifier);
} }
@Override @Override
public boolean matches(Method method) { public boolean matches(Method method) {
if (!method.getName().equals(getMethodName())) { if (!method.getName().equals(getMethodName())) {

14
spring-context/src/test/java/org/springframework/tests/mock/jndi/SimpleNamingContext.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -119,7 +119,7 @@ public class SimpleNamingContext implements Context {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Static JNDI lookup: [" + name + "]"); logger.debug("Static JNDI lookup: [" + name + "]");
} }
if ("".equals(name)) { if (name.isEmpty()) {
return new SimpleNamingContext(this.root, this.boundObjects, this.environment); return new SimpleNamingContext(this.root, this.boundObjects, this.environment);
} }
Object found = this.boundObjects.get(name); Object found = this.boundObjects.get(name);
@ -293,12 +293,12 @@ public class SimpleNamingContext implements Context {
} }
private static abstract class AbstractNamingEnumeration<T> implements NamingEnumeration<T> { private abstract static class AbstractNamingEnumeration<T> implements NamingEnumeration<T> {
private Iterator<T> iterator; private final Iterator<T> iterator;
private AbstractNamingEnumeration(SimpleNamingContext context, String proot) throws NamingException { private AbstractNamingEnumeration(SimpleNamingContext context, String proot) throws NamingException {
if (!"".equals(proot) && !proot.endsWith("/")) { if (!proot.isEmpty() && !proot.endsWith("/")) {
proot = proot + "/"; proot = proot + "/";
} }
String root = context.root + proot; String root = context.root + proot;
@ -353,7 +353,7 @@ public class SimpleNamingContext implements Context {
} }
private static class NameClassPairEnumeration extends AbstractNamingEnumeration<NameClassPair> { private static final class NameClassPairEnumeration extends AbstractNamingEnumeration<NameClassPair> {
private NameClassPairEnumeration(SimpleNamingContext context, String root) throws NamingException { private NameClassPairEnumeration(SimpleNamingContext context, String root) throws NamingException {
super(context, root); super(context, root);
@ -366,7 +366,7 @@ public class SimpleNamingContext implements Context {
} }
private static class BindingEnumeration extends AbstractNamingEnumeration<Binding> { private static final class BindingEnumeration extends AbstractNamingEnumeration<Binding> {
private BindingEnumeration(SimpleNamingContext context, String root) throws NamingException { private BindingEnumeration(SimpleNamingContext context, String root) throws NamingException {
super(context, root); super(context, root);

2
spring-core/src/main/java/org/springframework/util/FastByteArrayOutputStream.java

@ -292,7 +292,7 @@ public class FastByteArrayOutputStream extends OutputStream {
} }
/** /**
* Create a new buffer and store it in the LinkedList * Create a new buffer and store it in the LinkedList.
* <p>Adds a new buffer that can store at least {@code minCapacity} bytes. * <p>Adds a new buffer that can store at least {@code minCapacity} bytes.
*/ */
private void addBuffer(int minCapacity) { private void addBuffer(int minCapacity) {

12
spring-jms/src/main/java/org/springframework/jms/config/JmsListenerContainerParser.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -64,10 +64,10 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
String containerType = containerEle.getAttribute(CONTAINER_TYPE_ATTRIBUTE); String containerType = containerEle.getAttribute(CONTAINER_TYPE_ATTRIBUTE);
String containerClass = containerEle.getAttribute(CONTAINER_CLASS_ATTRIBUTE); String containerClass = containerEle.getAttribute(CONTAINER_CLASS_ATTRIBUTE);
if (!"".equals(containerClass)) { if (StringUtils.hasLength(containerClass)) {
return null; // Not supported return null; // not supported
} }
else if ("".equals(containerType) || containerType.startsWith("default")) { else if (!StringUtils.hasLength(containerType) || containerType.startsWith("default")) {
factoryDef.setBeanClassName("org.springframework.jms.config.DefaultJmsListenerContainerFactory"); factoryDef.setBeanClassName("org.springframework.jms.config.DefaultJmsListenerContainerFactory");
} }
else if (containerType.startsWith("simple")) { else if (containerType.startsWith("simple")) {
@ -91,10 +91,10 @@ class JmsListenerContainerParser extends AbstractListenerContainerParser {
String containerType = containerEle.getAttribute(CONTAINER_TYPE_ATTRIBUTE); String containerType = containerEle.getAttribute(CONTAINER_TYPE_ATTRIBUTE);
String containerClass = containerEle.getAttribute(CONTAINER_CLASS_ATTRIBUTE); String containerClass = containerEle.getAttribute(CONTAINER_CLASS_ATTRIBUTE);
if (!"".equals(containerClass)) { if (StringUtils.hasLength(containerClass)) {
containerDef.setBeanClassName(containerClass); containerDef.setBeanClassName(containerClass);
} }
else if ("".equals(containerType) || containerType.startsWith("default")) { else if (!StringUtils.hasLength(containerType) || containerType.startsWith("default")) {
containerDef.setBeanClassName("org.springframework.jms.listener.DefaultMessageListenerContainer"); containerDef.setBeanClassName("org.springframework.jms.listener.DefaultMessageListenerContainer");
} }
else if (containerType.startsWith("simple")) { else if (containerType.startsWith("simple")) {

4
spring-orm/src/main/java/org/springframework/orm/jpa/persistenceunit/MutablePersistenceUnitInfo.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -55,7 +55,7 @@ public class MutablePersistenceUnitInfo implements SmartPersistenceUnitInfo {
private final List<String> mappingFileNames = new LinkedList<String>(); private final List<String> mappingFileNames = new LinkedList<String>();
private List<URL> jarFileUrls = new LinkedList<URL>(); private final List<URL> jarFileUrls = new LinkedList<URL>();
private URL persistenceUnitRootUrl; private URL persistenceUnitRootUrl;

14
spring-test/src/main/java/org/springframework/mock/jndi/SimpleNamingContext.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -119,7 +119,7 @@ public class SimpleNamingContext implements Context {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Static JNDI lookup: [" + name + "]"); logger.debug("Static JNDI lookup: [" + name + "]");
} }
if ("".equals(name)) { if (name.isEmpty()) {
return new SimpleNamingContext(this.root, this.boundObjects, this.environment); return new SimpleNamingContext(this.root, this.boundObjects, this.environment);
} }
Object found = this.boundObjects.get(name); Object found = this.boundObjects.get(name);
@ -293,12 +293,12 @@ public class SimpleNamingContext implements Context {
} }
private static abstract class AbstractNamingEnumeration<T> implements NamingEnumeration<T> { private abstract static class AbstractNamingEnumeration<T> implements NamingEnumeration<T> {
private Iterator<T> iterator; private final Iterator<T> iterator;
private AbstractNamingEnumeration(SimpleNamingContext context, String proot) throws NamingException { private AbstractNamingEnumeration(SimpleNamingContext context, String proot) throws NamingException {
if (!"".equals(proot) && !proot.endsWith("/")) { if (!proot.isEmpty() && !proot.endsWith("/")) {
proot = proot + "/"; proot = proot + "/";
} }
String root = context.root + proot; String root = context.root + proot;
@ -353,7 +353,7 @@ public class SimpleNamingContext implements Context {
} }
private static class NameClassPairEnumeration extends AbstractNamingEnumeration<NameClassPair> { private static final class NameClassPairEnumeration extends AbstractNamingEnumeration<NameClassPair> {
private NameClassPairEnumeration(SimpleNamingContext context, String root) throws NamingException { private NameClassPairEnumeration(SimpleNamingContext context, String root) throws NamingException {
super(context, root); super(context, root);
@ -366,7 +366,7 @@ public class SimpleNamingContext implements Context {
} }
private static class BindingEnumeration extends AbstractNamingEnumeration<Binding> { private static final class BindingEnumeration extends AbstractNamingEnumeration<Binding> {
private BindingEnumeration(SimpleNamingContext context, String root) throws NamingException { private BindingEnumeration(SimpleNamingContext context, String root) throws NamingException {
super(context, root); super(context, root);

30
spring-test/src/main/java/org/springframework/test/context/support/AbstractGenericContextLoader.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2014 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -64,9 +64,7 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
/** /**
* Load a Spring ApplicationContext from the supplied {@link MergedContextConfiguration}. * Load a Spring ApplicationContext from the supplied {@link MergedContextConfiguration}.
*
* <p>Implementation details: * <p>Implementation details:
*
* <ul> * <ul>
* <li>Calls {@link #validateMergedContextConfiguration(MergedContextConfiguration)} * <li>Calls {@link #validateMergedContextConfiguration(MergedContextConfiguration)}
* to allow subclasses to validate the supplied configuration before proceeding.</li> * to allow subclasses to validate the supplied configuration before proceeding.</li>
@ -97,7 +95,6 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
* <li>{@link ConfigurableApplicationContext#refresh Refreshes} the * <li>{@link ConfigurableApplicationContext#refresh Refreshes} the
* context and registers a JVM shutdown hook for it.</li> * context and registers a JVM shutdown hook for it.</li>
* </ul> * </ul>
*
* @return a new application context * @return a new application context
* @see org.springframework.test.context.SmartContextLoader#loadContext(MergedContextConfiguration) * @see org.springframework.test.context.SmartContextLoader#loadContext(MergedContextConfiguration)
* @see GenericApplicationContext * @see GenericApplicationContext
@ -107,7 +104,7 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
public final ConfigurableApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception { public final ConfigurableApplicationContext loadContext(MergedContextConfiguration mergedConfig) throws Exception {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug(String.format("Loading ApplicationContext for merged context configuration [%s].", logger.debug(String.format("Loading ApplicationContext for merged context configuration [%s].",
mergedConfig)); mergedConfig));
} }
validateMergedContextConfiguration(mergedConfig); validateMergedContextConfiguration(mergedConfig);
@ -118,6 +115,7 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
if (parent != null) { if (parent != null) {
context.setParent(parent); context.setParent(parent);
} }
prepareContext(context); prepareContext(context);
prepareContext(context, mergedConfig); prepareContext(context, mergedConfig);
customizeBeanFactory(context.getDefaultListableBeanFactory()); customizeBeanFactory(context.getDefaultListableBeanFactory());
@ -125,8 +123,10 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
customizeContext(context); customizeContext(context);
customizeContext(context, mergedConfig); customizeContext(context, mergedConfig);
context.refresh(); context.refresh();
context.registerShutdownHook(); context.registerShutdownHook();
return context; return context;
} }
@ -146,9 +146,7 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
/** /**
* Load a Spring ApplicationContext from the supplied {@code locations}. * Load a Spring ApplicationContext from the supplied {@code locations}.
*
* <p>Implementation details: * <p>Implementation details:
*
* <ul> * <ul>
* <li>Creates a {@link GenericApplicationContext} instance.</li> * <li>Creates a {@link GenericApplicationContext} instance.</li>
* <li>Calls {@link #prepareContext(GenericApplicationContext)} to allow for customizing the context * <li>Calls {@link #prepareContext(GenericApplicationContext)} to allow for customizing the context
@ -166,12 +164,10 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
* <li>{@link ConfigurableApplicationContext#refresh Refreshes} the * <li>{@link ConfigurableApplicationContext#refresh Refreshes} the
* context and registers a JVM shutdown hook for it.</li> * context and registers a JVM shutdown hook for it.</li>
* </ul> * </ul>
*
* <p><b>Note</b>: this method does not provide a means to set active bean definition * <p><b>Note</b>: this method does not provide a means to set active bean definition
* profiles for the loaded context. See {@link #loadContext(MergedContextConfiguration)} * profiles for the loaded context. See {@link #loadContext(MergedContextConfiguration)}
* and {@link AbstractContextLoader#prepareContext(ConfigurableApplicationContext, MergedContextConfiguration)} * and {@link AbstractContextLoader#prepareContext(ConfigurableApplicationContext, MergedContextConfiguration)}
* for an alternative. * for an alternative.
*
* @return a new application context * @return a new application context
* @see org.springframework.test.context.ContextLoader#loadContext * @see org.springframework.test.context.ContextLoader#loadContext
* @see GenericApplicationContext * @see GenericApplicationContext
@ -182,26 +178,28 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
public final ConfigurableApplicationContext loadContext(String... locations) throws Exception { public final ConfigurableApplicationContext loadContext(String... locations) throws Exception {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug(String.format("Loading ApplicationContext for locations [%s].", logger.debug(String.format("Loading ApplicationContext for locations [%s].",
StringUtils.arrayToCommaDelimitedString(locations))); StringUtils.arrayToCommaDelimitedString(locations)));
} }
GenericApplicationContext context = new GenericApplicationContext(); GenericApplicationContext context = new GenericApplicationContext();
prepareContext(context); prepareContext(context);
customizeBeanFactory(context.getDefaultListableBeanFactory()); customizeBeanFactory(context.getDefaultListableBeanFactory());
createBeanDefinitionReader(context).loadBeanDefinitions(locations); createBeanDefinitionReader(context).loadBeanDefinitions(locations);
AnnotationConfigUtils.registerAnnotationConfigProcessors(context); AnnotationConfigUtils.registerAnnotationConfigProcessors(context);
customizeContext(context); customizeContext(context);
context.refresh(); context.refresh();
context.registerShutdownHook(); context.registerShutdownHook();
return context; return context;
} }
/** /**
* Prepare the {@link GenericApplicationContext} created by this {@code ContextLoader}. * Prepare the {@link GenericApplicationContext} created by this {@code ContextLoader}.
* Called <i>before</i> bean definitions are read. * Called <i>before</i> bean definitions are read.
*
* <p>The default implementation is empty. Can be overridden in subclasses to * <p>The default implementation is empty. Can be overridden in subclasses to
* customize {@code GenericApplicationContext}'s standard settings. * customize {@code GenericApplicationContext}'s standard settings.
*
* @param context the context that should be prepared * @param context the context that should be prepared
* @see #loadContext(MergedContextConfiguration) * @see #loadContext(MergedContextConfiguration)
* @see #loadContext(String...) * @see #loadContext(String...)
@ -217,10 +215,8 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
/** /**
* Customize the internal bean factory of the ApplicationContext created by * Customize the internal bean factory of the ApplicationContext created by
* this {@code ContextLoader}. * this {@code ContextLoader}.
*
* <p>The default implementation is empty but can be overridden in subclasses * <p>The default implementation is empty but can be overridden in subclasses
* to customize {@code DefaultListableBeanFactory}'s standard settings. * to customize {@code DefaultListableBeanFactory}'s standard settings.
*
* @param beanFactory the bean factory created by this {@code ContextLoader} * @param beanFactory the bean factory created by this {@code ContextLoader}
* @see #loadContext(MergedContextConfiguration) * @see #loadContext(MergedContextConfiguration)
* @see #loadContext(String...) * @see #loadContext(String...)
@ -236,18 +232,15 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
/** /**
* Load bean definitions into the supplied {@link GenericApplicationContext context} * Load bean definitions into the supplied {@link GenericApplicationContext context}
* from the locations or classes in the supplied {@code MergedContextConfiguration}. * from the locations or classes in the supplied {@code MergedContextConfiguration}.
*
* <p>The default implementation delegates to the {@link BeanDefinitionReader} * <p>The default implementation delegates to the {@link BeanDefinitionReader}
* returned by {@link #createBeanDefinitionReader(GenericApplicationContext)} to * returned by {@link #createBeanDefinitionReader(GenericApplicationContext)} to
* {@link BeanDefinitionReader#loadBeanDefinitions(String) load} the * {@link BeanDefinitionReader#loadBeanDefinitions(String) load} the
* bean definitions. * bean definitions.
*
* <p>Subclasses must provide an appropriate implementation of * <p>Subclasses must provide an appropriate implementation of
* {@link #createBeanDefinitionReader(GenericApplicationContext)}. Alternatively subclasses * {@link #createBeanDefinitionReader(GenericApplicationContext)}. Alternatively subclasses
* may provide a <em>no-op</em> implementation of {@code createBeanDefinitionReader()} * may provide a <em>no-op</em> implementation of {@code createBeanDefinitionReader()}
* and override this method to provide a custom strategy for loading or * and override this method to provide a custom strategy for loading or
* registering bean definitions. * registering bean definitions.
*
* @param context the context into which the bean definitions should be loaded * @param context the context into which the bean definitions should be loaded
* @param mergedConfig the merged context configuration * @param mergedConfig the merged context configuration
* @see #loadContext(MergedContextConfiguration) * @see #loadContext(MergedContextConfiguration)
@ -260,7 +253,6 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
/** /**
* Factory method for creating a new {@link BeanDefinitionReader} for loading * Factory method for creating a new {@link BeanDefinitionReader} for loading
* bean definitions into the supplied {@link GenericApplicationContext context}. * bean definitions into the supplied {@link GenericApplicationContext context}.
*
* @param context the context for which the {@code BeanDefinitionReader} * @param context the context for which the {@code BeanDefinitionReader}
* should be created * should be created
* @return a {@code BeanDefinitionReader} for the supplied context * @return a {@code BeanDefinitionReader} for the supplied context
@ -275,10 +267,8 @@ public abstract class AbstractGenericContextLoader extends AbstractContextLoader
* Customize the {@link GenericApplicationContext} created by this * Customize the {@link GenericApplicationContext} created by this
* {@code ContextLoader} <i>after</i> bean definitions have been * {@code ContextLoader} <i>after</i> bean definitions have been
* loaded into the context but <i>before</i> the context is refreshed. * loaded into the context but <i>before</i> the context is refreshed.
*
* <p>The default implementation is empty but can be overridden in subclasses * <p>The default implementation is empty but can be overridden in subclasses
* to customize the application context. * to customize the application context.
*
* @param context the newly created application context * @param context the newly created application context
* @see #loadContext(MergedContextConfiguration) * @see #loadContext(MergedContextConfiguration)
* @see #loadContext(String...) * @see #loadContext(String...)

10
spring-tx/src/main/java/org/springframework/transaction/config/TxAdviceBeanDefinitionParser.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2020 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -96,7 +96,7 @@ class TxAdviceBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
private RootBeanDefinition parseAttributeSource(Element attrEle, ParserContext parserContext) { private RootBeanDefinition parseAttributeSource(Element attrEle, ParserContext parserContext) {
List<Element> methods = DomUtils.getChildElementsByTagName(attrEle, METHOD_ELEMENT); List<Element> methods = DomUtils.getChildElementsByTagName(attrEle, METHOD_ELEMENT);
ManagedMap<TypedStringValue, RuleBasedTransactionAttribute> transactionAttributeMap = ManagedMap<TypedStringValue, RuleBasedTransactionAttribute> transactionAttributeMap =
new ManagedMap<TypedStringValue, RuleBasedTransactionAttribute>(methods.size()); new ManagedMap<TypedStringValue, RuleBasedTransactionAttribute>(methods.size());
transactionAttributeMap.setSource(parserContext.extractSource(attrEle)); transactionAttributeMap.setSource(parserContext.extractSource(attrEle));
for (Element methodEle : methods) { for (Element methodEle : methods) {
@ -124,17 +124,17 @@ class TxAdviceBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
} }
} }
if (StringUtils.hasText(readOnly)) { if (StringUtils.hasText(readOnly)) {
attribute.setReadOnly(Boolean.valueOf(methodEle.getAttribute(READ_ONLY_ATTRIBUTE))); attribute.setReadOnly(Boolean.parseBoolean(methodEle.getAttribute(READ_ONLY_ATTRIBUTE)));
} }
List<RollbackRuleAttribute> rollbackRules = new LinkedList<RollbackRuleAttribute>(); List<RollbackRuleAttribute> rollbackRules = new LinkedList<RollbackRuleAttribute>();
if (methodEle.hasAttribute(ROLLBACK_FOR_ATTRIBUTE)) { if (methodEle.hasAttribute(ROLLBACK_FOR_ATTRIBUTE)) {
String rollbackForValue = methodEle.getAttribute(ROLLBACK_FOR_ATTRIBUTE); String rollbackForValue = methodEle.getAttribute(ROLLBACK_FOR_ATTRIBUTE);
addRollbackRuleAttributesTo(rollbackRules,rollbackForValue); addRollbackRuleAttributesTo(rollbackRules, rollbackForValue);
} }
if (methodEle.hasAttribute(NO_ROLLBACK_FOR_ATTRIBUTE)) { if (methodEle.hasAttribute(NO_ROLLBACK_FOR_ATTRIBUTE)) {
String noRollbackForValue = methodEle.getAttribute(NO_ROLLBACK_FOR_ATTRIBUTE); String noRollbackForValue = methodEle.getAttribute(NO_ROLLBACK_FOR_ATTRIBUTE);
addNoRollbackRuleAttributesTo(rollbackRules,noRollbackForValue); addNoRollbackRuleAttributesTo(rollbackRules, noRollbackForValue);
} }
attribute.setRollbackRules(rollbackRules); attribute.setRollbackRules(rollbackRules);

Loading…
Cancel
Save