spring-04

本文详细解析了AOP(面向切面编程)中的各种通知类型及其执行顺序,并重点介绍了如何通过切入点表达式来精确匹配目标方法。同时,文中还提供了多个实际应用场景的例子,包括异常处理、性能监控、事务管理和权限控制等。

通知中的注意事项

1.当程序出现异常时,通知的执行顺序

1.前置通知

2.环绕通知的前半部分

3.目标方法执行

4.异常通知

5.最终通知

省略的:环绕通知的后半部分。后置通知

2.当环绕通知中返回值注意事项

1.当目标方法执行没有返回值时viod

2.当目标方法有返回值时。切记 环绕通知中一定要return如果没有return将来目标方法执行的返回值就会被环绕通知拦截 导致参数传递失败。

3.后置通知的返回值问题

1.后置通知如果与环绕通知一起执行,后置通知想拿到返回值结果。则环绕通知中必须加return

2. 如果通知中没有环绕通知,则返回值结果能顺利获取。

3.如果后置通知返回值参数  不匹配(不一致)会报错


execution表达式

例子1

<aop:pointcutexpression=

"execution(intservice.UserServiceImpl.add())"id="txPointcut"/>

改切点表达式表示

返回值为int  包名类名serviceUserServiceImpl  方法为add()的匹配规则

 

例子2

 

<aop:pointcutexpression="execution(* service.*.add())"id="txPointcut"/>

规则:返回值值任意,包名service下子类的add(),只能包含一层,子孙类不行。

 

例子3

<aop:pointcut

expression="execution(* service..*.add())"id="txPointcut"/>

 

规则:方法返回值任意,service包下的所有子孙类的add()

 

例子4   

<aop:pointcutexpression=

"execution(*service..*.add(int,String))"id="txPointcut"/>

规则:返回值的类型任意   service子孙包下的add方法参数类型为int,String

 

<aop:pointcutexpression=

"execution(*service..*.add(..))"

id="txPointcut"/>

规则:返回值类型任意   service下的所有子孙类.add方法() (参数任意)

练习

1.异常

代码结构如图所示

                   PersonServlet

                   PersonService

                   PersonDao

用异常通知捕获servlet的所有的方法抛出的异常:

目标对象所在的类                            cn.tedu.big1601.servlet.PersonServlet

抛出异常所在的方法                  save()

抛出异常的名称                        XxxException

异常信息                                               message

 

意义:

异常处理类和业务逻辑类完全松耦合。

时刻捕获生产生产环境中所有的错误,实时监控该系统,异常收集。

代码: 点击打开链接

 2.方法执行的时间

计算servlet的各个类的各个方法的执行时间

1.目标类的名称

2.方法的名称          

3.执行的时间

控制台输出

        

意义:用来监控程序的性能问题

代码:点击打开链接

3.事务

public classPresonServiceImpl{

                                               @Transactional

                                               publicvoid savePerson(){

 

                                               }

 

                                               publicvoid queryPerson(){

 

                                               }

                                     }

 

 写一个切面来完成

代码: 点击打开链接

4.权限控制

传递 List方法    1.static     2.threadLocal

 

 

public class PersonServiceImpl{

         @PrivilegeInfo(name="saveperson")//要访问PersonSserviceImpl中的savePerson方法必须具备"saveperson"的权限

                                               publicvoid savePerson(){

                                                        xxxxxxxxx

                                               }

                                     }

List<Privilege:name>  用户所拥有的权限

 

写一个切面:   把客户端用户拥有的权限要在切面中获取到,用ThreadLocal

代码: 点击打开链接

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值