Skip to content

Commit c654cb1

Browse files
committed
Merge pull request eugenp#292 from zinch84/aop_examples
Aop examples
2 parents bd802e0 + b94d10d commit c654cb1

File tree

14 files changed

+407
-2
lines changed

14 files changed

+407
-2
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.baeldung.aop;
2+
3+
import org.aspectj.lang.JoinPoint;
4+
import org.aspectj.lang.annotation.Aspect;
5+
import org.aspectj.lang.annotation.Before;
6+
import org.aspectj.lang.annotation.Pointcut;
7+
import org.springframework.stereotype.Component;
8+
9+
import java.text.SimpleDateFormat;
10+
import java.util.Date;
11+
import java.util.logging.Logger;
12+
13+
@Component
14+
@Aspect
15+
public class LoggingAspect {
16+
17+
private static Logger logger = Logger.getLogger(LoggingAspect.class.getName());
18+
19+
private ThreadLocal<SimpleDateFormat> sdf = new ThreadLocal<SimpleDateFormat>() {
20+
@Override
21+
protected SimpleDateFormat initialValue() {
22+
return new SimpleDateFormat("[yyyy-mm-dd hh:mm:ss:SSS]");
23+
}
24+
};
25+
26+
@Pointcut("@target(org.springframework.stereotype.Repository)")
27+
public void repositoryMethods() {}
28+
29+
@Pointcut("@annotation(org.baeldung.aop.annotations.Loggable)")
30+
public void loggableMethods() {}
31+
32+
@Pointcut("@args(org.baeldung.aop.annotations.Entity)")
33+
public void methodsAcceptingEntities() {}
34+
35+
@Before("repositoryMethods()")
36+
public void logMethodCall(JoinPoint jp) {
37+
String methodName = jp.getSignature().getName();
38+
logger.info(sdf.get().format(new Date()) + methodName);
39+
}
40+
41+
@Before("loggableMethods()")
42+
public void logMethod(JoinPoint jp) {
43+
String methodName = jp.getSignature().getName();
44+
logger.info("Executing method: " + methodName);
45+
}
46+
47+
@Before("methodsAcceptingEntities()")
48+
public void logMethodAcceptionEntityAnnotatedBean(JoinPoint jp) {
49+
logger.info("Accepting beans with @Entity annotation: " + jp.getArgs()[0]);
50+
}
51+
}

spring-mvc-java/src/main/java/org/baeldung/aop/PerformanceAspect.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class PerformanceAspect {
1616
private static Logger logger = Logger.getLogger(PerformanceAspect.class.getName());
1717

1818
@Pointcut("within(@org.springframework.stereotype.Repository *)")
19-
public void repositoryClassMethods() {};
19+
public void repositoryClassMethods() {}
2020

2121
@Around("repositoryClassMethods()")
2222
public Object measureMethodExecutionTime(ProceedingJoinPoint pjp) throws Throwable {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.baeldung.aop;
2+
3+
import org.aspectj.lang.JoinPoint;
4+
import org.aspectj.lang.annotation.AfterReturning;
5+
import org.aspectj.lang.annotation.Aspect;
6+
import org.aspectj.lang.annotation.Pointcut;
7+
import org.baeldung.events.FooCreationEvent;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.context.ApplicationEventPublisher;
10+
import org.springframework.stereotype.Component;
11+
12+
@Component
13+
@Aspect
14+
public class PublishingAspect {
15+
16+
private ApplicationEventPublisher eventPublisher;
17+
18+
@Autowired
19+
public void setEventPublisher(ApplicationEventPublisher eventPublisher) {
20+
this.eventPublisher = eventPublisher;
21+
}
22+
23+
@Pointcut("@target(org.springframework.stereotype.Repository)")
24+
public void repositoryMethods() {}
25+
26+
@Pointcut("execution(* *..create*(Long,..))")
27+
public void firstLongParamMethods() {}
28+
29+
@Pointcut("repositoryMethods() && firstLongParamMethods()")
30+
public void entityCreationMethods() {}
31+
32+
@AfterReturning(value = "entityCreationMethods()", returning = "entity")
33+
public void logMethodCall(JoinPoint jp, Object entity) throws Throwable {
34+
eventPublisher.publishEvent(new FooCreationEvent(entity));
35+
}
36+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.baeldung.aop.annotations;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.TYPE)
10+
public @interface Entity {
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.baeldung.aop.annotations;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.METHOD)
10+
public @interface Loggable {
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
package org.baeldung.dao;
22

3+
import org.baeldung.aop.annotations.Loggable;
4+
import org.baeldung.model.Foo;
35
import org.springframework.stereotype.Repository;
46

57
@Repository
68
public class FooDao {
9+
710
public String findById(Long id) {
811
return "Bazz";
912
}
13+
14+
@Loggable
15+
public Foo create(Long id, String name) {
16+
return new Foo(id, name);
17+
}
18+
19+
public Foo merge(Foo foo) {
20+
return foo;
21+
}
1022
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.baeldung.events;
2+
3+
import org.springframework.context.ApplicationEvent;
4+
5+
public class FooCreationEvent extends ApplicationEvent {
6+
7+
public FooCreationEvent(Object source) {
8+
super(source);
9+
}
10+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.baeldung.events;
2+
3+
import org.springframework.context.ApplicationListener;
4+
import org.springframework.stereotype.Component;
5+
6+
import java.util.logging.Logger;
7+
8+
@Component
9+
public class FooCreationEventListener implements ApplicationListener<FooCreationEvent> {
10+
11+
private static Logger logger = Logger.getLogger(FooCreationEventListener.class.getName());
12+
13+
@Override
14+
public void onApplicationEvent(FooCreationEvent event) {
15+
logger.info("Created foo instance: " + event.getSource().toString());
16+
}
17+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.baeldung.model;
2+
3+
import org.baeldung.aop.annotations.Entity;
4+
5+
@Entity
6+
public class Foo {
7+
private Long id;
8+
private String name;
9+
10+
public Foo(Long id, String name) {
11+
this.id = id;
12+
this.name = name;
13+
}
14+
15+
@Override
16+
public String toString() {
17+
return "Foo{" +
18+
"id=" + id +
19+
", name='" + name + '\'' +
20+
'}';
21+
}
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<beans xmlns="http://www.springframework.org/schema/beans"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:aop="http://www.springframework.org/schema/aop"
5+
xsi:schemaLocation="http://www.springframework.org/schema/beans
6+
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
7+
http://www.springframework.org/schema/aop
8+
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
9+
10+
<bean id="perfomanceMeter" class="org.baeldung.aop.PerformanceAspect"/>
11+
<bean id="fooDao" class="org.baeldung.dao.FooDao"/>
12+
13+
<aop:config>
14+
<aop:pointcut id="anyDaoMethod" expression="@target(org.springframework.stereotype.Repository)"/>
15+
<aop:aspect ref="perfomanceMeter">
16+
<aop:around method="measureMethodExecutionTime" pointcut-ref="anyDaoMethod"/>
17+
</aop:aspect>
18+
</aop:config>
19+
</beans>

0 commit comments

Comments
 (0)