Spring AOP - Hướng dẫn nhanh
Một trong những thành phần chính của Spring Framework là Aspect Oriented Programming (AOP)khuôn khổ. Lập trình hướng theo khía cạnh đòi hỏi phải chia logic chương trình thành các phần riêng biệt được gọi làso-called concerns. Các chức năng trải dài nhiều điểm của một ứng dụng được gọi là các mối quan tâm xuyên suốt. Nhữngcross-cutting concernsvề mặt khái niệm tách biệt khỏi logic nghiệp vụ của ứng dụng. Có nhiều ví dụ điển hình phổ biến về các khía cạnh như ghi nhật ký, kiểm toán, giao dịch khai báo, bảo mật, bộ nhớ đệm, v.v.
Đơn vị quan trọng của mô-đun trong OOP là lớp, trong khi trong AOP, đơn vị mô-đun là khía cạnh. Dependency Injection giúp bạn tách các đối tượng ứng dụng của mình khỏi nhau, trong khi AOP giúp bạn tách các mối quan tâm xuyên suốt khỏi các đối tượng mà chúng ảnh hưởng. AOP giống như các trình kích hoạt trong các ngôn ngữ lập trình như Perl, .NET, Java và các ngôn ngữ khác.
Mô-đun AOP mùa xuân cho phép các bộ đánh chặn chặn một ứng dụng. Ví dụ: khi một phương thức được thực thi, bạn có thể thêm chức năng bổ sung trước hoặc sau khi thực thi phương thức.
Chương này sẽ hướng dẫn bạn quá trình thiết lập Spring AOP trên các hệ thống chạy Windows và Linux. Spring AOP có thể dễ dàng cài đặt và tích hợp với môi trường Java hiện tại của bạn và MAVEN bằng cách làm theo một vài bước đơn giản mà không cần bất kỳ thủ tục thiết lập phức tạp nào. Quản trị người dùng được yêu cầu trong khi cài đặt.
yêu cầu hệ thống
JDK | Java SE 2 JDK 1.5 trở lên |
Ký ức | RAM 1 GB (khuyến nghị) |
Dung lượng đĩa | Không có yêu cầu tối thiểu |
Phiên bản hệ điều hành | Windows XP trở lên, Linux |
Bây giờ chúng ta hãy xem các bước cài đặt Spring AOP.
Bước 1: Xác minh cài đặt Java của bạn
Trước hết, bạn cần cài đặt Bộ phát triển phần mềm Java (SDK) trên hệ thống của mình. Để xác minh điều này, hãy thực hiện bất kỳ lệnh nào trong hai lệnh sau tùy thuộc vào nền tảng bạn đang làm việc.
Nếu cài đặt Java đã được thực hiện đúng cách, thì nó sẽ hiển thị phiên bản hiện tại và đặc điểm kỹ thuật của cài đặt Java của bạn. Đầu ra mẫu được đưa ra trong bảng sau.
Nền tảng | Chỉ huy | Đầu ra mẫu |
---|---|---|
các cửa sổ | Mở bảng điều khiển lệnh và gõ - \>java -version |
Phiên bản Java "1.7.0_60" Môi trường thời gian chạy Java (TM) SE (bản dựng 1.7.0_60-b19) Java Hotspot (TM) Máy chủ 64-bit VM (bản dựng 24.60-b09, chế độ hỗn hợp) |
Linux | Mở đầu cuối lệnh và nhập - $java -version |
phiên bản java "1.7.0_25" Mở môi trường thời gian chạy JDK (rhel-2.3.10.4.el6_4-x86_64) Mở JDK 64-Bit Server VM (bản dựng 23.7-b01, chế độ hỗn hợp) |
Chúng tôi giả định rằng người đọc của hướng dẫn này đã cài đặt Java SDK phiên bản 1.7.0_60 trên hệ thống của họ.
Trong trường hợp bạn không có Java SDK, hãy tải xuống phiên bản hiện tại của nó từ https://www.oracle.com/technetwork/java/javase/downloads/index.html và đã cài đặt nó.
Bước 2: Đặt Môi trường Java của bạn
Đặt biến môi trường JAVA_HOME trỏ đến vị trí thư mục cơ sở nơi Java được cài đặt trên máy của bạn. Ví dụ,
Sr.No. | Nền tảng & Mô tả |
---|---|
1 | Windows Đặt JAVA_HOME thành C: \ ProgramFiles \ java \ jdk1.7.0_60 |
2 | Linux Xuất JAVA_HOME = / usr / local / java-current |
Nối đường dẫn đầy đủ của vị trí trình biên dịch Java vào Đường dẫn hệ thống.
Sr.No. | Nền tảng & Mô tả |
---|---|
1 | Windows Nối chuỗi "C: \ Program Files \ Java \ jdk1.7.0_60 \ bin" vào cuối Đường dẫn biến hệ thống. |
2 | Linux Xuất PATH = $ PATH: $ JAVA_HOME / bin / |
Thực hiện lệnh java -version từ dấu nhắc lệnh như đã giải thích ở trên.
Bước 3: Tải xuống Maven Archive
Tải xuống Maven 3.3.3 từ https://maven.apache.org/download.cgi
Hệ điều hành | Tên lưu trữ |
---|---|
các cửa sổ | apache-maven-3.3.3-bin.zip |
Linux | apache-maven-3.3.3-bin.tar.gz |
Mac | apache-maven-3.3.3-bin.tar.gz |
Bước 4: Giải nén kho lưu trữ Maven
Giải nén kho lưu trữ vào thư mục bạn muốn cài đặt Maven 3.3.3. Thư mục con apache-maven-3.3.3 sẽ được tạo từ kho lưu trữ.
Hệ điều hành | Vị trí (có thể khác tùy theo cài đặt của bạn) |
---|---|
các cửa sổ | C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 |
Linux | / usr / local / apache-maven |
Mac | / usr / local / apache-maven |
Bước 5: Đặt các biến môi trường Maven
Thêm M2_HOME, M2, MAVEN_OPTS vào các biến môi trường.
Hệ điều hành | Đầu ra |
---|---|
các cửa sổ | Đặt các biến môi trường bằng cách sử dụng thuộc tính hệ thống. M2_HOME = C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 M2 =% M2_HOME% \ bin MAVEN_OPTS = -Xms256m -Xmx512m |
Linux | Mở đầu cuối lệnh và đặt các biến môi trường. xuất M2_HOME = /usr/local/apache-maven/apache-maven-3.3.3 xuất M2 = $ M2_HOME / thùng xuất MAVEN_OPTS = -Xms256m -Xmx512m |
Mac | Mở đầu cuối lệnh và đặt các biến môi trường. xuất M2_HOME = /usr/local/apache-maven/apache-maven-3.3.3 xuất M2 = $ M2_HOME / thùng xuất MAVEN_OPTS = -Xms256m -Xmx512m |
Bước 6: Thêm vị trí thư mục Maven Bin vào đường dẫn hệ thống
Bây giờ nối biến M2 vào Đường dẫn hệ thống.
Hệ điều hành | Đầu ra |
---|---|
các cửa sổ | Nối chuỗi;% M2% vào cuối biến hệ thống, Đường dẫn. |
Linux | xuất PATH = $ M2: $ PATH |
Mac | xuất PATH = $ M2: $ PATH |
Bước 7: Xác minh cài đặt Maven
Bây giờ hãy mở bảng điều khiển và thực hiện các thao tác sau mvn chỉ huy.
Hệ điều hành | Bài tập | Chỉ huy |
---|---|---|
các cửa sổ | Mở bảng điều khiển lệnh | c: \> mvn --version |
Linux | Mở Command Terminal | $ mvn - phiên bản |
Mac | Mở thiết bị đầu cuối | máy: <joseph $ mvn --version |
Cuối cùng, xác minh kết quả đầu ra của các lệnh trên, sẽ như sau:
Hệ điều hành | Đầu ra |
---|---|
các cửa sổ | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Trang chủ Maven: C: \ Program Files \ Apache Software Foundation \ apache-maven-3.3.3 Phiên bản Java: 1.7.0_75, nhà cung cấp: Oracle Corporation Trang chủ Java: C: \ Program Files \ Java \ jdk1.7.0_75 \ jre Ngôn ngữ mặc định: en_US, mã hóa nền tảng: Cp1252 |
Linux | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Trang chủ Maven: /usr/local/apache-maven/apache-maven-3.3.3 Phiên bản Java: 1.7.0_75, nhà cung cấp: Oracle Corporation Trang chủ Java: /usr/local/java-current/jdk1.7.0_75/jre |
Mac | Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T17: 27: 37 + 05: 30) Trang chủ Maven: /usr/local/apache-maven/apache-maven-3.3.3 Phiên bản Java: 1.7.0_75, nhà cung cấp: Oracle Corporation Trang chủ Java: /Library/Java/Home/jdk1.7.0_75/jre |
Bước 8 - Thiết lập IDE Eclipse
Tất cả các ví dụ trong hướng dẫn này đã được viết bằng Eclipse IDE. Vì vậy, tôi khuyên bạn nên cài đặt phiên bản Eclipse mới nhất trên máy của mình.
Để cài đặt Eclipse IDE, hãy tải xuống các tệp nhị phân Eclipse mới nhất từ https://www.eclipse.org/downloads/. Sau khi bạn tải xuống bản cài đặt, hãy giải nén bản phân phối nhị phân vào một vị trí thuận tiện. Ví dụ: trong C: \ eclipse trên Windows hoặc / usr / local / eclipse trên Linux / Unix và cuối cùng đặt biến PATH một cách thích hợp.
Eclipse có thể được khởi động bằng cách thực hiện các lệnh sau trên máy Windows hoặc bạn có thể bấm đúp vào eclipse.exe
%C:\eclipse\eclipse.exe
Eclipse có thể được khởi động bằng cách thực hiện các lệnh sau trên máy Unix (Solaris, Linux, v.v.) -
$/usr/local/eclipse/eclipse
Sau khi khởi động thành công, nếu mọi thứ đều ổn thì nó sẽ hiển thị kết quả sau:
Khi bạn đã hoàn thành bước cuối cùng này, bạn đã sẵn sàng tiếp tục cho ví dụ AOP đầu tiên của mình, bạn sẽ thấy trong chương tiếp theo.
Trước khi bắt đầu làm việc với AOP, chúng ta hãy làm quen với các khái niệm và thuật ngữ AOP. Các thuật ngữ này không dành riêng cho Spring, thay vào đó chúng có liên quan đến AOP.
Sr.No. | Điều khoản & Mô tả |
---|---|
1 | Aspect Mô-đun có một tập hợp các API cung cấp các yêu cầu xuyên suốt. Ví dụ, một mô-đun ghi nhật ký sẽ được gọi là khía cạnh AOP để ghi nhật ký. Một ứng dụng có thể có bất kỳ khía cạnh nào tùy thuộc vào yêu cầu. |
2 | Join point Điều này thể hiện một điểm trong ứng dụng của bạn nơi bạn có thể bổ sung khía cạnh AOP. Bạn cũng có thể nói, đó là vị trí thực tế trong ứng dụng nơi một hành động sẽ được thực hiện bằng cách sử dụng Spring AOP framework. |
3 | Advice Đây là hành động thực sự được thực hiện trước hoặc sau khi thực thi phương thức. Đây là đoạn mã thực tế được gọi trong quá trình thực thi chương trình bằng khuôn khổ Spring AOP. |
4 | PointCut Đây là một tập hợp một hoặc nhiều điểm tham gia nơi một lời khuyên nên được thực hiện. Bạn có thể chỉ định PointCuts bằng cách sử dụng các biểu thức hoặc mẫu như chúng ta sẽ thấy trong các ví dụ AOP của mình. |
5 | Introduction Phần giới thiệu cho phép bạn thêm các phương thức hoặc thuộc tính mới vào các lớp hiện có. |
6 | Target object Đối tượng được tư vấn bởi một hoặc nhiều khía cạnh. Đối tượng này sẽ luôn là một đối tượng proxied. Cũng được gọi là đối tượng được tư vấn. |
7 | Weaving Dệt là quá trình liên kết các khía cạnh với các loại ứng dụng hoặc đối tượng khác để tạo ra một đối tượng được tư vấn. Điều này có thể được thực hiện tại thời gian biên dịch, thời gian tải hoặc trong thời gian chạy. |
Các khía cạnh mùa xuân có thể hoạt động với năm loại lời khuyên được đề cập trong bảng sau.
Sr.No. | Lời khuyên & Mô tả |
---|---|
1 | before Chạy lời khuyên trước khi thực hiện phương pháp. |
2 | after Chạy lời khuyên sau khi thực hiện phương pháp, bất kể kết quả của nó. |
3 | after-returning Chạy lời khuyên sau khi thực thi phương thức, chỉ khi phương thức hoàn tất thành công. |
4 | after-throwing Chạy lời khuyên sau khi thực thi phương thức, chỉ khi phương thức thoát bằng cách ném một ngoại lệ. |
5 | around Chạy lời khuyên trước và sau khi phương pháp đã khuyên được gọi. |
Mùa xuân hỗ trợ @AspectJ annotation style cách tiếp cận và schema-based cách tiếp cận để thực hiện các khía cạnh tùy chỉnh.
Dựa trên lược đồ XML
Các khía cạnh được triển khai bằng cách sử dụng các lớp thông thường cùng với cấu hình dựa trên XML.
Để sử dụng các thẻ không gian tên AOP được mô tả trong phần này, bạn cần nhập lược đồ AOP mùa xuân, được mô tả như sau:
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<!-- bean definition & AOP specific configuration -->
</beans>
Tuyên bố một khía cạnh
An aspect được khai báo bằng cách sử dụng <aop:aspect> phần tử và hạt đệm được tham chiếu bằng cách sử dụng ref thuộc tính như sau.
<aop:config>
<aop:aspect id = "myAspect" ref = "aBean">
...
</aop:aspect>
</aop:config>
<bean id = "aBean" class = "...">
...
</bean>
Ở đây "aBean" sẽ được cấu hình và chèn phụ thuộc giống như bất kỳ Spring bean nào khác như bạn đã thấy trong các chương trước.
Khai báo một PointCut
A PointCutgiúp xác định các điểm tham gia (tức là các phương pháp) quan tâm sẽ được thực hiện với các lời khuyên khác nhau. Trong khi làm việc với cấu hình dựa trên Lược đồ XML, PointCut sẽ được định nghĩa như sau:
<aop:config>
<aop:aspect id = "myAspect" ref = "aBean">
<aop:PointCut id = "businessService"
expression = "execution(* com.xyz.myapp.service.*.*(..))"/>
...
</aop:aspect>
</aop:config>
<bean id = "aBean" class = "...">
...
</bean>
Ví dụ sau định nghĩa một PointCut có tên 'businessService' sẽ khớp với việc thực thi phương thức getName () có sẵn trong lớp Sinh viên trong gói com.tutorialspoint.
<aop:config>
<aop:aspect id = "myAspect" ref = "aBean">
<aop:PointCut id = "businessService"
expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
...
</aop:aspect>
</aop:config>
<bean id = "aBean" class = "...">
...
</bean>
Khai báo Advices
Bạn có thể khai báo bất kỳ lời khuyên nào trong số năm lời khuyên bên trong <aop: khía cạnh> bằng cách sử dụng phần tử <aop: {ADVICE NAME}> như sau.
<aop:config>
<aop:aspect id = "myAspect" ref = "aBean">
<aop:PointCut id = "businessService"
expression = "execution(* com.xyz.myapp.service.*.*(..))"/>
<!-- a before advice definition -->
<aop:before PointCut-ref = "businessService"
method = "doRequiredTask"/>
<!-- an after advice definition -->
<aop:after PointCut-ref = "businessService"
method = "doRequiredTask"/>
<!-- an after-returning advice definition -->
<!--The doRequiredTask method must have parameter named retVal -->
<aop:after-returning PointCut-ref = "businessService"
returning = "retVal"
method = "doRequiredTask"/>
<!-- an after-throwing advice definition -->
<!--The doRequiredTask method must have parameter named ex -->
<aop:after-throwing PointCut-ref = "businessService"
throwing = "ex"
method = "doRequiredTask"/>
<!-- an around advice definition -->
<aop:around PointCut-ref = "businessService"
method = "doRequiredTask"/>
...
</aop:aspect>
</aop:config>
<bean id = "aBean" class = "...">
...
</bean>
Bạn có thể sử dụng cùng một doRequiredTaskhoặc các phương pháp khác nhau cho các lời khuyên khác nhau. Các phương thức này sẽ được định nghĩa là một phần của mô-đun khía cạnh.
Dựa trên @AspectJ
@AspectJ đề cập đến một kiểu khai báo các khía cạnh như các lớp Java thông thường được chú thích bằng các chú thích Java 5. Hỗ trợ @AspectJ được kích hoạt bằng cách đưa phần tử sau vào trong tệp cấu hình dựa trên lược đồ XML của bạn.
<aop:aspectj-autoproxy/>
Tuyên bố một khía cạnh
Các lớp Aspects giống như bất kỳ bean bình thường nào khác và có thể có các phương thức và trường giống như bất kỳ lớp nào khác, ngoại trừ việc chúng sẽ được chú thích bằng @Aspect như sau.
package org.xyz;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class AspectModule {
}
Chúng sẽ được cấu hình trong XML giống như bất kỳ bean nào khác như sau.
<bean id = "myAspect" class = "org.xyz.AspectModule">
<!-- configure properties of aspect here as normal -->
</bean>
Khai báo một PointCut
A PointCutgiúp xác định các điểm tham gia (tức là các phương pháp) quan tâm sẽ được thực hiện với các lời khuyên khác nhau. Trong khi làm việc với cấu hình dựa trên @AspectJ, khai báo PointCut có hai phần:
Một biểu thức PointCut xác định chính xác phương thức thực thi mà chúng tôi quan tâm.
Chữ ký PointCut bao gồm tên và bất kỳ số lượng tham số nào. Phần thân thực tế của phương thức này không liên quan và trên thực tế phải trống.
Ví dụ sau định nghĩa một PointCut có tên 'businessService' sẽ khớp với việc thực thi mọi phương thức có sẵn trong các lớp thuộc gói com.xyz.myapp.service.
import org.aspectj.lang.annotation.PointCut;
@PointCut("execution(* com.xyz.myapp.service.*.*(..))") // expression
private void businessService() {} // signature
Ví dụ sau định nghĩa một PointCut có tên 'getname' sẽ khớp với việc thực thi phương thức getName () có sẵn trong lớp Sinh viên trong gói com.tutorialspoint.
import org.aspectj.lang.annotation.PointCut;
@PointCut("execution(* com.tutorialspoint.Student.getName(..))")
private void getname() {}
Khai báo Advices
Bạn có thể khai báo bất kỳ lời khuyên nào trong số năm lời khuyên bằng cách sử dụng chú thích @ {ADVICE-NAME} như được cung cấp bên dưới. Điều này giả định rằng bạn đã xác định phương thức chữ ký PointCut businessService ().
@Before("businessService()")
public void doBeforeTask(){
...
}
@After("businessService()")
public void doAfterTask(){
...
}
@AfterReturning(PointCut = "businessService()", returning = "retVal")
public void doAfterReturnningTask(Object retVal){
// you can intercept retVal here.
...
}
@AfterThrowing(PointCut = "businessService()", throwing = "ex")
public void doAfterThrowingTask(Exception ex){
// you can intercept thrown exception here.
...
}
@Around("businessService()")
public void doAroundTask(){
...
}
Bạn có thể xác định nội tuyến PointCut cho bất kỳ lời khuyên nào. Sau đây là một ví dụ để xác định PointCut nội tuyến cho lời khuyên trước.
@Before("execution(* com.xyz.myapp.service.*.*(..))")
public doBeforeTask(){
...
}
Trong chương này, chúng tôi sẽ viết các ứng dụng AOP thực tế bằng Spring AOP Framework. Trước khi bắt đầu viết ví dụ đầu tiên bằng cách sử dụng Spring-WS framework, bạn phải đảm bảo rằng bạn đã thiết lập đúng môi trường Spring AOP như đã giải thích trong chương Spring Web Services - Environment Setup .
Bây giờ, hãy tiếp tục viết một Ứng dụng Spring AOP đơn giản giống như bảng điều khiển, ứng dụng này sẽ trình bày các khái niệm AOP.
Tạo một dự án
Step 1 - Mở bảng điều khiển lệnh, truy cập thư mục C: \ MVN và thực hiện như sau mvn chỉ huy.
C:\MVN>mvn archetype:generate -DgroupId = com.tutorialspoint -DartifactId = Student
-DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
Maven sẽ bắt đầu xử lý và sẽ tạo ra cấu trúc dự án ứng dụng Java hoàn chỉnh.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources
@ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources
@ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom --
-
[INFO] Generating project in Batch mode
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma
ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav
en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar (5 KB at 1.1 KB/s
ec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma
ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav
en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom (703 B at 1.2 KB/
sec)
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating project from Old (1.x) Archetype:
maven-archetype-quickstart:1.0
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: com.tutorialspoint
[INFO] Parameter: packageName, Value: com.tutorialspoint
[INFO] Parameter: package, Value: com.tutorialspoint
[INFO] Parameter: artifactId, Value: Student
[INFO] Parameter: basedir, Value: C:\MVN
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\MVN\Student
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:17 min
[INFO] Finished at: 2017-02-19T21:11:14+05:30
[INFO] Final Memory: 15M/114M
[INFO] ------------------------------------------------------------------------
Step 2- Vào thư mục C: / MVN. Bạn sẽ thấy một dự án ứng dụng Java được tạo, có tên là sinh viên (như được chỉ định trong ArtifactId). Cập nhật POM.xml để bao gồm các phụ thuộc Spring-AOP. Thêm các tệp MainApp.java, Student.java và Logging.java.
POM.xml
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>Student</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Student</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
</dependencies>
</project>
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
public void beforeAdvice() {
System.out.println("Going to setup student profile.");
}
/**
* This is the method which I would like to execute
* after a selected method execution.
*/
public void afterAdvice() {
System.out.println("Student profile has been setup.");
}
/**
* This is the method which I would like to execute
* when any method returns.
*/
public void afterReturningAdvice(Object retVal){
System.out.println("Returning:" + retVal.toString() );
}
/**
* This is the method which I would like to execute
* if there is an exception raised.
*/
public void AfterThrowingAdvice(IllegalArgumentException ex) {
System.out.println("There has been an exception: " + ex.toString());
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
student.printThrowException();
}
}
Step 3 - Thêm tệp cấu hình Beans.xml Dưới src > main > resources thư mục.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.*.*(..))"/>
<aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
<aop:after PointCut-ref = "selectAll" method = "afterAdvice"/>
<aop:after-returning PointCut-ref = "selectAll"
returning = "retVal"
method = "afterReturningAdvice"/>
<aop:after-throwing PointCut-ref = "selectAll"
throwing = "ex"
method = "AfterThrowingAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Step 4 - Mở bảng điều khiển lệnh, truy cập thư mục C: \ MVN và thực hiện như sau mvn chỉ huy.
C:\MVN>Student> mvn package
Maven sẽ bắt đầu xử lý và tải xuống các thư viện cần thiết.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Student 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven
-jar-plugin/2.4/maven-jar-plugin-2.4.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-
jar-plugin/2.4/maven-jar-plugin-2.4.pom (6 KB at 2.2 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven
-jar-plugin/2.4/maven-jar-plugin-2.4.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-
jar-plugin/2.4/maven-jar-plugin-2.4.jar (34 KB at 31.6 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-aop
/4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-aop/
4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.pom (3 KB at 3.7 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-bea
ns/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-bean
s/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.pom (3 KB at 4.1 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-cor
e/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.pom
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-core
/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.pom (3 KB at 4.0 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-aop
/4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.jar
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-cor
e/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.jar
Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-bea
ns/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.jar
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-aop/
4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.jar (351 KB at 43.9 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-bean
s/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.jar (685 KB at 37.5 KB/sec)
Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-core
/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.jar (982 KB at 47.1 KB/sec)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Student --
-
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\Student\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Student ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 1 source file to C:\MVN\Student\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ St
udent ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\Student\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ Student
---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 1 source file to C:\MVN\Student\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ Student ---
[INFO] Surefire report directory: C:\MVN\Student\target\surefire-reports
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/sure
fire-junit3/2.12.4/surefire-junit3-2.12.4.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/suref
ire-junit3/2.12.4/surefire-junit3-2.12.4.pom (2 KB at 1.3 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/sure
fire-junit3/2.12.4/surefire-junit3-2.12.4.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/suref
ire-junit3/2.12.4/surefire-junit3-2.12.4.jar (26 KB at 27.7 KB/sec)
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running com.tutorialspoint.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ Student ---
Downloading: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-al
pha-2/classworlds-1.1-alpha-2.jar
Downloaded: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-alp
ha-2/classworlds-1.1-alpha-2.jar (37 KB at 35.8 KB/sec)
[INFO] Building jar: C:\MVN\Student\target\Student-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.441 s
[INFO] Finished at: 2017-02-19T21:18:59+05:30
[INFO] Final Memory: 18M/109M
[INFO] ------------------------------------------------------------------------
Nhập dự án trong Eclipse
Step 1 - Mở Eclipse.
Step 2 - Chọn File → Import → Lựa chọn.
Step 3- Chọn Maven Projects Option. Nhấp vào nút Tiếp theo.
Step 4 - Chọn Vị trí dự án, nơi dự án Sinh viên được tạo bằng Maven.
Step 5 - Nhấp vào nút Kết thúc.
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Name : Zara
Student profile has been setup.
Returning:Zara
Going to setup student profile.
Age : 11
Student profile has been setup.
Returning:11
Going to setup student profile.
Exception raised
Student profile has been setup.
There has been an exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
at com.tutorialspoint.Student.printThrowException(Student.java:25)
at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:43) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$56a970f2.printThrowException(<generated>)
at com.tutorialspoint.MainApp.main(MainApp.java:16)
Tham gia điểm
JoinPoint đại diện cho một điểm trong ứng dụng của bạn nơi bạn có thể bổ sung khía cạnh AOP. Bạn cũng có thể nói, đó là vị trí thực tế trong ứng dụng nơi một hành động sẽ được thực hiện bằng cách sử dụng Spring AOP framework. Hãy xem xét các ví dụ sau:
Tất cả các lớp phương thức có trong (các) gói.
Một phương thức cụ thể của một lớp.
PointCut
PointCut là một tập hợp một hoặc nhiều JoinPoint, nơi một lời khuyên nên được thực thi. Bạn có thể chỉ định PointCuts bằng cách sử dụng các biểu thức hoặc mẫu như chúng ta sẽ thấy trong các ví dụ AOP của mình. Trong Spring, PointCut giúp sử dụng các JoinPoint cụ thể để áp dụng lời khuyên. Hãy xem xét các ví dụ sau:
biểu thức = "thực hiện (* com.tutorialspoint. *. * (..))"
biểu thức = "thực thi (* com.tutorialspoint.Student.getName (..))"
Cú pháp
<aop:config>
<aop:aspect id = "log" ref = "adviceClass">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
</aop:aspect>
</aop:config>
Ở đâu,
adviceClass - ref của lớp chứa các phương thức tư vấn
PointCut-id - id của PointCut
execution( expression ) - Các phương pháp bao hàm biểu đạt mà lời khuyên sẽ được áp dụng.
Để hiểu các khái niệm được đề cập ở trên liên quan đến JoinPoint và PointCut, chúng ta hãy viết một ví dụ sẽ triển khai một số PointCuts. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring.
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.*.*(..))"/>
<aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Khi bạn đã hoàn tất việc tạo tệp nguồn và tệp cấu hình bean, hãy chạy ứng dụng. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11
<Aop: pointcut> được định nghĩa ở trên chọn tất cả các phương thức được định nghĩa trong gói com.tutorialspoint. Giả sử, bạn muốn thực hiện lời khuyên của mình trước hoặc sau một phương thức cụ thể, bạn có thể xác định PointCut của mình để thu hẹp việc thực thi bằng cách thay thế dấu sao (*) trong định nghĩa PointCut bằng tên lớp và phương thức thực tế. Sau đây là một tệp cấu hình XML được sửa đổi để hiển thị khái niệm.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
<aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Name : Zara
Age : 11
Beforelà một loại lời khuyên đảm bảo rằng một lời khuyên chạy trước khi thực thi phương thức. Sau đây là cú pháp của lời khuyên trước.
Cú pháp
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:before PointCut-ref = "PointCut-id" method = "methodName"/>
</aop:aspect>
</aop:config>
Ở đâu,
PointCut-id - id của PointCut.
methodName - Tên phương thức của hàm được gọi trước một hàm được gọi.
Để hiểu các khái niệm nêu trên liên quan đến Trước khi Tư vấn, chúng ta hãy viết một ví dụ, sẽ thực hiện Trước khi Tư vấn. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring.
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
<aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn hoàn tất việc tạo tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Name : Zara
Age : 11
Afterlà một loại lời khuyên đảm bảo rằng một lời khuyên chạy sau khi thực thi phương thức. Sau đây là cú pháp của lời khuyên sau.
Cú pháp
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:after PointCut-ref = "PointCut-id" method = "methodName"/>
</aop:aspect>
</aop:config>
Ở đâu,
PointCut-id - id của PointCut.
methodName - Tên phương thức của hàm được gọi sau một hàm được gọi.
Để hiểu các khái niệm nêu trên liên quan đến Sau khi Tư vấn, chúng ta hãy viết một ví dụ sẽ thực hiện Tư vấn Sau. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring.
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* after a selected method execution.
*/
public void afterAdvice(){
System.out.println("Student profile setup complete.");
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.Student.getAge(..))"/>
<aop:after PointCut-ref = "selectAll" method = "afterAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn hoàn tất việc tạo tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, điều này sẽ in ra thông báo sau.
Name : Zara
Age : 11
Student profile setup complete.
Afterlà một loại lời khuyên đảm bảo rằng một lời khuyên chỉ chạy sau khi thực thi phương thức nếu phương thức hoàn tất thành công. Sau đây là cú pháp của lời khuyên sau.
Cú pháp
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:after-returning PointCut-ref = "PointCut-id"
returning = "retVal" method = "methodName"/>
</aop:aspect>
</aop:config>
Ở đâu,
PointCut-id - id của PointCut.
methodName - Tên phương thức của hàm được gọi sau khi một hàm được gọi trả về thành công.
Để hiểu các khái niệm nêu trên liên quan đến Lời khuyên sau khi trở lại, chúng ta hãy viết một ví dụ sẽ thực hiện lời khuyên Sau khi Trở lại. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring:
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* when any method returns.
*/
public void afterReturningAdvice(Object retVal){
System.out.println("Returning:" + retVal.toString() );
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
System.out.println("Exception raised");
throw new IllegalArgumentException();
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.*.*(..))"/>
<aop:after-returning PointCut-ref = "selectAll"
method = "afterReturningAdvice" returning = "retVal"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Name : Zara
Returning : Name
Age : 11
Exception raised
After-throwinglà một kiểu lời khuyên đảm bảo rằng một lời khuyên sẽ chạy sau khi thực thi phương thức, chỉ khi phương thức thoát bằng cách ném một ngoại lệ. Sau đây là cú pháp của lời khuyên sau khi ném.
Cú pháp
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:after-throwing PointCut-ref = "PointCut-id" throwing = "ex"
method = "methodName"/>
</aop:aspect>
</aop:config>
Ở đâu,
PointCut-id - id của PointCut.
ex - Ngoại lệ được ném.
methodName - Tên phương thức của hàm được gọi khi một hàm được gọi ném một ngoại lệ và thoát.
Để hiểu các khái niệm nêu trên liên quan đến Lời khuyên sau khi ném, chúng ta hãy viết một ví dụ sẽ thực hiện Lời khuyên sau khi ném. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring:
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
public class Logging {
/**
* This is the method which I would like to execute
* if there is an exception raised.
*/
public void afterThrowingAdvice(IllegalArgumentException ex) {
System.out.println("There has been an exception: " + ex.toString());
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.printThrowException();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectAll"
expression = "execution(* com.tutorialspoint.*.*(..))"/>
<aop:after-throwing PointCut-ref = "selectAll"
throwing = "ex" method = "afterThrowingAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Exception raised
There has been an exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
at com.tutorialspoint.Student.printThrowException(Student.java:25)
at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$8514cd8.printThrowException(<generated>)
at com.tutorialspoint.MainApp.main(MainApp.java:15)
Aroundlà một loại lời khuyên đảm bảo rằng một lời khuyên chạy trước và sau khi thực hiện phương thức. Sau đây là cú pháp của lời khuyên xung quanh.
Cú pháp
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "PointCut-id" expression = "execution( expression )"/>
<aop:around PointCut-ref = "PointCut-id" method = "methodName"/>
</aop:aspect>
</aop:config>
Ở đâu,
PointCut-id - id của PointCut.
methodName - Tên phương thức của hàm được gọi trước một hàm được gọi.
Để hiểu các khái niệm nêu trên liên quan đến Lời khuyên xung quanh, chúng ta hãy viết một ví dụ sẽ thực hiện Lời khuyên xung quanh. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring:
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class Logging {
/**
* This is the method which I would like to execute
* around a selected method execution.
*/
public String aroundAdvice(ProceedingJoinPoint jp) throws Throwable{
System.out.println("Around advice");
Object[] args = jp.getArgs();
if(args.length>0){
System.out.print("Arguments passed: " );
for (int i = 0; i < args.length; i++) {
System.out.print("arg "+(i+1)+": "+args[i]);
}
}
Object result = jp.proceed(args);
System.out.println("Returning " + result);
return result.toString();
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id = "log" ref = "logging">
<aop:PointCut id = "selectName"
expression = "execution(* com.tutorialspoint.Student.getName(..))"/>
<aop:around PointCut-ref = "selectName" method = "aroundAdvice"/>
</aop:aspect>
</aop:config>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Around advice
Name : Zara
Returning Zara
Hãy để chúng tôi viết một ví dụ sẽ triển khai lời khuyên bằng cách sử dụng cấu hình dựa trên Chú thích. Đối với điều này, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring.
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.PointCut;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.*.*(..))")
private void selectAll(){}
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("selectAll()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11
JoinPoint
JoinPoint đại diện cho một điểm trong ứng dụng của bạn nơi bạn có thể bổ sung khía cạnh AOP. Bạn cũng có thể nói, đó là vị trí thực tế trong ứng dụng nơi một hành động sẽ được thực hiện bằng cách sử dụng Spring AOP framework. Hãy xem xét các ví dụ sau:
Tất cả các lớp phương thức có trong (các) gói.
Một phương thức cụ thể của một lớp.
PointCut
PointCut là một tập hợp của một hoặc nhiều JoinPoint nơi một lời khuyên nên được thực thi. Bạn có thể chỉ định PointCuts bằng cách sử dụng các biểu thức hoặc mẫu như chúng ta sẽ thấy trong các ví dụ AOP của mình. Trong Spring, PointCut giúp sử dụng các JoinPoint cụ thể để áp dụng lời khuyên. Hãy xem xét các ví dụ sau:
@PointCut ("thực thi (* com.tutorialspoint. *. * (..))")
@PointCut ("thực thi (* com.tutorialspoint.Student.getName (..))")
Cú pháp
@Aspect
public class Logging {
@PointCut("execution(* com.tutorialspoint.*.*(..))")
private void selectAll(){}
}
Ở đâu,
@Aspect - Đánh dấu một lớp là một lớp chứa các phương thức tư vấn.
@PointCut - Đánh dấu một chức năng là một PointCut
execution( expression ) - Các phương pháp bao hàm biểu đạt mà lời khuyên sẽ được áp dụng.
Để hiểu các khái niệm được đề cập ở trên liên quan đến JoinPoint và PointCut, chúng ta hãy viết một ví dụ sẽ triển khai một số PointCuts. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring:
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.*.*(..))")
private void selectAll(){}
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("selectAll()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Name : Zara
Going to setup student profile.
Age : 11
@Pointcut được xác định ở trên sử dụng một biểu thức để chọn tất cả các phương thức được định nghĩa trong gói com.tutorialspoint. @Before lời khuyên sử dụng PointCut đã xác định ở trên làm tham số. Phương thức hiệu quả beforeAdvice () sẽ được gọi trước mọi phương thức nằm trong PointCut ở trên.
@Beforelà một loại lời khuyên đảm bảo rằng một lời khuyên chạy trước khi thực thi phương thức. Sau đây là cú pháp của @Before lời khuyên.
Cú pháp
@PointCut("execution(* com.tutorialspoint.Student.getName(..))")
private void selectGetName(){}
@Before("selectGetName()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
Ở đâu,
@PointCut - Đánh dấu một chức năng là một PointCut
execution( expression ) - Các phương pháp bao hàm biểu đạt mà lời khuyên sẽ được áp dụng.
@Before - Đánh dấu một hàm như một lời khuyên sẽ được thực thi trước (các) phương thức được PointCut bao gồm.
Để hiểu các khái niệm được đề cập ở trên liên quan đến @Before Tư vấn, chúng ta hãy viết một ví dụ sẽ thực hiện @Before Tư vấn. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring:
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.Student.getName(..))")
private void selectGetName(){}
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("selectGetName()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Name : Zara
Age : 11
@Pointcut được định nghĩa ở trên sử dụng một biểu thức để chọn phương thức getAge () được định nghĩa trong (các) lớp dưới gói com.tutorialspoint. @After lời khuyên sử dụng PointCut đã xác định ở trên làm tham số. Phương thức afterAdvice () hiệu quả sẽ được gọi trước mọi phương thức được PointCut nói trên.
@Afterlà một loại lời khuyên đảm bảo rằng một lời khuyên chạy sau khi thực thi phương thức. Sau đây là cú pháp của lời khuyên @After.
Cú pháp
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetName(){}
@After("selectGetAge()")
public void afterAdvice(){
System.out.println("Student profile setup completed.");
}
Ở đâu,
@PointCut - Đánh dấu một chức năng là một PointCut
execution( expression ) - Các phương pháp bao hàm biểu đạt mà lời khuyên sẽ được áp dụng.
@After - Đánh dấu một hàm như một lời khuyên sẽ được thực thi trước (các) phương thức được PointCut bao gồm.
Để hiểu các khái niệm được đề cập ở trên liên quan đến Lời khuyên sau @, hãy để chúng tôi viết một ví dụ sẽ thực hiện Tư vấn sau lời khuyên. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring.
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.After;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetAge(){}
/**
* This is the method which I would like to execute
* after a selected method execution.
*/
@After("selectGetAge()")
public void afterAdvice(){
System.out.println("Student profile setup completed.");
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Name : Zara
Age : 11
Student profile setup completed.
@Pointcut được định nghĩa ở trên sử dụng một biểu thức để chọn phương thức getAge () được định nghĩa trong (các) lớp dưới gói com.tutorialspoint. @After lời khuyên sử dụng PointCut đã xác định ở trên làm tham số. Phương thức afterAdvice () hiệu quả sẽ được gọi trước mọi phương thức được PointCut nói trên.
@AfterReturninglà một loại lời khuyên, đảm bảo rằng một lời khuyên chạy sau khi phương thức thực thi thành công. Sau đây là cú pháp của lời khuyên @AfterReturning.
Cú pháp
@AfterReturning(PointCut = "execution(* com.tutorialspoint.Student.*(..))",
returning = "retVal")
public void afterReturningAdvice(JoinPoint jp, Object retVal){
System.out.println("Method Signature: " + jp.getSignature());
System.out.println("Returning:" + retVal.toString() );
}
Ở đâu,
@AfterReturning - Đánh dấu một hàm là lời khuyên sẽ được thực thi trước (các) phương thức được PointCut bao phủ, nếu phương thức trả về thành công.
PointCut - Cung cấp một biểu thức để chọn một hàm
execution( expression ) - Các phương pháp bao hàm biểu đạt mà lời khuyên sẽ được áp dụng.
returning - Tên của biến được trả về.
Để hiểu các khái niệm được đề cập ở trên liên quan đến Tư vấn @AfterReturning, chúng ta hãy viết một ví dụ để thực hiện Tư vấn @AfterReturning. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring.
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
@Aspect
public class Logging {
/**
* This is the method which I would like to execute
* after a selected method execution.
*/
@AfterReturning(PointCut = "execution(* com.tutorialspoint.Student.*(..))",
returning = "retVal")
public void afterReturningAdvice(JoinPoint jp, Object retVal){
System.out.println("Method Signature: " + jp.getSignature());
System.out.println("Returning:" + retVal.toString() );
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Age : 11
Method Signature: Integer com.tutorialspoint.Student.getAge()
Returning 11
@AfterThrowinglà một loại lời khuyên đảm bảo rằng một lời khuyên sẽ chạy nếu phương thức đưa ra một ngoại lệ. Sau đây là cú pháp của lời khuyên @AfterThrowing.
Cú pháp
@AfterThrowing(PointCut = "execution(* com.tutorialspoint.Student.*(..))",
throwing = "error")
public void afterThrowingAdvice(JoinPoint jp, Throwable error){
System.out.println("Method Signature: " + jp.getSignature());
System.out.println("Exception: "+error);
}
Ở đâu,
@AfterThrowing - Đánh dấu một hàm là một lời khuyên sẽ được thực thi trước (các) phương thức được PointCut bao phủ, nếu phương thức ném ra một ngoại lệ.
PointCut - Cung cấp một biểu thức để chọn một hàm.
execution( expression ) - Các phương pháp bao hàm biểu đạt mà lời khuyên sẽ được áp dụng.
throwing - Tên của ngoại lệ được trả lại.
Để hiểu các khái niệm được đề cập ở trên liên quan đến Tư vấn @AfterThrowing, chúng ta hãy viết một ví dụ sẽ thực hiện Tư vấn @AfterThrowing. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring.
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
@Aspect
public class Logging {
/**
* This is the method which I would like to execute
* after a selected method execution throws exception.
*/
@AfterThrowing(PointCut = "execution(* com.tutorialspoint.Student.*(..))",
throwing = "error")
public void afterThrowingAdvice(JoinPoint jp, Throwable error){
System.out.println("Method Signature: " + jp.getSignature());
System.out.println("Exception: "+error);
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.printThrowException();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Exception raised
Method Signature: void com.tutorialspoint.Student.printThrowException()
Exception: java.lang.IllegalArgumentException
Exception in thread "main" java.lang.IllegalArgumentException
at com.tutorialspoint.Student.printThrowException(Student.java:25)
at com.tutorialspoint.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
at com.tutorialspoint.Student$$EnhancerBySpringCGLIB$$99b0a988.printThrowException(<generated>)
at com.tutorialspoint.MainApp.main(MainApp.java:13)
@Aroundlà một loại lời khuyên, đảm bảo rằng một lời khuyên có thể chạy trước và sau khi thực thi phương thức. Sau đây là cú pháp của lời khuyên @Around.
Cú pháp
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetName(){}
@Around("selectGetAge()")
public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("Around advice");
Object[] args = jp.getArgs();
if(args.length>0){
System.out.print("Arguments passed: " );
for (int i = 0; i < args.length; i++) {
System.out.print("arg "+(i+1)+": "+args[i]);
}
}
Object result = jp.proceed(args);
System.out.println("Returning " + result);
return result.toString();
}
Ở đâu,
@PointCut - Đánh dấu một chức năng là một PointCut
execution( expression ) - Các phương pháp bao hàm biểu đạt mà lời khuyên sẽ được áp dụng.
@Around - Đánh dấu một hàm như một lời khuyên sẽ được thực thi trước (các) phương thức được PointCut bao gồm.
Để hiểu các khái niệm được đề cập ở trên liên quan đến Tư vấn @Around, chúng ta hãy viết một ví dụ sẽ triển khai Tư vấn @Around. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring:
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetAge(){}
/**
* This is the method which I would like to execute
* around a selected method execution.
*/
@Around("selectGetAge()")
public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("Around advice");
Object[] args = proceedingJoinPoint.getArgs();
if(args.length>0){
System.out.print("Arguments passed: " );
for (int i = 0; i < args.length; i++) {
System.out.print("arg "+(i+1)+": "+args[i]);
}
}
Object result = proceedingJoinPoint.proceed(args);
System.out.println("Returning " + result);
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Around advice
Age : 11
Returning 11
Cho đến nay, chúng tôi đã khai báo các khía cạnh sử dụng <aop:config> hoặc là < aop:aspectj-autoproxy>. Chúng ta có thể tạo proxy theo chương trình cũng như gọi các khía cạnh theo lập trình bằng đối tượng proxy.
Cú pháp
//Create object to be proxied
Student student = new Student();
//Create the Proxy Factory
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student);
//Add Aspect class to the factory
proxyFactory.addAspect(Logging.class);
//Get the proxy object
Student proxyStudent = proxyFactory.getProxy();
//Invoke the proxied method.
proxyStudent.getAge();
Ở đâu,
AspectJProxyFactory - Lớp Factory để tạo một đối tượng proxy.
Logging.class - Class of the Aspect chứa lời khuyên.
Student - Hạng thương gia được tư vấn.
Để hiểu các khái niệm đã đề cập ở trên liên quan đến proxy, chúng ta hãy viết một ví dụ sẽ triển khai proxy. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring:
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.PointCut;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Logging {
/** Following is the definition for a PointCut to select
* all the methods available. So advice will be called
* for all the methods.
*/
@PointCut("execution(* com.tutorialspoint.Student.getAge(..))")
private void selectGetAge(){}
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("selectGetAge()")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
//Create the Proxy Factory
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(student);
//Add Aspect class to the factory
proxyFactory.addAspect(Logging.class);
//Get the proxy object
Student proxyStudent = proxyFactory.getProxy();
//Invoke the proxied method.
proxyStudent.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Age : 11
Theo các biểu thức PointCut, có thể có trường hợp chúng được áp dụng cho một số bean khác mà không có ý định đưa ra lời khuyên. Ví dụ, hãy xem xét biểu thức sau.
execution(* com.tutorialspoint.*.getAge(..))
Một spring bean mới được thêm vào với phương thức getAge () và lời khuyên sẽ bắt đầu được áp dụng cho nó mặc dù nó có thể không được dự định. Để đạt được điều này, chúng ta có thể tạo chú thích tùy chỉnh và chú thích các phương pháp áp dụng lời khuyên.
@Before("@annotation(com.tutorialspoint.Loggable)")
Để hiểu các khái niệm được đề cập ở trên liên quan đến @Before Tư vấn, chúng ta hãy viết một ví dụ sẽ thực hiện @Before Tư vấn. Để viết ví dụ của chúng tôi với một vài lời khuyên, hãy để chúng tôi có một IDE Eclipse đang hoạt động tại chỗ và sử dụng các bước sau để tạo một ứng dụng Spring.
Bươc | Sự miêu tả |
---|---|
1 | Cập nhật dự án Sinh viên đã tạo theo chương Spring AOP - Ứng dụng . |
2 | Cập nhật cấu hình bean và chạy ứng dụng như được giải thích bên dưới. |
Sau đây là nội dung của Logging.javatập tin. Đây thực sự là một mẫu mô-đun khía cạnh, xác định các phương thức được gọi ở các điểm khác nhau.
package com.tutorialspoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Logging {
/**
* This is the method which I would like to execute
* before a selected method execution.
*/
@Before("@annotation(com.tutorialspoint.Loggable)")
public void beforeAdvice(){
System.out.println("Going to setup student profile.");
}
}
Sau đây là nội dung của Loggable.java tập tin -
package com.tutorialspoint;
public @interface Loggable {
}
Sau đây là nội dung của Student.java tập tin.
package com.tutorialspoint;
public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
System.out.println("Age : " + age );
return age;
}
public void setName(String name) {
this.name = name;
}
@Loggable
public String getName() {
System.out.println("Name : " + name );
return name;
}
public void printThrowException(){
System.out.println("Exception raised");
throw new IllegalArgumentException();
}
}
Sau đây là nội dung của MainApp.java tập tin.
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
}
}
Sau đây là tệp cấu hình Beans.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop = "http://www.springframework.org/schema/aop"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:aspectj-autoproxy/>
<!-- Definition for student bean -->
<bean id = "student" class = "com.tutorialspoint.Student">
<property name = "name" value = "Zara" />
<property name = "age" value = "11"/>
</bean>
<!-- Definition for logging aspect -->
<bean id = "logging" class = "com.tutorialspoint.Logging"/>
</beans>
Chạy dự án
Sau khi bạn tạo xong tệp nguồn và cấu hình, hãy chạy ứng dụng của bạn. Nhấp chuột phải vào MainApp.java trong ứng dụng của bạn và sử dụngrun as Java Applicationchỉ huy. Nếu mọi thứ đều ổn với ứng dụng của bạn, nó sẽ in ra thông báo sau.
Going to setup student profile.
Name : Zara
Age : 11