Spring 使用annotation和xml配置文件实现AOP
程序员文章站
2022-05-21 09:19:52
...
----------------通过Annotation 实现AOP----------
使用Annotation 控制调用用对应的方法输出对象的日志信息
1、创建一个annotation :
/** * 创建一个annotation , 利用annotation 方便的控制需要输出的信息 * @author Administrator * annotation: 注视;评注; * retention: 保持力 * RetentionPolicy: 保持的 */ @Retention(RetentionPolicy.RUNTIME)//运行时引用 public @interface LogInfo { public String value() default ""; }
2、在需要添加日志的方法上面使用@LogInfo("") 标注需要输出的 信息
public interface UserService { //添加 @LogInfo("实现了添加信息") public void addUser(String user); //获取信息 @LogInfo("实现了查询一个") public UserEntity findOne();
[b]3、在调用的时候对方法进行判断,是否属于annotationPresent ,然后获取对应的值并输出[/b]
//使用annotation 控制输出信息 if(method.isAnnotationPresent(LogInfo.class)){ LogInfo li = method.getAnnotation(LogInfo.class); com.svse.info.LogInfo.info(li.value()); } }
annotation 实现AOP 切面编程:
[b] 1、创建一个切面类:@Aspect 来表示该类为一个切面 类[/b]
/** * 实现:annotation 的AOP 管理 * 1、创建一个切面类 * @author Administrator * */ @Component("advisor") @Aspect // 注意:声明该类为切面类 public class Advisor { /** * execution(* com.svse.impl.*.add*(..)) * 第一个*表示任意返回值; * 第二个*表示当前包下的所有类; * 第三个*表示以add开头的所有方法; * (..)任意参数方法 * @param jp */ @Before("execution(* com.svse.impl.*.add*(..)) ||" + "execution(* com.svse.impl.*.find*(..))") public void before(JoinPoint jp){ LogInfo.info("实现切面的增加,调用了"+jp.getSignature().getName()+"方法!"); } @After("execution(* com.svse.impl.*.add*(..)) || " + "execution(* com.svse.impl.*.find*(..))") public void after(JoinPoint jp){ LogInfo.info("after調用"); } /** * 解释:第一* 表示方法的任意返回类型 * @param pjp * @throws Throwable */ @Around("execution(* com.svse.impl.*.add*(..)) ||" + "execution(* com.svse.impl.*.find*(..))") public void around(ProceedingJoinPoint pjp) throws Throwable{ LogInfo.info("開始around()調用!"); pjp.proceed();//執行程序 LogInfo.info("結束around()調用!"); } /** * 以上方法调用顺序:before() --> around() --> 程序.. --> after() --> around() */ }
[b] 2、配置文件设置为自动匹配:[/b]
<!-- 使用annotation实现AOP ,切面编程 --> <aop:aspectj-autoproxy/>
---------------------------通过XML 文件实现AOP--------------
[b][b]1、配置文件中:[/b][/b]
<!-- 通过XML 文件实现AOP ,切面编程 --> <bean id="aopBaseXML" class="com.svse.aop.AopBaseXML"></bean> <aop:config> <!-- 定义切面 --> <aop:aspect id="myLogAspect" ref="aopBaseXML"> <!-- 在哪些位置加上切面 --> <aop:pointcut id="myPointCut" expression="execution(* com.svse.impl.*.add*(..)) || execution(* com.svse.impl.*.find*(..))"/> <!-- 加入切面的时机 --> <aop:before method="before" pointcut-ref="myPointCut"/> <aop:after method="after" pointcut-ref="myPointCut"/> <aop:around method="around" pointcut-ref="myPointCut"/> </aop:aspect> </aop:config>
2、类:
/** * 基于XML 实现AOP 切面编程 * @author Administrator * */ public class AopBaseXML { /** * 前通知 * @param jp */ public void before(JoinPoint jp){ LogInfo.info("开始前加入日志"+jp.getSignature().getName()); } /** * 后通知 * @param jp */ public void after(JoinPoint jp){ LogInfo.info("结束后加入日志"+jp.getSignature().getName()); } /** * */ public void around(ProceedingJoinPoint pjp){ LogInfo.info("开始前加入日志"+pjp.getSignature().getName()); try { pjp.proceed();//执行程序 } catch (Throwable e) { e.printStackTrace(); } LogInfo.info("程序结束调用!"); } }
下一篇: 关于clojure的gen-class