spring-04

通知中的注意事项

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

1.前置通知

2.环绕通知的前半部分

3.目标方法执行

4.异常通知

5.最终通知

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

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

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

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

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

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

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

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

spring-04

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

代码:点击打开链接