Skip to content

Commit f243abb

Browse files
committed
Merge branch '6.2.x'
2 parents ba312f6 + 320831b commit f243abb

File tree

3 files changed

+194
-98
lines changed

3 files changed

+194
-98
lines changed

spring-context/src/test/java/org/springframework/aop/aspectj/autoproxy/AspectJAutoProxyCreatorTests.java

+31-30
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class AspectJAutoProxyCreatorTests {
8585
void aspectsAreApplied() {
8686
ClassPathXmlApplicationContext bf = newContext("aspects.xml");
8787

88-
ITestBean tb = (ITestBean) bf.getBean("adrian");
88+
ITestBean tb = bf.getBean("adrian", ITestBean.class);
8989
assertThat(tb.getAge()).isEqualTo(68);
9090
MethodInvokingFactoryBean factoryBean = (MethodInvokingFactoryBean) bf.getBean("&factoryBean");
9191
assertThat(AopUtils.isAopProxy(factoryBean.getTargetObject())).isTrue();
@@ -96,7 +96,7 @@ void aspectsAreApplied() {
9696
void multipleAspectsWithParameterApplied() {
9797
ClassPathXmlApplicationContext bf = newContext("aspects.xml");
9898

99-
ITestBean tb = (ITestBean) bf.getBean("adrian");
99+
ITestBean tb = bf.getBean("adrian", ITestBean.class);
100100
tb.setAge(10);
101101
assertThat(tb.getAge()).isEqualTo(20);
102102
}
@@ -105,16 +105,16 @@ void multipleAspectsWithParameterApplied() {
105105
void aspectsAreAppliedInDefinedOrder() {
106106
ClassPathXmlApplicationContext bf = newContext("aspectsWithOrdering.xml");
107107

108-
ITestBean tb = (ITestBean) bf.getBean("adrian");
108+
ITestBean tb = bf.getBean("adrian", ITestBean.class);
109109
assertThat(tb.getAge()).isEqualTo(71);
110110
}
111111

112112
@Test
113113
void aspectsAndAdvisorAreApplied() {
114114
ClassPathXmlApplicationContext ac = newContext("aspectsPlusAdvisor.xml");
115115

116-
ITestBean shouldBeWeaved = (ITestBean) ac.getBean("adrian");
117-
doTestAspectsAndAdvisorAreApplied(ac, shouldBeWeaved);
116+
ITestBean shouldBeWoven = ac.getBean("adrian", ITestBean.class);
117+
assertAspectsAndAdvisorAreApplied(ac, shouldBeWoven);
118118
}
119119

120120
@Test
@@ -124,20 +124,22 @@ void aspectsAndAdvisorAreAppliedEvenIfComingFromParentFactory() {
124124
GenericApplicationContext childAc = new GenericApplicationContext(ac);
125125
// Create a child factory with a bean that should be woven
126126
RootBeanDefinition bd = new RootBeanDefinition(TestBean.class);
127-
bd.getPropertyValues().addPropertyValue(new PropertyValue("name", "Adrian"))
127+
bd.getPropertyValues()
128+
.addPropertyValue(new PropertyValue("name", "Adrian"))
128129
.addPropertyValue(new PropertyValue("age", 34));
129130
childAc.registerBeanDefinition("adrian2", bd);
130131
// Register the advisor auto proxy creator with subclass
131-
childAc.registerBeanDefinition(AnnotationAwareAspectJAutoProxyCreator.class.getName(), new RootBeanDefinition(
132-
AnnotationAwareAspectJAutoProxyCreator.class));
132+
childAc.registerBeanDefinition(AnnotationAwareAspectJAutoProxyCreator.class.getName(),
133+
new RootBeanDefinition(AnnotationAwareAspectJAutoProxyCreator.class));
133134
childAc.refresh();
134135

135-
ITestBean beanFromChildContextThatShouldBeWeaved = (ITestBean) childAc.getBean("adrian2");
136-
//testAspectsAndAdvisorAreApplied(childAc, (ITestBean) ac.getBean("adrian"));
137-
doTestAspectsAndAdvisorAreApplied(childAc, beanFromChildContextThatShouldBeWeaved);
136+
ITestBean beanFromParentContextThatShouldBeWoven = ac.getBean("adrian", ITestBean.class);
137+
ITestBean beanFromChildContextThatShouldBeWoven = childAc.getBean("adrian2", ITestBean.class);
138+
assertAspectsAndAdvisorAreApplied(childAc, beanFromParentContextThatShouldBeWoven);
139+
assertAspectsAndAdvisorAreApplied(childAc, beanFromChildContextThatShouldBeWoven);
138140
}
139141

140-
protected void doTestAspectsAndAdvisorAreApplied(ApplicationContext ac, ITestBean shouldBeWeaved) {
142+
protected void assertAspectsAndAdvisorAreApplied(ApplicationContext ac, ITestBean shouldBeWoven) {
141143
TestBeanAdvisor tba = (TestBeanAdvisor) ac.getBean("advisor");
142144

143145
MultiplyReturnValue mrv = (MultiplyReturnValue) ac.getBean("aspect");
@@ -146,10 +148,10 @@ protected void doTestAspectsAndAdvisorAreApplied(ApplicationContext ac, ITestBea
146148
tba.count = 0;
147149
mrv.invocations = 0;
148150

149-
assertThat(AopUtils.isAopProxy(shouldBeWeaved)).as("Autoproxying must apply from @AspectJ aspect").isTrue();
150-
assertThat(shouldBeWeaved.getName()).isEqualTo("Adrian");
151+
assertThat(AopUtils.isAopProxy(shouldBeWoven)).as("Autoproxying must apply from @AspectJ aspect").isTrue();
152+
assertThat(shouldBeWoven.getName()).isEqualTo("Adrian");
151153
assertThat(mrv.invocations).isEqualTo(0);
152-
assertThat(shouldBeWeaved.getAge()).isEqualTo((34 * mrv.getMultiple()));
154+
assertThat(shouldBeWoven.getAge()).isEqualTo((34 * mrv.getMultiple()));
153155
assertThat(tba.count).as("Spring advisor must be invoked").isEqualTo(2);
154156
assertThat(mrv.invocations).as("Must be able to hold state in aspect").isEqualTo(1);
155157
}
@@ -158,13 +160,13 @@ protected void doTestAspectsAndAdvisorAreApplied(ApplicationContext ac, ITestBea
158160
void perThisAspect() {
159161
ClassPathXmlApplicationContext bf = newContext("perthis.xml");
160162

161-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
163+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
162164
assertThat(AopUtils.isAopProxy(adrian1)).isTrue();
163165

164166
assertThat(adrian1.getAge()).isEqualTo(0);
165167
assertThat(adrian1.getAge()).isEqualTo(1);
166168

167-
ITestBean adrian2 = (ITestBean) bf.getBean("adrian");
169+
ITestBean adrian2 = bf.getBean("adrian", ITestBean.class);
168170
assertThat(adrian2).isNotSameAs(adrian1);
169171
assertThat(AopUtils.isAopProxy(adrian1)).isTrue();
170172
assertThat(adrian2.getAge()).isEqualTo(0);
@@ -178,7 +180,7 @@ void perThisAspect() {
178180
void perTargetAspect() throws SecurityException, NoSuchMethodException {
179181
ClassPathXmlApplicationContext bf = newContext("pertarget.xml");
180182

181-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
183+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
182184
assertThat(AopUtils.isAopProxy(adrian1)).isTrue();
183185

184186
// Does not trigger advice or count
@@ -199,7 +201,7 @@ void perTargetAspect() throws SecurityException, NoSuchMethodException {
199201
adrian1.setName("Adrian");
200202
//assertEquals("Any other setter does not increment", 2, adrian1.getAge());
201203

202-
ITestBean adrian2 = (ITestBean) bf.getBean("adrian");
204+
ITestBean adrian2 = bf.getBean("adrian", ITestBean.class);
203205
assertThat(adrian2).isNotSameAs(adrian1);
204206
assertThat(AopUtils.isAopProxy(adrian1)).isTrue();
205207
assertThat(adrian2.getAge()).isEqualTo(34);
@@ -239,17 +241,17 @@ void cglibProxyClassIsCachedAcrossApplicationContextsForPerTargetAspect() {
239241
void twoAdviceAspect() {
240242
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspect.xml");
241243

242-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
244+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
243245
testAgeAspect(adrian1, 0, 2);
244246
}
245247

246248
@Test
247249
void twoAdviceAspectSingleton() {
248250
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspectSingleton.xml");
249251

250-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
252+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
251253
testAgeAspect(adrian1, 0, 1);
252-
ITestBean adrian2 = (ITestBean) bf.getBean("adrian");
254+
ITestBean adrian2 = bf.getBean("adrian", ITestBean.class);
253255
assertThat(adrian2).isNotSameAs(adrian1);
254256
testAgeAspect(adrian2, 2, 1);
255257
}
@@ -258,9 +260,9 @@ void twoAdviceAspectSingleton() {
258260
void twoAdviceAspectPrototype() {
259261
ClassPathXmlApplicationContext bf = newContext("twoAdviceAspectPrototype.xml");
260262

261-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
263+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
262264
testAgeAspect(adrian1, 0, 1);
263-
ITestBean adrian2 = (ITestBean) bf.getBean("adrian");
265+
ITestBean adrian2 = bf.getBean("adrian", ITestBean.class);
264266
assertThat(adrian2).isNotSameAs(adrian1);
265267
testAgeAspect(adrian2, 0, 1);
266268
}
@@ -280,7 +282,7 @@ private void testAgeAspect(ITestBean adrian, int start, int increment) {
280282
void adviceUsingJoinPoint() {
281283
ClassPathXmlApplicationContext bf = newContext("usesJoinPointAspect.xml");
282284

283-
ITestBean adrian1 = (ITestBean) bf.getBean("adrian");
285+
ITestBean adrian1 = bf.getBean("adrian", ITestBean.class);
284286
adrian1.getAge();
285287
AdviceUsingThisJoinPoint aspectInstance = (AdviceUsingThisJoinPoint) bf.getBean("aspect");
286288
//(AdviceUsingThisJoinPoint) Aspects.aspectOf(AdviceUsingThisJoinPoint.class);
@@ -292,7 +294,7 @@ void adviceUsingJoinPoint() {
292294
void includeMechanism() {
293295
ClassPathXmlApplicationContext bf = newContext("usesInclude.xml");
294296

295-
ITestBean adrian = (ITestBean) bf.getBean("adrian");
297+
ITestBean adrian = bf.getBean("adrian", ITestBean.class);
296298
assertThat(AopUtils.isAopProxy(adrian)).isTrue();
297299
assertThat(adrian.getAge()).isEqualTo(68);
298300
}
@@ -310,7 +312,7 @@ void forceProxyTargetClass() {
310312
void withAbstractFactoryBeanAreApplied() {
311313
ClassPathXmlApplicationContext bf = newContext("aspectsWithAbstractBean.xml");
312314

313-
ITestBean adrian = (ITestBean) bf.getBean("adrian");
315+
ITestBean adrian = bf.getBean("adrian", ITestBean.class);
314316
assertThat(AopUtils.isAopProxy(adrian)).isTrue();
315317
assertThat(adrian.getAge()).isEqualTo(68);
316318
}
@@ -321,8 +323,7 @@ void retryAspect() {
321323

322324
UnreliableBean bean = (UnreliableBean) bf.getBean("unreliableBean");
323325
RetryAspect aspect = (RetryAspect) bf.getBean("retryAspect");
324-
int attempts = bean.unreliable();
325-
assertThat(attempts).isEqualTo(2);
326+
assertThat(bean.unreliable()).isEqualTo(2);
326327
assertThat(aspect.getBeginCalls()).isEqualTo(2);
327328
assertThat(aspect.getRollbackCalls()).isEqualTo(1);
328329
assertThat(aspect.getCommitCalls()).isEqualTo(1);
@@ -332,7 +333,7 @@ void retryAspect() {
332333
void withBeanNameAutoProxyCreator() {
333334
ClassPathXmlApplicationContext bf = newContext("withBeanNameAutoProxyCreator.xml");
334335

335-
ITestBean tb = (ITestBean) bf.getBean("adrian");
336+
ITestBean tb = bf.getBean("adrian", ITestBean.class);
336337
assertThat(tb.getAge()).isEqualTo(68);
337338
}
338339

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
* Copyright 2002-2024 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.aop.framework.autoproxy;
18+
19+
import java.lang.reflect.Method;
20+
21+
import org.aopalliance.aop.Advice;
22+
import org.aopalliance.intercept.MethodInterceptor;
23+
import org.junit.jupiter.api.Test;
24+
25+
import org.springframework.aop.Pointcut;
26+
import org.springframework.aop.support.AbstractPointcutAdvisor;
27+
import org.springframework.aop.support.RootClassFilter;
28+
import org.springframework.aop.support.StaticMethodMatcherPointcut;
29+
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
30+
31+
import static org.assertj.core.api.Assertions.assertThat;
32+
33+
/**
34+
* Integration tests for {@link DefaultAdvisorAutoProxyCreator}.
35+
*
36+
* @author Sam Brannen
37+
* @since 6.2.1
38+
*/
39+
class DefaultAdvisorAutoProxyCreatorTests {
40+
41+
/**
42+
* Indirectly tests behavior of {@link org.springframework.aop.framework.AdvisedSupport.MethodCacheKey}.
43+
* @see StaticMethodMatcherPointcut#matches(Method, Class)
44+
*/
45+
@Test // gh-33915
46+
void staticMethodMatcherPointcutMatchesMethodIsInvokedAgainForActualMethodInvocation() {
47+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
48+
DemoBean.class, DemoPointcutAdvisor.class, DefaultAdvisorAutoProxyCreator.class);
49+
DemoPointcutAdvisor demoPointcutAdvisor = context.getBean(DemoPointcutAdvisor.class);
50+
DemoBean demoBean = context.getBean(DemoBean.class);
51+
52+
assertThat(demoPointcutAdvisor.matchesInvocationCount).as("matches() invocations before").isEqualTo(2);
53+
assertThat(demoBean.sayHello()).isEqualTo("Advised: Hello!");
54+
assertThat(demoPointcutAdvisor.matchesInvocationCount).as("matches() invocations after").isEqualTo(3);
55+
56+
context.close();
57+
}
58+
59+
60+
static class DemoBean {
61+
62+
public String sayHello() {
63+
return "Hello!";
64+
}
65+
}
66+
67+
@SuppressWarnings("serial")
68+
static class DemoPointcutAdvisor extends AbstractPointcutAdvisor {
69+
70+
int matchesInvocationCount = 0;
71+
72+
@Override
73+
public Pointcut getPointcut() {
74+
StaticMethodMatcherPointcut pointcut = new StaticMethodMatcherPointcut() {
75+
76+
@Override
77+
public boolean matches(Method method, Class<?> targetClass) {
78+
if (method.getName().equals("sayHello")) {
79+
matchesInvocationCount++;
80+
return true;
81+
}
82+
return false;
83+
}
84+
};
85+
pointcut.setClassFilter(new RootClassFilter(DemoBean.class));
86+
return pointcut;
87+
}
88+
89+
@Override
90+
public Advice getAdvice() {
91+
return (MethodInterceptor) invocation -> "Advised: " + invocation.proceed();
92+
}
93+
}
94+
95+
}

0 commit comments

Comments
 (0)