Skip to content

Commit 0115fcc

Browse files
author
Dmitry Zinkevich
committed
Create example with Spring stereotype annotations
- Use component scanning for loading bean definitions - Use Spring stereotypes to define poincuts
1 parent 1ef53e2 commit 0115fcc

File tree

6 files changed

+171
-0
lines changed

6 files changed

+171
-0
lines changed

spring-mvc-java/pom.xml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,38 @@
3838
<scope>runtime</scope>
3939
</dependency>
4040

41+
<!-- AOP -->
42+
<dependency>
43+
<groupId>org.springframework</groupId>
44+
<artifactId>spring-aop</artifactId>
45+
<version>${org.springframework.version}</version>
46+
</dependency>
47+
48+
<dependency>
49+
<groupId>org.aspectj</groupId>
50+
<artifactId>aspectjrt</artifactId>
51+
<version>${aspectj.version}</version>
52+
</dependency>
53+
54+
<dependency>
55+
<groupId>org.aspectj</groupId>
56+
<artifactId>aspectjweaver</artifactId>
57+
<version>${aspectj.version}</version>
58+
</dependency>
59+
60+
<!-- logging -->
61+
<dependency>
62+
<groupId>org.slf4j</groupId>
63+
<artifactId>slf4j-api</artifactId>
64+
<version>${org.slf4j.version}</version>
65+
</dependency>
66+
67+
<dependency>
68+
<groupId>org.slf4j</groupId>
69+
<artifactId>slf4j-log4j12</artifactId>
70+
<version>${org.slf4j.version}</version>
71+
</dependency>
72+
4173
<!-- test scoped -->
4274

4375
<dependency>
@@ -67,6 +99,13 @@
6799
<scope>test</scope>
68100
</dependency>
69101

102+
<dependency>
103+
<groupId>org.springframework</groupId>
104+
<artifactId>spring-test</artifactId>
105+
<version>${org.springframework.version}</version>
106+
<scope>test</scope>
107+
</dependency>
108+
70109
</dependencies>
71110

72111
<build>
@@ -175,6 +214,8 @@
175214
<maven-resources-plugin.version>2.7</maven-resources-plugin.version>
176215
<cargo-maven2-plugin.version>1.4.15</cargo-maven2-plugin.version>
177216

217+
<!-- AspectJ -->
218+
<aspectj.version>1.8.7</aspectj.version>
178219
</properties>
179220

180221
</project>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.baeldung.aop;
2+
3+
import org.aspectj.lang.ProceedingJoinPoint;
4+
import org.aspectj.lang.annotation.Around;
5+
import org.aspectj.lang.annotation.Aspect;
6+
import org.aspectj.lang.annotation.Pointcut;
7+
import org.springframework.stereotype.Component;
8+
9+
import java.util.concurrent.TimeUnit;
10+
import java.util.logging.Logger;
11+
12+
@Aspect
13+
@Component
14+
public class PerformanceAspect {
15+
16+
private static Logger logger = Logger.getLogger(PerformanceAspect.class.getName());
17+
18+
@Pointcut("within(@org.springframework.stereotype.Repository *)")
19+
public void repositoryClassMethods() {};
20+
21+
@Around("repositoryClassMethods()")
22+
public Object measureMethodExecutionTime(ProceedingJoinPoint pjp) throws Throwable {
23+
long start = System.nanoTime();
24+
Object retval = pjp.proceed();
25+
long end = System.nanoTime();
26+
String methodName = pjp.getSignature().getName();
27+
logger.info("Execution of " + methodName + " took " + TimeUnit.NANOSECONDS.toMillis(end - start) + " ms");
28+
return retval;
29+
}
30+
31+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.baeldung.dao;
2+
3+
import org.springframework.stereotype.Repository;
4+
5+
@Repository
6+
public class FooDao {
7+
public String findById(Long id) {
8+
return "Bazz";
9+
}
10+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package org.baeldung.aop;
2+
3+
import org.baeldung.config.TestConfig;
4+
import org.baeldung.dao.FooDao;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.test.context.ContextConfiguration;
10+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
11+
import org.springframework.test.context.support.AnnotationConfigContextLoader;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
import java.util.logging.Handler;
16+
import java.util.logging.LogRecord;
17+
import java.util.logging.Logger;
18+
import java.util.regex.Pattern;
19+
20+
import static org.hamcrest.CoreMatchers.notNullValue;
21+
import static org.hamcrest.Matchers.hasSize;
22+
import static org.junit.Assert.assertThat;
23+
import static org.junit.Assert.assertTrue;
24+
25+
@RunWith(SpringJUnit4ClassRunner.class)
26+
@ContextConfiguration(classes = {TestConfig.class}, loader = AnnotationConfigContextLoader.class)
27+
public class AopPerformanceTest {
28+
29+
@Before
30+
public void setUp() {
31+
logEventHandler = new Handler() {
32+
@Override
33+
public void publish(LogRecord record) {
34+
messages.add(record.getMessage());
35+
}
36+
37+
@Override
38+
public void flush() {
39+
}
40+
41+
@Override
42+
public void close() throws SecurityException {
43+
}
44+
};
45+
46+
messages = new ArrayList<>();
47+
}
48+
49+
@Autowired
50+
private FooDao dao;
51+
52+
private Handler logEventHandler;
53+
54+
private List<String> messages;
55+
56+
@Test
57+
public void givenPerformanceAspect_whenCallDaoMethod_thenPerformanceMeasurementAdviceIsCalled() {
58+
Logger logger = Logger.getLogger(PerformanceAspect.class.getName());
59+
logger.addHandler(logEventHandler);
60+
61+
final String entity = dao.findById(1L);
62+
assertThat(entity, notNullValue());
63+
assertThat(messages, hasSize(1));
64+
65+
String logMessage = messages.get(0);
66+
Pattern pattern = Pattern.compile("Execution of findById took \\d+ ms");
67+
assertTrue(pattern.matcher(logMessage).matches());
68+
}
69+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.baeldung.config;
2+
3+
import org.springframework.context.annotation.ComponentScan;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.context.annotation.EnableAspectJAutoProxy;
6+
7+
@Configuration
8+
@ComponentScan(basePackages = {"org.baeldung.dao", "org.baeldung.aop"})
9+
@EnableAspectJAutoProxy
10+
public class TestConfig {
11+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Set root logger level to DEBUG and its only appender to A1.
2+
log4j.rootLogger=WARN, A1
3+
4+
# A1 is set to be a ConsoleAppender.
5+
log4j.appender.A1=org.apache.log4j.ConsoleAppender
6+
7+
# A1 uses PatternLayout.
8+
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
9+
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

0 commit comments

Comments
 (0)