项目结构
具体步骤
1、创建maven 项目 导入依赖 创建好项目结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
< dependencies >
< dependency >
< groupId >org.projectlombok</ groupId >
< artifactId >lombok</ artifactId >
< version >1.18.18</ version >
</ dependency >
< dependency >
< groupId >junit</ groupId >
< artifactId >junit</ artifactId >
< version >4.12</ version >
< scope >test</ scope >
</ dependency >
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-context</ artifactId >
< version >5.3.4</ version >
</ dependency >
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-beans</ artifactId >
< version >5.3.4</ version >
</ dependency >
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-core</ artifactId >
< version >5.3.4</ version >
</ dependency >
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-expression</ artifactId >
< version >5.3.4</ version >
</ dependency >
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-aop</ artifactId >
< version >5.3.4</ version >
</ dependency >
< dependency >
< groupId >org.aspectj</ groupId >
< artifactId >aspectjweaver</ artifactId >
< version >1.9.6</ version >
</ dependency >
< dependency >
< groupId >org.aspectj</ groupId >
< artifactId >aspectjrt</ artifactId >
< version >1.9.6</ version >
</ dependency >
</ dependencies >
|
2、写一个TestDao接口 及实现类
1
2
3
4
5
6
7
8
9
10
11
|
/**
* @version 1.0
* @author: crush
* @date: 2021-03-05 10:26
*/
public interface TestDao {
public void sayHello();
public void save();
public void modify();
public void delete();
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/**
* @version 1.0
* @author: crush
* @date: 2021-03-05 10:27
*/
public class TestDaoImpl implements TestDao {
public void sayHello() {
System.out.println( "正在执行的方法-->武汉加油!中国加油!" );
}
public void save() {
System.out.println( "正在执行的方法-->保存" );
}
public void modify() {
System.out.println( "正在执行的方法-->修改" );
}
public void delete() {
System.out.println( "正在执行的方法-->删除" );
}
}
|
3、编写切面类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/**
* @version 1.0
* @author: crush
* @date: 2021-03-10 17:12
*/
public class MyAspectXml {
/**
* 前置通知 使用JoinPoint 接口作为参数获得目标对象的信息
**/
public void before(JoinPoint jp){
System.out.print( "前置通知:模拟权限控制 " );
System.out.println( "目标对象:" +jp.getTarget()+ ",被增强的方法:" +jp.getSignature().getName());
}
public void afterReturning(JoinPoint jp){
System.out.print( "后置返回通知:" + "模拟删除临时文件" );
System.out.println( ",被增强的方法" +jp.getSignature().getName());
}
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println( "环绕开始:执行目标方法前,模拟开启事务" );
Object obj = pjp.proceed();
System.out.println( "环绕结束:执行目标方法后,模拟关闭事务" );
return obj;
}
public void except(Throwable throwable){
System.out.println( "异常通知:" + "程序执行异常" +throwable.getMessage());
}
public void after(){
System.out.println( "最终通知:释放资源" );
}
}```
### 4 、application.xml文件
```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"
xmlns:context= "http://www.springframework.org/schema/context"
xsi:schemaLocation="http: //www.springframework.org/schema/beans
http: //www.springframework.org/schema/beans/spring-beans.xsd
http: //www.springframework.org/schema/aop
https: //www.springframework.org/schema/aop/spring-aop.xsd
http: //www.springframework.org/schema/context
https: //www.springframework.org/schema/context/spring-context.xsd">
<!--
<aop:aspectj-autoproxy />
声明自动为spring容器中那些配置 @aspectJ 切面的bean创建代理,织入切面。
proxy-target- class 属性,默认为 false ,表示使用jdk动态代理织入增强,
为 true 时: 表示使用CGLib动态代理技术织入增强。
-->
<aop:aspectj-autoproxy proxy-target- class = "true" />
<bean id= "testDaoImpl" class = "com.dao.TestDaoImpl" />
<bean id= "myAspectXML" class = "com.aspect.MyAspectXml" />
<!-- <bean id= "myAspectXML2" class = "com.aspect.MyAspectXml2" />-->
<!--
补充:<aop:pointcut>如果位于<aop:aspect>元素中,则命名切点只能被当前<aop:aspect>内定义的元素访问到,
为了能被整个<aop:config>元素中定义的所有增强访问,则必须在<aop:config>下定义切点。
-->
<aop:config>
<!--切入点 execution 表达式 通过这个表达式筛选连接点 -->
<aop:pointcut id= "myPointCut" expression= "execution(* com.dao.*.*(..))" />
<aop:aspect ref= "myAspectXML" >
<!--aop:after 是表示 这个方法是那种通知类型after 是方法之后
method= "after" 这个after是切面类中的方法 -->
<aop:after method= "after" pointcut-ref= "myPointCut" />
<aop:before method= "before" pointcut-ref= "myPointCut" />
<aop:after-returning method= "afterReturning" pointcut-ref= "myPointCut" />
<aop:after-throwing method= "except" throwing= "throwable" pointcut-ref= "myPointCut" />
<aop:around method= "around" pointcut-ref= "myPointCut" />
</aop:aspect>
</aop:config>
</beans>
|
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@Test
public void Test(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml" );
TestDao testDao = applicationContext.getBean( "testDaoImpl" , TestDaoImpl. class );
testDao.save();
/**
* 输出:
* 前置通知:模拟权限控制 目标对象:com.dao.TestDaoImpl@704f1591,被增强的方法:save
* 环绕开始:执行目标方法前,模拟开启事务
* 正在执行的方法-->保存
* 环绕结束:执行目标方法后,模拟关闭事务
* 后置返回通知:模拟删除临时文件,被增强的方法save
* 最终通知:释放资源
*/
}
|
总结
本篇文章就到这里了,希望能给你带来帮助,也希望能够您能够关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/weixin_45821811/article/details/118054409