spring aop两种实现方式,springaop怎么实现
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
引入面向切面编程(面向方面的编程的缩写)相关的冲突包
属国
groupIdorg.springframework/groupId
artifactId spring-AOP/artifactId
version5.1.12.RELEASE/version
/依赖关系
属国
groupIdorg.aspectj/groupId
artifactIdaspectjweaver/artifactId
版本1 .9 .4/版本
/dependencytransferserviceimpl。爪哇文件:
包com。拉勾。edu。服务。impl
导入com。拉勾。edu。道。账户道;
导入com。拉勾。edu。POJO。账户;
导入com。拉勾。edu。服务。转移服务;
导入com。拉勾。edu。utils。连接实用程序;
导入com。拉勾。edu。utils。交易经理;
导入org。spring框架。豆子。工厂。注释。自动连线;
导入org。spring框架。豆子。工厂。注释。限定符;
导入组织。spring框架。语境。注释。导入资源;
导入org。spring框架。刻板印象。组件;
导入org。spring框架。刻板印象。服务;
/**
* @作者应癫
*/
@Service(transferService )
公共类TransferServiceImpl实现TransferService {
//最佳状态
//@自动连线按照类型注入,如果按照类型无法唯一锁定对象,可以结合@限定符指定具体的编号
@自动连线
@限定符(“帐道”)
私人帐户大刀帐户道;
@覆盖
公共无效转账(从卡号字符串,到卡号字符串,int money)抛出异常{
/*尝试{
//开启事务(关闭事务的自动提交)
TransactionManager.getInstance().开始事务();*/
System.out.println(执行转账业务逻辑);
账户自=账户道。queryaccountbycardno(来自cardno);
帐户到=帐户到。queryaccountbycardno(toCardNo);
从。设置货币(从。获得金钱()-金钱);
敬。把钱(给)。弄钱()钱);
帐道。updateaccountbycardno(to);
//int c=1/0;
帐道。updateaccountbycardno(from);
}
}打印日志实用工具:
包com。拉勾。edu。utils
/**
* @作者应癫
*/
公共类LogUtils {
/**
* 业务逻辑开始之前执行
*/
公共void beforeMethod(连接点连接点){
object[]args=连接点。get args();
for(int I=0;我参数。长度;i ) {
object arg=args[I];
系统。出去。println(arg);
}
System.out.println(业务逻辑开始执行之前执行.);
}
/**
* 业务逻辑结束时执行(无论异常与否)
*/
public void afterMethod() {
System.out.println(业务逻辑结束时执行,无论异常与否都执行.);
}
/**
* 异常时时执行
*/
公共void exceptionMethod() {
System.out.println(异常时执行.);
}
/**
* 业务逻辑正常时执行
*/
公共void成功方法(对象retVal){
System.out.println(业务逻辑正常时执行.);
}
}
公共对象环绕方法(前进连接点前进连接点)抛出可投掷的
System.out.println(环绕通知中的"在方法之前…");
对象结果=空
尝试{
//控制原有业务逻辑是否执行
//result=proceedingjoinpoint。继续进行(proceedingjoinpoint。get args());
}catch(异常e) {
System.out.println(环绕通知中的异常方法.);
}最后{
System.out.println(环绕通知中的"在方法之后…");
}
返回结果;
}应用程序上下文。可扩展标记语言
!-进行面向切面编程(面向方面的编程的缩写)相关的可扩展标记语言配置,配置面向切面编程(面向方面的编程的缩写)的过程其实就是把面向切面编程(面向方面的编程的缩写)相关术语落地-
!-横切逻辑豆子-
bean id= logUtils class= com。拉勾。edu。utils。logUtils /bean
!-使用配置标签表明开始面向切面编程(面向方面的编程的缩写)配置,在内部配置切面方面-
!-纵横比=切入点(锁定方法)方位点(锁定方法中的特殊时机)横切逻辑-
aop:配置
aop:方面id=logAspect ref=logUtils
!-切入点锁定我们感兴趣的方法,使用实现语法表达式-
!-.参数中的两个点表示可以有参数,也可以没有参数,有的话也可以是任意类型,参数中的*表示参数可以是任意类型,但必须有参数。 -
!-包名中的.两个点表示中间可以是任意层-
!- aop:切入点id=pt1 表达式=执行(* *.*.*(.))/-
AOP:切入点id= pt1 表达式= execution(public void com。拉勾。edu。服务。impl。transferserviceimpl。transfer(java.lang.String,java。郎。string,int))/
!-AOP:切入点id= pt1 表达式=执行(* com。拉勾。edu。服务。impl。transferserviceimpl。*(.))/
-
!-方位信息,切入点引用关联切入点-
!- aop:之前前置通知/增强-
aop:在方法之前=beforeMethod 切入点-ref=pt1/
!- aop:之后,最终通知,无论如何都执行-
!- aop:返回后,正常执行通知,返回值是接受方法的返回值的-
AOP:返回后的方法=成功方法返回= retValue /
!- aop:抛后,异常通知-
AOP:around方法=“around方法”切入点-ref=pt1/
/aop:方面
/aop:config -测试:
/**
* 测试xml aop
*/
@测试
公共void testXmlAop()引发异常{
classpathmlaplicationcontext应用程序上下文=new classpathmlaplicationcontext(类路径:应用程序上下文。XML’);
传输服务传输服务=应用程序上下文。获取bean(传输服务。类);
接送服务。转账( 6029621011000 , 6029621011001 ,100);
}环绕通知不和前置及后置通知一起使用,因为环绕通知可以实现前置和后置的功能,并且可以控制原有业务逻辑是否执行,非常强大。
XML+注解方式
将上面纯可扩展置标语言方式改为注解方式
将应用程序上下文。可扩展标记语言中的内容取掉,改为类中添加注解:
包com。拉勾。edu。utils
导入org。AspectJ。郎。连接点;
导入org。AspectJ。郎。proceedingjoinpoint
导入org。AspectJ。郎。注释。*;
导入org。spring框架。刻板印象。组件;
/**
* @作者应癫
*/
@组件
@Aspect
公共类LogUtils {
@ Pointcut(执行(* com。拉勾。edu。服务。impl。transferserviceimpl。*(.)))
公共void pt1(){
}
/**
* 业务逻辑开始之前执行
*/
@Before(pt1())
公共void beforeMethod(连接点连接点){
object[]args=连接点。get args();
for(int I=0;我参数。长度;i ) {
object arg=args[I];
系统。出去。println(arg);
}
System.out.println(业务逻辑开始执行之前执行.);
}
/**
* 业务逻辑结束时执行(无论异常与否)
*/
@After(pt1())
public void afterMethod() {
System.out.println(业务逻辑结束时执行,无论异常与否都执行.);
}
/**
* 异常时时执行
*/
@AfterThrowing(pt1())
公共void exceptionMethod() {
System.out.println(异常时执行.);
}
/**
* 业务逻辑正常时执行
*/
@AfterReturning(value=pt1(),returning=retVal )
公共void成功方法(对象retVal){
System.out.println(业务逻辑正常时执行.);
}
/**
* 环绕通知
*
*/
/* @左右( pt1())*/
公共对象环绕方法(前进连接点前进连接点)抛出可投掷的
System.out.println(环绕通知中的"在方法之前…");
对象结果=空
尝试{
//控制原有业务逻辑是否执行
//result=proceedingjoinpoint。继续进行(proceedingjoinpoint。get args());
}catch(异常e) {
System.out.println(环绕通知中的异常方法.);
}最后{
System.out.println(环绕通知中的"在方法之后…");
}
返回结果;
}
}在application.xml中配置注解驱动:
!-开启面向切面编程(面向方面的编程的缩写)注解驱动
代理目标类:真强制使用字节码生成
-
AOP:AspectJ-自动代理/纯注解模式
我们只需要替换掉可扩展标记语言注解模式中的注解驱动的部分即可,
将
!-开启面向切面编程(面向方面的编程的缩写)注解驱动
代理目标类:真强制使用字节码生成
-
Aop:aspectj-autoproxy/改为@EnableAspectJAutoProxy //打开spring对annotation AOP的支持,将其添加到项目中的任意配置类。
推荐教程:以上《Java教程》是SpringAOP的三种实现方法的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。