<!-- 配置注解扫描路径-->
<context:component-scan base-package="cn.zqwl.Advice"/>
<!-- 创建通知对象-->
<bean id="userAdvice2" class="cn.zqwl.Advice.UserAdvice"></bean>
<aop:config>
<!-- 基于aspect方式配置-->
<aop:aspect ref="userAdvice2">
<!-- 切点配置-->
<aop:pointcut id="mp" expression="execution(boolean cn.zqwl.Server.UserServer.SearchUserOne(String,String)) and args(username,password)"/>
<!-- 配置通知-->
<aop:after-returning method="AfterUserLogon" pointcut-ref="mp" returning="result"></aop:after-returning>
</aop:aspect>
</aop:config>
注解配置
步骤:
1. 引入依赖的jar包
2. 定义切入点绑定切入点及通知关系
3.在Spring配置类中扫描切入点
注意:该类需要的两个重要注解:
/**
* @Component
* 实例化bean
*/
@Component
/**
* @Aspect
* 将当前类标识为一个切面供容器读取
*/
@Aspect
*切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名) * 动作关键字:描述切入点的行为动作,例如execution表示执行到指定切入点 * 异常名:方法定义中抛出指定异常,可以省略 * 可以使用通配符描述切入点,快速描述: * * :单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现 * execution(public * com.itheima.*.UserService.find*(*)) * * .. :多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写(用在参数处比较好一点) * execution(public User com..UserService.findById(..)) *
书写技巧: 所有代码按照标准规范开发,否则以下技巧全部失效 描述切入点通常描述接口,而不描述实现类 访问控制修饰符针对接口开发均采用public描述(可省略访问控制修饰符描述) 返回值类型对于增删改类使用精准类型加速匹配,对于查询类使用*通配快速描述 包名书写尽量不使用..匹配,效率过低,常用*做单个包描述匹配,或精准匹配 接口名/类名书写名称与模块相关的采用*匹配,例如UserService书写成*Service,绑定业务层接口名 方法名书写以动词进行精准匹配,名词采用*匹配,例如getById书写成getBy*,selectAll书写成selectAll 参数规则较为复杂,根据业务方法灵活调整 通常不使用异常作为匹配规则
获取切入点方法的参数:(参数及不用麻烦使用通配符..代替) JoinPoint:适用于前置、后置、返回后、抛出异常后通知 ProceedJointPoint:适用于环绕通知