提交 d1a34b9a 编写于 作者: J Juergen Hoeller

Polishing

上级 ace2e623
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 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.
...@@ -328,10 +328,11 @@ class CglibAopProxy implements AopProxy, Serializable { ...@@ -328,10 +328,11 @@ class CglibAopProxy implements AopProxy, Serializable {
// TODO: small memory optimization here (can skip creation for methods with no advice) // TODO: small memory optimization here (can skip creation for methods with no advice)
for (int x = 0; x < methods.length; x++) { for (int x = 0; x < methods.length; x++) {
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(methods[x], rootClass); Method method = methods[x];
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, rootClass);
fixedCallbacks[x] = new FixedChainStaticTargetInterceptor( fixedCallbacks[x] = new FixedChainStaticTargetInterceptor(
chain, this.advised.getTargetSource().getTarget(), this.advised.getTargetClass()); chain, this.advised.getTargetSource().getTarget(), this.advised.getTargetClass());
this.fixedInterceptorMap.put(methods[x].toString(), x); this.fixedInterceptorMap.put(methods.toString(), x);
} }
// Now copy both the callbacks from mainCallbacks // Now copy both the callbacks from mainCallbacks
...@@ -614,8 +615,8 @@ class CglibAopProxy implements AopProxy, Serializable { ...@@ -614,8 +615,8 @@ class CglibAopProxy implements AopProxy, Serializable {
@Override @Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
MethodInvocation invocation = new CglibMethodInvocation(proxy, this.target, method, args, MethodInvocation invocation = new CglibMethodInvocation(
this.targetClass, this.adviceChain, methodProxy); proxy, this.target, method, args, this.targetClass, this.adviceChain, methodProxy);
// If we get here, we need to create a MethodInvocation. // If we get here, we need to create a MethodInvocation.
Object retVal = invocation.proceed(); Object retVal = invocation.proceed();
retVal = processReturnType(proxy, this.target, method, retVal); retVal = processReturnType(proxy, this.target, method, retVal);
...@@ -783,7 +784,7 @@ class CglibAopProxy implements AopProxy, Serializable { ...@@ -783,7 +784,7 @@ class CglibAopProxy implements AopProxy, Serializable {
* <dt>For advised methods:</dt> * <dt>For advised methods:</dt>
* <dd>If the target is static and the advice chain is frozen then a * <dd>If the target is static and the advice chain is frozen then a
* FixedChainStaticTargetInterceptor specific to the method is used to * FixedChainStaticTargetInterceptor specific to the method is used to
* invoke the advice chain. Otherwise a DyanmicAdvisedInterceptor is * invoke the advice chain. Otherwise a DynamicAdvisedInterceptor is
* used.</dd> * used.</dd>
* <dt>For non-advised methods:</dt> * <dt>For non-advised methods:</dt>
* <dd>Where it can be determined that the method will not return {@code this} * <dd>Where it can be determined that the method will not return {@code this}
......
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2019 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.
...@@ -152,7 +152,7 @@ public class ReflectiveMethodInvocation implements ProxyMethodInvocation, Clonea ...@@ -152,7 +152,7 @@ public class ReflectiveMethodInvocation implements ProxyMethodInvocation, Clonea
@Override @Override
public Object proceed() throws Throwable { public Object proceed() throws Throwable {
// We start with an index of -1 and increment early. // We start with an index of -1 and increment early.
if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) { if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
return invokeJoinpoint(); return invokeJoinpoint();
} }
......
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2019 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,12 +24,15 @@ import org.springframework.aop.Pointcut; ...@@ -24,12 +24,15 @@ import org.springframework.aop.Pointcut;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* Convenient class for building up pointcuts. All methods return * Convenient class for building up pointcuts.
* ComposablePointcut, so we can use a concise idiom like:
* *
* {@code * <p>All methods return {@code ComposablePointcut}, so we can use concise idioms
* Pointcut pc = new ComposablePointcut().union(classFilter).intersection(methodMatcher).intersection(pointcut); * like in the following example.
* } *
* <pre class="code">Pointcut pc = new ComposablePointcut()
* .union(classFilter)
* .intersection(methodMatcher)
* .intersection(pointcut);</pre>
* *
* @author Rod Johnson * @author Rod Johnson
* @author Juergen Hoeller * @author Juergen Hoeller
...@@ -199,7 +202,7 @@ public class ComposablePointcut implements Pointcut, Serializable { ...@@ -199,7 +202,7 @@ public class ComposablePointcut implements Pointcut, Serializable {
@Override @Override
public String toString() { public String toString() {
return "ComposablePointcut: " + this.classFilter + ", " +this.methodMatcher; return "ComposablePointcut: " + this.classFilter + ", " + this.methodMatcher;
} }
} }
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 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 @@ import org.springframework.util.ClassUtils; ...@@ -38,7 +38,7 @@ import org.springframework.util.ClassUtils;
* @author Juergen Hoeller * @author Juergen Hoeller
* @since 11.11.2003 * @since 11.11.2003
*/ */
@SuppressWarnings({"serial" }) @SuppressWarnings("serial")
public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFilter, Ordered, Serializable { public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFilter, Ordered, Serializable {
private final Advice advice; private final Advice advice;
...@@ -81,25 +81,25 @@ public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFil ...@@ -81,25 +81,25 @@ public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFil
/** /**
* Create a DefaultIntroductionAdvisor for the given advice. * Create a DefaultIntroductionAdvisor for the given advice.
* @param advice the Advice to apply * @param advice the Advice to apply
* @param intf the interface to introduce * @param ifc the interface to introduce
*/ */
public DefaultIntroductionAdvisor(DynamicIntroductionAdvice advice, Class<?> intf) { public DefaultIntroductionAdvisor(DynamicIntroductionAdvice advice, Class<?> ifc) {
Assert.notNull(advice, "Advice must not be null"); Assert.notNull(advice, "Advice must not be null");
this.advice = advice; this.advice = advice;
addInterface(intf); addInterface(ifc);
} }
/** /**
* Add the specified interface to the list of interfaces to introduce. * Add the specified interface to the list of interfaces to introduce.
* @param intf the interface to introduce * @param ifc the interface to introduce
*/ */
public void addInterface(Class<?> intf) { public void addInterface(Class<?> ifc) {
Assert.notNull(intf, "Interface must not be null"); Assert.notNull(ifc, "Interface must not be null");
if (!intf.isInterface()) { if (!ifc.isInterface()) {
throw new IllegalArgumentException("Specified class [" + intf.getName() + "] must be an interface"); throw new IllegalArgumentException("Specified class [" + ifc.getName() + "] must be an interface");
} }
this.interfaces.add(intf); this.interfaces.add(ifc);
} }
@Override @Override
...@@ -112,8 +112,8 @@ public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFil ...@@ -112,8 +112,8 @@ public class DefaultIntroductionAdvisor implements IntroductionAdvisor, ClassFil
for (Class<?> ifc : this.interfaces) { for (Class<?> ifc : this.interfaces) {
if (this.advice instanceof DynamicIntroductionAdvice && if (this.advice instanceof DynamicIntroductionAdvice &&
!((DynamicIntroductionAdvice) this.advice).implementsInterface(ifc)) { !((DynamicIntroductionAdvice) this.advice).implementsInterface(ifc)) {
throw new IllegalArgumentException("DynamicIntroductionAdvice [" + this.advice + "] " + throw new IllegalArgumentException("DynamicIntroductionAdvice [" + this.advice + "] " +
"does not implement interface [" + ifc.getName() + "] specified for introduction"); "does not implement interface [" + ifc.getName() + "] specified for introduction");
} }
} }
} }
......
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2019 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,8 +26,9 @@ import org.springframework.util.ObjectUtils; ...@@ -26,8 +26,9 @@ import org.springframework.util.ObjectUtils;
import org.springframework.util.PatternMatchUtils; import org.springframework.util.PatternMatchUtils;
/** /**
* Pointcut bean for simple method name matches, as alternative to regexp patterns. * Pointcut bean for simple method name matches, as an alternative to regexp patterns.
* Does not handle overloaded methods: all methods with a given name will be eligible. *
* <p>Does not handle overloaded methods: all methods with a given name will be eligible.
* *
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Rod Johnson * @author Rod Johnson
......
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2019 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,7 +26,8 @@ import org.springframework.util.Assert; ...@@ -26,7 +26,8 @@ import org.springframework.util.Assert;
/** /**
* Pointcut constants for matching getters and setters, * Pointcut constants for matching getters and setters,
* and static methods useful for manipulating and evaluating pointcuts. * and static methods useful for manipulating and evaluating pointcuts.
* These methods are particularly useful for composing pointcuts *
* <p>These methods are particularly useful for composing pointcuts
* using the union and intersection methods. * using the union and intersection methods.
* *
* @author Rod Johnson * @author Rod Johnson
......
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2019 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.
...@@ -61,7 +61,7 @@ public class AnnotationMatchingPointcut implements Pointcut { ...@@ -61,7 +61,7 @@ public class AnnotationMatchingPointcut implements Pointcut {
} }
/** /**
* Create a new AnnotationMatchingPointcut for the given annotation type. * Create a new AnnotationMatchingPointcut for the given annotation types.
* @param classAnnotationType the annotation type to look for at the class level * @param classAnnotationType the annotation type to look for at the class level
* (can be {@code null}) * (can be {@code null})
* @param methodAnnotationType the annotation type to look for at the method level * @param methodAnnotationType the annotation type to look for at the method level
...@@ -119,7 +119,7 @@ public class AnnotationMatchingPointcut implements Pointcut { ...@@ -119,7 +119,7 @@ public class AnnotationMatchingPointcut implements Pointcut {
@Override @Override
public String toString() { public String toString() {
return "AnnotationMatchingPointcut: " + this.classFilter + ", " +this.methodMatcher; return "AnnotationMatchingPointcut: " + this.classFilter + ", " + this.methodMatcher;
} }
......
/* /*
* Copyright 2002-2018 the original author or authors. * Copyright 2002-2019 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.
...@@ -141,9 +141,10 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean ...@@ -141,9 +141,10 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
/** /**
* Create a new AutowiredAnnotationBeanPostProcessor * Create a new {@code AutowiredAnnotationBeanPostProcessor} for Spring's
* for Spring's standard {@link Autowired} annotation. * standard {@link Autowired @Autowired} annotation.
* <p>Also supports JSR-330's {@link javax.inject.Inject} annotation, if available. * <p>Also supports JSR-330's {@link javax.inject.Inject @Inject} annotation,
* if available.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public AutowiredAnnotationBeanPostProcessor() { public AutowiredAnnotationBeanPostProcessor() {
...@@ -239,7 +240,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean ...@@ -239,7 +240,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, final String beanName) public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, final String beanName)
throws BeanCreationException { throws BeanCreationException {
// Let's check for lookup methods here.. // Let's check for lookup methods here...
if (!this.lookupMethodsChecked.contains(beanName)) { if (!this.lookupMethodsChecked.contains(beanName)) {
try { try {
ReflectionUtils.doWithMethods(beanClass, new ReflectionUtils.MethodCallback() { ReflectionUtils.doWithMethods(beanClass, new ReflectionUtils.MethodCallback() {
...@@ -249,7 +250,8 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean ...@@ -249,7 +250,8 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
if (lookup != null) { if (lookup != null) {
LookupOverride override = new LookupOverride(method, lookup.value()); LookupOverride override = new LookupOverride(method, lookup.value());
try { try {
RootBeanDefinition mbd = (RootBeanDefinition) beanFactory.getMergedBeanDefinition(beanName); RootBeanDefinition mbd = (RootBeanDefinition)
beanFactory.getMergedBeanDefinition(beanName);
mbd.getMethodOverrides().addOverride(override); mbd.getMethodOverrides().addOverride(override);
} }
catch (NoSuchBeanDefinitionException ex) { catch (NoSuchBeanDefinitionException ex) {
......
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2019 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.
...@@ -246,7 +246,7 @@ public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationSt ...@@ -246,7 +246,7 @@ public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationSt
public int accept(Method method) { public int accept(Method method) {
MethodOverride methodOverride = getBeanDefinition().getMethodOverrides().getOverride(method); MethodOverride methodOverride = getBeanDefinition().getMethodOverrides().getOverride(method);
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Override for '" + method.getName() + "' is [" + methodOverride + "]"); logger.trace("MethodOverride for " + method + ": " + methodOverride);
} }
if (methodOverride == null) { if (methodOverride == null) {
return PASSTHROUGH; return PASSTHROUGH;
......
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2019 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.
...@@ -121,7 +121,6 @@ public class MethodOverrides { ...@@ -121,7 +121,6 @@ public class MethodOverrides {
} }
MethodOverrides that = (MethodOverrides) other; MethodOverrides that = (MethodOverrides) other;
return this.overrides.equals(that.overrides); return this.overrides.equals(that.overrides);
} }
@Override @Override
......
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2019 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.
...@@ -25,6 +25,7 @@ import java.util.Set; ...@@ -25,6 +25,7 @@ import java.util.Set;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServerHttpResponse;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
/** /**
...@@ -39,7 +40,7 @@ public class SseEmitter extends ResponseBodyEmitter { ...@@ -39,7 +40,7 @@ public class SseEmitter extends ResponseBodyEmitter {
static final MediaType TEXT_PLAIN = new MediaType("text", "plain", Charset.forName("UTF-8")); static final MediaType TEXT_PLAIN = new MediaType("text", "plain", Charset.forName("UTF-8"));
static final MediaType UTF8_TEXT_EVENTSTREAM = new MediaType("text", "event-stream", Charset.forName("UTF-8")); static final MediaType TEXT_EVENTSTREAM = new MediaType("text", "event-stream", Charset.forName("UTF-8"));
/** /**
...@@ -68,7 +69,7 @@ public class SseEmitter extends ResponseBodyEmitter { ...@@ -68,7 +69,7 @@ public class SseEmitter extends ResponseBodyEmitter {
HttpHeaders headers = outputMessage.getHeaders(); HttpHeaders headers = outputMessage.getHeaders();
if (headers.getContentType() == null) { if (headers.getContentType() == null) {
headers.setContentType(UTF8_TEXT_EVENTSTREAM); headers.setContentType(TEXT_EVENTSTREAM);
} }
} }
...@@ -112,7 +113,6 @@ public class SseEmitter extends ResponseBodyEmitter { ...@@ -112,7 +113,6 @@ public class SseEmitter extends ResponseBodyEmitter {
* Send an SSE event prepared with the given builder. For example: * Send an SSE event prepared with the given builder. For example:
* <pre> * <pre>
* // static import of SseEmitter * // static import of SseEmitter
*
* SseEmitter emitter = new SseEmitter(); * SseEmitter emitter = new SseEmitter();
* emitter.send(event().name("update").id("1").data(myObject)); * emitter.send(event().name("update").id("1").data(myObject));
* </pre> * </pre>
...@@ -128,6 +128,11 @@ public class SseEmitter extends ResponseBodyEmitter { ...@@ -128,6 +128,11 @@ public class SseEmitter extends ResponseBodyEmitter {
} }
} }
@Override
public String toString() {
return "SseEmitter@" + ObjectUtils.getIdentityHexString(this);
}
public static SseEventBuilder event() { public static SseEventBuilder event() {
return new SseEventBuilderImpl(); return new SseEventBuilderImpl();
...@@ -140,9 +145,9 @@ public class SseEmitter extends ResponseBodyEmitter { ...@@ -140,9 +145,9 @@ public class SseEmitter extends ResponseBodyEmitter {
public interface SseEventBuilder { public interface SseEventBuilder {
/** /**
* Add an SSE "comment" line. * Add an SSE "id" line.
*/ */
SseEventBuilder comment(String comment); SseEventBuilder id(String id);
/** /**
* Add an SSE "event" line. * Add an SSE "event" line.
...@@ -150,14 +155,14 @@ public class SseEmitter extends ResponseBodyEmitter { ...@@ -150,14 +155,14 @@ public class SseEmitter extends ResponseBodyEmitter {
SseEventBuilder name(String eventName); SseEventBuilder name(String eventName);
/** /**
* Add an SSE "id" line. * Add an SSE "retry" line.
*/ */
SseEventBuilder id(String id); SseEventBuilder reconnectTime(long reconnectTimeMillis);
/** /**
* Add an SSE "event" line. * Add an SSE "comment" line.
*/ */
SseEventBuilder reconnectTime(long reconnectTimeMillis); SseEventBuilder comment(String comment);
/** /**
* Add an SSE "data" line. * Add an SSE "data" line.
...@@ -188,8 +193,8 @@ public class SseEmitter extends ResponseBodyEmitter { ...@@ -188,8 +193,8 @@ public class SseEmitter extends ResponseBodyEmitter {
private StringBuilder sb; private StringBuilder sb;
@Override @Override
public SseEventBuilder comment(String comment) { public SseEventBuilder id(String id) {
append(":").append(comment != null ? comment : "").append("\n"); append("id:").append(id != null ? id : "").append("\n");
return this; return this;
} }
...@@ -200,14 +205,14 @@ public class SseEmitter extends ResponseBodyEmitter { ...@@ -200,14 +205,14 @@ public class SseEmitter extends ResponseBodyEmitter {
} }
@Override @Override
public SseEventBuilder id(String id) { public SseEventBuilder reconnectTime(long reconnectTimeMillis) {
append("id:").append(id != null ? id : "").append("\n"); append("retry:").append(String.valueOf(reconnectTimeMillis)).append("\n");
return this; return this;
} }
@Override @Override
public SseEventBuilder reconnectTime(long reconnectTimeMillis) { public SseEventBuilder comment(String comment) {
append("retry:").append(String.valueOf(reconnectTimeMillis)).append("\n"); append(":").append(comment != null ? comment : "").append("\n");
return this; return this;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册