![ืื ืื AOP? ืขืงืจืื ืืช ืฉื ืชืื ืืช ืืื ืื ืืืืืื - 1](https://cdn.codegym.cc/images/article/e2a37122-f0b0-4a1c-851a-30c822a21c68/800.jpeg)
ืืืืช AOP
ืชืื ืืช ืืื ืื ืืืืืื ื ืืขื ืืืฆืข ืืฉืืืืช ืฆืืืืืช, ืฉืืืืืืช ืืืืืช ืื ืงืื ืฉืขืืื ืืืืืจ ืขื ืขืฆืื ืคืขืืื ืจืืืช ืืฉืืืืช ืฉืื ืืช, ืฉืื ื ืืชื ืืื ืืช ืืืืืืื ืืืืืื ื ืคืจื. ืืืชืื ืืื, AOP ืืืคืฉืจ ืื ื ืืฉืืืจ ืืช ืื ืืืืฅ ืืงืื ืืจืืฉื ืืืืืจืื ืขื ืื ืืฆืืจื ืื ืืืช. ืืืืื ืืื ืืื ืฉืืืืฉ ืืืืื ืืืช ืืืืื ืืืคืืืงืฆืื. ืืืจื ืืื, ืืืืื ืขืืืจืช ืืจื ืืืื ืืื ืจืืื ืฉื ืืืฉืื. ืืชืจื ืืื, ืืืื ืืืช ืืืืืื ืฉื ืืืคืืืงืฆืื ืฆืจืืื ืืืืืช ืืืืฉืืช ืืืืคื ืฉืืื ืขื ืื ืืืืงืื ืืงืืืืื ืืืืืฉืื ืฉื ืืืคืืืงืฆืื. ืืืงืืื, ืืืื ืืืช ืืืืื ืืฉืืืืฉ ืืืืื ืืืชืคืชื ืืขืฆืื. ืื ืืืงืื ืืืืฉืื ืืืฉืชืืฉ ื-AOP . ืืื ืื, ืืืืื ื ืืกืคืช ืืื ืจืืฉืื . ืืฉื ื ืืกืคืจ ืืชืจืื ืืช ืืฉืืืืฉ ืืืืฉืช AOP ืืจืืฉืื ืืื ืืืืกืคืช ืคืื ืงืฆืืื ืื ืจืืฉืื ืืื ืืช:-
ืงื ืืืืกืืฃ ืืืืกืืจ ืืช ืืงืื ืืจืืฉืื: ืื ืื ืฉืืชื ืฆืจืื ืืขืฉืืช ืืื ืืืืกืืฃ ืื ืืืกืืจ ืืื ืชืฆืืจืืช ืฉื ืืืื ืืืฉืื.
-
ืื ืงืื ืืืงืืจ ืืจืืฉืื ื ืฉืืจ ืืืงืื ืืื, ืื ืฉืื ืชืฆืืจื ืืืคืฉ ืืื ืืช ืืช ืื ืืืงืืืืช ืฉืืื ื ืขืฉื ืื ืฉืืืืฉ.
-
ื ืืชื ืืืืกืืฃ ืงืื ืจืืฉืื ืืื ืืงืื, ืืื ืื ืืฉืืืืช ืืืืืงืืช ืฉืืืจ ื ืืชืื ืืืื ืื ืืคืื ืงืฆืืื ืืืืช ืืืฉื. ืื ืืงืืื ืืช ืืกืคืจ ืฉืืืืืช ืืงืืืื.
ืืื ืื, ืืขืช ืืกืจืช ืืืื ืืชืฆืืจืช ืขืืฆืื, ืืชื ืืืื ืืืืืช ืืืื ืฉืื ืงืื ืืืขืงื ื ืขืื ืืฉืฉืื ืืืจ ืื ืืืืืฆ.
- ืืืืืื ืื ืงืื ื ืคืจื ืฉื ืืชื ืืฉืคืจ ืืืืฉืชืืฉ ืื ืฉืื ืืฉืื.
![ืื ืื AOP? ืขืงืจืื ืืช ืฉื ืชืื ืืช ืืื ืื ืืืืืื - 2](https://cdn.codegym.cc/images/article/905659f3-ca60-47ed-847d-e3184c26b152/512.jpeg)
ืขืงืจืื ืืช ืืกืืกืืื ืฉื AOP
ืืื ืืืชืงืื ืื ืืฉื ืื, ืืืื ื ืืืจ ืชืืืื ืืช ืืืืฉืืื ืืขืืงืจืืื ืฉื AOP. ืขืฆื - ืืืืื ื ืืกืฃ ืื ืงืื ืฉื ืงืจื ืื ืงืืืช ืืฆืืจืคืืช. ื ืืชื ืืืฆืข ืืืขืืฅ ืืคื ื, ืืืจื ืื ืืืงืื ื ืงืืืช ืืฆืืจืคืืช (ืขืื ืขืืืื ืืืืฉื). ืกืืื ืขืฆืืช ืืคืฉืจืืืช :-
ืืคื ื - ืืืขืืฅ ืืกืื ืื ืืืคืขื ืืคื ื ืืืฆืืข ืฉืืืืช ืืขื, ืืืืืจ ื ืงืืืืช ืฆืืจืืฃ. ืืขืช ืฉืืืืฉ ืืืืืืื ืืฉืืขืืจืื, ืื ื ืืฉืชืืฉืื ืืืขืจืช @Before ืืื ืืกืื ืืช ืืขืฆื ืืืืืขื ืืคื ื. ืืขืช ืฉืืืืฉ ืืืกืคืงืืื ืืงืืฆื .aj , ืื ืชืืื ืฉืืืช before() .
- ืืืืจ - ืขืฆื ืฉืืชืืฆืขืช ืืืืจ ืืืฆืืข ืฉืืืืช (ื ืงืืืืช ืฆืืจืืฃ) ืืืฉืืื, ืื ืืืืฆืืข ืจืืื ืืื ืืขืช โโืืจืืงืช ืืจืืื.
ืืืฉืจ ืืฉืชืืฉืื ืืืืืืื ืืฉืืขืืจืื, ืื ื ืืืืืื ืืืฉืชืืฉ ืืืืืืจ @After ืืื ืืฆืืื ืฉืื ืขืฆื ืฉืืืืขื ืืืืจ ืืื.
ืืืฉืจ ืืฉืชืืฉืื ืืืกืคืงืืื ืืงืืฆื .aj , ืืืื ืฉืืืช after() .
-
ืืืืจ ืืืืจื - ืขืฆื ืื ืืืืฆืขืช ืจืง ืืืฉืจ ืฉืืืช ืืืขื ืืกืชืืืืช ืืจืืื, ืืื ืฉืืืืืช.
ืืืฉืจ ืืืืืื ืืืืฆืืื ืืฉืืขืืจืื, ืื ื ืืืืืื ืืืฉืชืืฉ ืืืืืืจ @AfterReturning ืืื ืืกืื ืืช ืืขืฆื ืืืืืฆืขืช ืืืืจ ืกืืื ืืืฆืื.
ืืขืช ืฉืืืืฉ ืืืกืคืงืืื ืืงืืฆื .aj , ืื ืชืืื ืฉืืืช after() ืืืืืืจื (Object obj) .
-
ืืืืจ ืืฉืืื - ืขืฆื ืื ืืืืขืืช ืืืงืจืื ืฉืืื ืฉืืื, ืืืืืจ ื ืงืืืช ืืฆืืจืคืืช, ืืืจืงืช ืืจืืื. ืื ื ืืืืืื ืืืฉืชืืฉ ืืขืฆื ืื ืืื ืืืคื ืืกืืืื ืืกืืืืื ืฉื ืืืฆืืข ืืืฉื (ืืืืืื, ืืืื ืขืกืงื ืฉืืื ืื ืืืื ืจืืฉืื ืขื ืจืืช ืืืขืงื ืื ืืจืฉืช).
ืขืืืจ ืืืืื ืืืืชื, ืืืขืจื @AfterThrowing ืืฉืืฉืช ืืื ืืฆืืื ืฉืืขืฆื ืืื ืืฉืืฉืช ืืืืจ ืืจืืงืช ืืจืืื.
ืืขืช ืฉืืืืฉ ืืืกืคืงืืื ืืงืืฆื โ.aj , ืื ืชืืื ืฉืืืช after() throwing (Exception e) .
-
ืืกืืื - ืืืื ืืื ืืกืืื ืืขืฆืืช ืืืฉืืืื ืืืืชืจ. ืืื ืืงืืฃ ืฉืืื, ืืืืืจ ื ืงืืืช ืฆืืจืืฃ ืฉืื ื ืืื ืืืฉืชืืฉ ืืื, ืืืฉื, ืืืืืจ ืื ืืืฆืข ืฉืืืช ื ืงืืืช ืฆืืจืืฃ ื ืชืื ื ืื ืื.
ืืชื ืืืื ืืืชืื ืงืื ืขืฆื ืฉืจืฅ ืืคื ื ืืืืจื ืืืฆืืข ืฉืืืช ื-join point.
ืืขืฆื ืกืืื ืืืจืืืช ืืงืจืืื ืืฉืืืช ื-join point ืืืขืจืื ืืืืืจื ืื ืืฉืืื ืืืืืจื ืืฉืื. ืืืืืื ืืืจืืช, ืืขืฆื ืื ืชืืืื ืคืฉืื ืืืืืช ืคืขืืืช ืฉืืืช ืืืจื ืืืื ืืงืจืื ืื, ืืืืืืืจ ืื ืฉืชืจืฆื ืืชืืฆืื ืืืืืจื.
ืืืชืืฉื ืืืืืืื ืืฉืืขืืจืื, ืื ื ืืฉืชืืฉืื ืืืืืืจ @Around ืืื ืืืฆืืจ ืขืฆืืช ืฉืขืืืคืืช ื ืงืืืช ืืฆืืจืคืืช. ืืขืช ืฉืืืืฉ ืืืืืืื ืืฆืืจื ืฉื ืงืืฆื .aj , ืฉืืื ืื ืชืืื ืฉืืืช around() .
-
ืืจืืื ืืืื ืงืืืคืืืฆืื โ ืื ืืฉ ืื ืืช ืงืื ืืืงืืจ ืฉื ืืืืื ืืืช ืืงืื ืฉืื ืืชื ืืฉืชืืฉ ืืืืื, ืื ืืชื ืืืื ืืงืืคื ืืช ืงืื ืืืงืืจ ืืืช ืืืืื ืืฉืืจืืช ืืืืฆืขืืช ืืืืจ AspectJ;
-
ืืจืืื ืืืืจ ืืืืืจ (ืืจืืื ืืื ืืจืืช) - ืื ืืื ื ืืืื ืื ืจืืฆื ืืืฉืชืืฉ ืืืจื ืกืคืืจืืฆืืืช ืฉื ืงืื ืืงืืจ ืืื ืืืจืื ืืืืืื ืืชืื ืืงืื, ืืชื ืืืื ืืงืืช ืืืืงืืช ืื ืงืืฆื jar ืฉืืืืืจ ืงืืื ืืื ืืืืืืืจ ืืชืืื ืืืืืื;
-
ืืจืืื ืืืื ืืขืื ื - ืืืื ืจืง ืืจืืื ืืื ืืจืืช ืฉืืชืขืืืช ืขื ืฉื-classloader ืืืขื ืืช ืงืืืฅ ืืืืืงื ืืืืืืจ ืืช ืืืืืงื ืขืืืจ ื-JVM.
ื ืืจืฉ ืืื ืื ืืืชืจ ืืขืืืกืื ืืกืื ืืจืืื ืืื ืืชืืื ืืื. ืื ืืกืืคืงืื ืืืคืืจืฉ ืขื ืืื ืืื ืืจืืฆื ืื ืืืคืขืืื ืขื ืืื "ืกืืื ืืจืืื".
ืืืืืืืช ืื'ืืืื
ืืืืจ ืืื, ืืืื ื ืืืื ืืืชืจ ืฉื AOP , ื ืกืชืื ืขื ืืืืืืืช ืงืื ืืช ืืกืื ืื "Hello World". ืืืืื ืืืืื, ืืฆืืื ืฉืืืืืืืืช ืฉืื ื ืืฉืชืืฉื ืืืจืืื ืืืื ืืืืืจ . ืจืืฉืืช, ืขืืื ื ืืืืกืืฃ ืืช ืืชืืืช ืืืื ืืงืืืฅ pom.xml ืฉืื ื :
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
ืืืื, ืืืืจ ื-ajc ืืืืืื ืืื ืืืืคื ืฉืื ืื ื ืืฉืชืืฉืื ืืืืืืื. IntelliJ IDEA ืืื ื ืืืื ืืืชื ืืืจืืจืช ืืืื, ืื ืฉืืืฉืจ ืืชื ืืืืจ ืื ืืงืืืคืืืืจ ืืืืฉืืืื, ืขืืื ืืฆืืื ืืช ืื ืชืื ืืืคืฆื 5168 75 AspectJ . ืื ืืืืชื ืืืจื ืืจืืฉืื ื. ืืฉื ื, ืฉืืื ืื ืฉืืฉืชืืฉืชื ืื, ืืื ืืจืฉืื ืืช ืืชืืกืฃ ืืื ืืงืืืฅ pom.xml :
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<showWeaveInfo>true</showWeaveInfo>
<<verbose>true<verbose>
<Xlint>ignore</Xlint>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
ืืืืจ ืืื, ืืืืืฅ ืืืืื ืืืืฉ ื- Maven
ืืืืคืขืื ืืช mvn clean compile . ืืขืช ื ืืฉืื ืืฉืืจืืช ืืืืืืืืช.
ืืืืื ืืก' 1
ืืืื ื ืืฆืืจ ืืืืงื ืจืืฉืืช . ืื ืชืืื ืื ื ื ืงืืืช ืื ืืกื ืืฉืืื ืฉืืืคืืกื ืฉื ืขืืจ ืืงืื ืกืืื:
public class Main {
public static void main(String[] args) {
printName("Tanner");
printName("Victor");
printName("Sasha");
}
public static void printName(String name) {
System.out.println(name);
}
}
ืืื ืืื ืฉืื ืืืจ ืืกืืื. ืืขืืจื ื ืฉื ืืืฆืื ื ืืืชื ืืงืื ืกืืื. ืื ื ืจืืฅ ืืช ืืชืืื ืืช ืืขืช, ื ืจืื ืืช ืืืืจืื ืืืืื ืืงืื ืกืืื:
public aspect GreetingAspect {
pointcut greeting() : execution(* Main.printName(..));
before() : greeting() {
System.out.print("Hi, ");
}
}
ืืงืืืฅ ืืื ืืื ืื ืืื ืืืืงื. ืืืื ื ืจืื ืื ืงืืจื ืืื: pointcut ืืื ืงืืืฆื ืฉื ื ืงืืืืช ืฆืืจืืฃ; greeting() ืืื ืืฉื ืฉื ื ืงืืืช ืืืชืื ืื; : ืืืฆืืข ืืฆืืื ืืืืื ืืืชื ืืืืื ืืืฆืืข ืื ( * ) ืืงืจืืืืช ืฉื ืืฉืืื Main.printName(...) . ืืืืจ ืืื ืืืืขื ืขืฆื ืกืคืฆืืคืืช - before() - ืฉืืชืืฆืขืช ืืคื ื ืฉื ืงืจืืช ืฉืืืช ืืืืจื. : greeting() ืืื ื ืงืืืช ืืืืชืื ืฉืืขืฆื ืืื ืืืืื ืืืื. ืืืื, ืืืืื ืื ื ืจืืืื ืืช ืืืฃ ืืฉืืื ืขืฆืื, ืฉื ืืชื ืืฉืคืช ื'ืืืื, ืืืชื ืื ื ืืืื ืื. ืืฉื ืจืืฅ ืืช ื-main ืขื ืืืืื ืืื ื ืืื, ื ืงืื ืืช ืืคืื ืืื ืฉื ืืืกืืฃ:
@Aspect
public class GreetingAspect{
@Pointcut("execution(* Main.printName(String))")
public void greeting() {
}
@Before("greeting()")
public void beforeAdvice() {
System.out.print("Hi, ");
}
}
ืืืจื ืงืืืฅ ื- .aj aspect, ืืื ืืืคื ืืจืืจ ืืืชืจ ืืื:
- @Aspect ืืฆืืื ืฉืืืืงื ืื ืืื ืืืื;
- @Pointcut("execution(* Main.printName(String))") ืืื ื ืงืืืช ืืืืชืื ืืืืคืขืืช ืขืืืจ ืื ืืงืจืืืืช ื- Main.printName ืขื ืืจืืืื ื ืงืื ืฉืืกืื ืฉืื ืืื String ;
- @Before("greeting()") ืืื ืขืฆื ืืืืืฉืืช ืืคื ื ืงืจืืื ืืงืื ืฉืฆืืื ืื ืงืืืช ืืืืชืื ืฉื greeting() .
ืืืืื ืืก' 2
ื ื ืื ืฉืืฉ ืื ื ืฉืืื ืืืฉืื ืฉืืืฆืขืช ืคืขืืืืช ืืกืืืืืช ืขืืืจ ืืงืืืืช, ืืื ืื ื ืงืืจืืื ืืฉืืื ืืื ืืืจืืฉื :
public class Main {
public static void main(String[] args) {
performSomeOperation("Tanner");
}
public static void performSomeOperation(String clientName) {
System.out.println("Performing some operations for Client " + clientName);
}
}
ืืืื ื ืฉืชืืฉ ืืืืืืจ @Around ืืื ืืืฆืืจ "ืคืกืืืื-ืขืกืงื":
@Aspect
public class TransactionAspect{
@Pointcut("execution(* Main.performSomeOperation(String))")
public void executeOperation() {
}
@Around(value = "executeOperation()")
public void beforeAdvice(ProceedingJoinPoint joinPoint) {
System.out.println("Opening a transaction...");
try {
joinPoint.proceed();
System.out.println("Closing a transaction...");
}
catch (Throwable throwable) {
System.out.println("The operation failed. Rolling back the transaction...");
}
}
}
ืขื ืฉืืืช ืืืืฉื ืฉื ืืืืืืืงื ProceedingJoinPoint , ืื ื ืงืืจืืื ืืฉืืืช ืืืืืฉื ืืื ืืงืืืข ืืช ืืืงืืื ืืขืฆื. ืืื, ืืงืื ืืฉืืื ืฉืืืขืื joinPoint.proceed(); ืืื ืืคื ื , ืืขืื ืฉืืงืื ืฉืืชืืชืื ืืื ืืืจื . ืื ื ืจืืฅ ืืช main , ื ืงืื ืืช ืื ืืงืื ืกืืื:
public static void performSomeOperation(String clientName) throws Exception {
System.out.println("Performing some operations for Client " + clientName);
throw new Exception();
}
ืืื ื ืงืื ืืช ืืคืื ืืื ืฉื ืืืกืืฃ:
ืืืืื ืืก' 3
ืืืืืื ืืืื ืฉืื ื, ืืืื ื ืขืฉื ืืฉืื ืืื ืื ืืกื ืืงืื ืกืืื. ืจืืฉืืช, ืชืกืชืื ืขื Main , ืฉื ืืืกืคื ื ืงืฆืช ืืืืืื ืขืกืงื ืคืกืืืื:
public class Main {
private String value;
public static void main(String[] args) throws Exception {
Main main = new Main();
main.setValue("<some value>");
String valueForCheck = main.getValue();
main.checkValue(valueForCheck);
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
public void checkValue(String value) throws Exception {
if (value.length() > 10) {
throw new Exception();
}
}
}
ื- main , ืื ื ืืฉืชืืฉืื ื-setValue ืืื ืืืงืฆืืช ืขืจื ืืืฉืชื ื ืืืคืข ืืขืจื . ืืืืจ ืืื ืื ื ืืฉืชืืฉืื ื-getValue ืืื ืืงืื ืืช ืืขืจื, ืืืืืจ ืืื ืื ื ืงืืจืืื checkValue ืืื ืืจืืืช ืื ืืื ืืจืื ื-10 ืชืืืื. ืื ืื, ืืื ืืืื ืืจืืื. ืขืืฉืื ืืืื ื ืกืชืื ืขื ืืืืื ืฉืื ื ืฉืชืืฉ ืืื ืืจืฉืื ืืช ืขืืืืช ืืฉืืืืช:
@Aspect
public class LogAspect {
@Pointcut("execution(* *(..))")
public void methodExecuting() {
}
@AfterReturning(value = "methodExecuting()", returning = "returningValue")
public void recordSuccessfulExecution(JoinPoint joinPoint, Object returningValue) {
if (returningValue != null) {
System.out.printf("Successful execution: method โ %s method, class โ %s class, return value โ %s\n",
joinPoint.getSignature().getName(),
joinPoint.getSourceLocation().getWithinType().getName(),
returningValue);
}
else {
System.out.printf("Successful execution: method โ %s, class โ %s\n",
joinPoint.getSignature().getName(),
joinPoint.getSourceLocation().getWithinType().getName());
}
}
@AfterThrowing(value = "methodExecuting()", throwing = "exception")
public void recordFailedExecution(JoinPoint joinPoint, Exception exception) {
System.out.printf("Exception thrown: method โ %s, class โ %s, exception โ %s\n",
joinPoint.getSignature().getName(),
joinPoint.getSourceLocation().getWithinType().getName(),
exception);
}
}
ืื ืงืืจื ืคื? @Pointcut("execution(* *(..))") ืืฆืืจืฃ ืืื ืืงืจืืืืช ืฉื ืื ืืฉืืืืช. @AfterReturning(value = "methodExecuting()", returning = "returningValue") ืืื ืขืฆื ืฉืชืืืฆืข ืืืืจ ืืืฆืืข ืืืฆืื ืฉื ืฉืืืช ืืืืจื. ืืฉ ืื ื ืืื ืฉื ื ืืงืจืื:
- ืืืฉืจ ืืืชืืื ืืฉ โโืขืจื ืืืืจื - if (returningValue! = Null) {
- ืืฉืืื ืขืจื ืืืืจื - else {
![ืื ืื AOP? ืขืงืจืื ืืช ืฉื ืชืื ืืช ืืื ืื ืืืืืื - 3](https://cdn.codegym.cc/images/article/b5785e44-130a-4260-98ad-fb09c37abda3/512.jpeg)
GO TO FULL VERSION