看本篇文章之前,必须要了解动态代理的相关知识,
如果不了解,请点击:https://blog.csdn.net/weixin_42275175/article/details/98044391
aspectj是一个Aop组织提供的面向切面编程框架。
使用方法:a:用户自己开发自己的业务类和业务方法
b:用户自己开发自己的增强逻辑,增强逻辑可以卸载一个普通的Advice类中
c:配置一个配置文件,告诉aspectJ,为哪些业务方法增加哪些业务逻辑。
一)手动创建一个Java工程
建成下面的结构层次
Userservice代码
void deleteUserById(int id);
UserServiceImpl代码
@Override
public void deleteUserById(int id) {
// 模仿mybatis删除用户
System.out.println("通过id删除用户1");
System.out.println("通过id删除用户2");
}
ServiceAdvice代码
/**
* 前置增强的方法 @Title: before @Description: TODO @param @return void @throws
*/
public void before() {
System.out.println("开启事务");
}
public void after() {
System.out.println("提交事务");
}
二)导入全部jar,我提供的jar比较多,直接导入不考虑
jar下载地址:链接:https://pan.baidu.com/s/1dfQKsKabzMplKHd3rWrOcg
提取码:pw5b
三)目标:使用aop,生成动态代理对象,先运行前置增强方法 ,在运行原业务类方法, 最后运行:后置增强方法
先配置spring-aop.xml文件
【创建对象,配置aop框架(指定切面实例,具体切面表达式,配置增强)】
a:使用aop创建对象
<!-- 对象已经创建 -->
<bean id="UserService" class="com.oracle.aop.service.impl.UserServiceImpl"></bean>
<bean id="ServiceAdvice" class="com.oracle.zop.advice.ServiceAdvice"></bean>
b:指定aop切面配置,定义一个切面实例
<aop:config>
<!-- 指定aop切面配置,定义一个切面实例 -->
<aop:aspect ref="ServiceAdvice">
<!-- pointcut 具体切面的表达式 -->
<aop:pointcut expression="execution(* com.oracle.aop.service.impl.*.*(..))" id="serviceCut"/>
<!-- 配置增强 -->
<aop:before method="before" pointcut-ref="serviceCut"/>
<aop:after method="after" pointcut-ref="serviceCut"/>
</aop:aspect>
</aop:config>
四)编写一个测试类
public static void main(String[] args) {
//创建ClassPathXmlApplicationContext对象
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring-aop.xml");
UserService userService=context.getBean(UserService.class);
userService.deleteUserById(1);
}
运行代码:当出现下图代表成功
好,开始总结
!!!!!!!!!!!!!!!!!!!!!!前方高能!!!!!!!!!!!!!!!!!!!!!!!!!!
这时候的userService已经是UserServiceImpl类的一个动态代理对象了
aop的实现过程:当ioc容器在实例化bean的时候,如果该bean满足切面配置,spring的IOC默认会使用jdk的动态代理,
来创建一个动态代理对象,根据切面的增强配置,先进行前置增强,在运行业务类方法,在进行后置增强。
如果原来业务类不实现接口的话,必须要手动指定spring用cglib进行动态代理
一)添加ar
jar:链接:https://pan.baidu.com/s/110YS8s6SzutkUUb2g5TEDA
二)在spring-aop中强制开启使用cglib进行动态代理
<!-- 强制使用cglib生动态代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
取消掉UserserviceImpl实现UserService
运行测试。发现就会使用cglib了
完整项目下载路径
链接:https://pan.baidu.com/s/1futkEQ3Erbipavw359WK1Q
提取码:35jo
复制这段内容后打开百度网盘手机App,操作更方便哦