AOP(Aspect Oriented Programming)- 面向切面编程
是通过预编译方式和运行期间动态代理实现程序统一维护的技术
注意添加org.aspectj
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ityuyu</groupId>
<artifactId>SpringDemo-07-AOP</artifactId>
<version>1.0-SNAPSHOT</version>
<name>SpringDemo-07-AOP</name>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.7.1</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
TargetInterface
package com.ityuyu.aop;
/**
* @ClassName TargetInterface
* @Description: TODO
* @Author: YuYu_123844@outlook.com
*/
public interface TargetInterface {
void Test();
}
Target
package com.ityuyu.aop;
/**
* @ClassName Target
* @Description: TODO
* @Author: YuYu_123844@outlook.com
*/
public class Target implements TargetInterface{
@Override
public void Test() {
System.out.println("Test is running....");
}
}
MyAspect
package com.ityuyu.aop;
/**
* @ClassName MyAspect
* @Description: TODO
* @Author: YuYu_123844@outlook.com
*/
public class MyAspect {
public void before(){
System.out.println("before is running ....");
}
public void after(){
System.out.println("after is running ....");
}
}
6 - 创建核心配置文件ApplicationContext
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--目标对象-->
<bean id="target" class="com.ityuyu.aop.Target"/>
<!--切面对象-->
<bean id="myAspect" class="com.ityuyu.aop.MyAspect"/>
<!--织入过程 - 那些切点(方法)需要进行那些增强(前置、后置...)-->
<aop:config>
<!--声明切面-->
<aop:aspect ref="myAspect">
<!--切面 = 切点 + 通知-->
<aop:before method="before" pointcut="execution(public void com.ityuyu.aop.Target.Test())"/>
<aop:after method="after" pointcut="execution(public void com.ityuyu.aop.Target.Test())"/>
</aop:aspect>
</aop:config>
</beans>
7 - 在test包中创建测试类AopRunTest
package com.ityuyu;
import com.ityuyu.aop.TargetInterface;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @ClassName AopRunTest
* @Description: TODO
* @Author: YuYu_123844@outlook.com
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:ApplicationContext.xml")
public class AopRunTest {
@Autowired
private TargetInterface target;
@Test
public void Test01(){
target.Test();
}
}
execution([修饰符] 返回值类型 包名.类名.方法名(参数类型))
通知类型
通知配置语法:<aop:通知类型 method:"切面类中的方法名" pointcut="切点表达式"/>
名称
标签
说明
前置通知
<aop:before>
指定目标方法执行之前
后置通知
<aop:returning>
指定目标方法执行之后
环绕通知
<aop:around>
指定目标方法执行之前、之后都执行; ProceedingJoinPoint 作为形参
异常抛出通知
<aop:after-throwing>
指定目标方法出现异常时
最终通知
<aop:after>
各种情况都会执行
TargetInterface接口
@Override
public void Test03(ProceedingJoinPoint point) throws Throwable {
System.out.println("around before is running....");
point.proceed();
System.out.println("around after is running....");
}
Target目标对象
package com.ityuyu.aop;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* @ClassName Target
* @Description: TODO
* @Author: YuYu_123844@outlook.com
*/
public class Target implements TargetInterface{
@Override
public void Test01() {
System.out.println("Test01 is running....");
}
@Override
public void Test02() {
System.out.println("Test02 is running....");
}
}
MyAspect切面类
package com.ityuyu.aop;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* @ClassName MyAspect
* @Description: TODO
* @Author: YuYu_123844@outlook.com
*/
public class MyAspect {
public void before(){
System.out.println("before is running ....");
}
public void after(){
System.out.println("after is running ....");
}
public void around(ProceedingJoinPoint point) throws Throwable {
System.out.println("around before is running....");
point.proceed(); // 调用的是目标对象当中的需要增强的目标方法
System.out.println("around after is running....");
}
}
AopRunTest测试类
package com.ityuyu;
import com.ityuyu.aop.TargetInterface;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @ClassName AopRunTest
* @Description: TODO
* @Author: YuYu_123844@outlook.com
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:ApplicationContext.xml")
public class AopRunTest {
@Autowired
private TargetInterface target;
@Test
public void Test01(){
target.Test01();
target.Test02();
}
}
核心配置文件ApplicationContext
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--目标对象-->
<bean id="target" class="com.ityuyu.aop.Target"/>
<!--切面对象-->
<bean id="myAspect" class="com.ityuyu.aop.MyAspect"/>
<!--织入过程 - 那些切点(方法)需要进行那些增强(前置、后置...)-->
<aop:config>
<!--声明切面-->
<aop:aspect ref="myAspect">
<!--切面 = 切点 + 通知-->
<!-- <aop:before method="before" pointcut="execution(public void com.ityuyu.aop.*.*(..))"/>-->
<!-- <aop:after method="after" pointcut="execution(public void com.ityuyu.aop.*.*(..))"/>-->
<aop:around method="around" pointcut="execution(public void com.ityuyu.aop.*.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
10 - 核心配置的另一种写法(简化版)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
<!--目标对象-->
<bean id="target" class="com.ityuyu.aop.Target"/>
<!--切面对象-->
<bean id="myAspect" class="com.ityuyu.aop.MyAspect"/>
<!--织入过程 - 那些切点(方法)需要进行那些增强(前置、后置...)-->
<aop:config>
<aop:pointcut id="myPointCut" expression="execution(public void com.ityuyu.aop.*.*(..))"/>
<!--声明切面-->
<aop:aspect ref="myAspect">
<!--切面 = 切点 + 通知-->
<!-- <aop:before method="before" pointcut="execution(public void com.ityuyu.aop.*.*(..))"/>-->
<!-- <aop:after method="after" pointcut="execution(public void com.ityuyu.aop.*.*(..))"/>-->
<!-- <aop:around method="around" pointcut="execution(public void com.ityuyu.aop.*.*(..))"/>-->
<!-- /////////////-->
<aop:before method="before" pointcut-ref="myPointCut"/>
<aop:after method="after" pointcut-ref="myPointCut"/>
<aop:around method="around" pointcut-ref="myPointCut"/>
</aop:aspect>
</aop:config>
</beans>
。。。。。下一节 通过XML来实现AOP
原网址: 访问
创建于: 2022-10-12 17:10:50
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论