spring-04
通知中的注意事项
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
代码:点击打开链接