Java框架:AOP--Schema
来源:互联网 发布:免费空间 能用mysql 编辑:程序博客网 时间:2024/05/19 08:03
http://blog.csdn.net/qq_34120041/article/details/53817252
常用的AOP两种方式:
1、Scheme-AOP-配置文件的切面
2、@Aspectj -基于注解
案例:配置文件的切面
1、接口IPerson和实现类XiaoBaiImpl
package com.aop.schema;public interface IPerson {public void addPerson();public void addNum(int num,String name);public void updatePerson();}
package com.aop.schema;import org.springframework.stereotype.Component;@Componentpublic class XiaoBaiImpl implements IPerson {@Overridepublic void addPerson() {System.out.println("add小白!");}@Overridepublic void updatePerson() {System.out.println("update小白!");}@Overridepublic void addNum(int num, String name) {System.out.println("添加Num");}public void del() {try {XiaoBaiImpl xiaoBaiImpl = null;xiaoBaiImpl.addNum(1, "fyl");} catch (RuntimeException e) {throw new CustomException(XiaoBaiImpl.class, "del", e.getMessage());}}}
2、前置通知、环绕通知
package com.aop.schema;import org.aspectj.lang.ProceedingJoinPoint;import org.springframework.stereotype.Component;@Componentpublic class AroundMethod {public void aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("事务开启了......");joinPoint.proceed();System.out.println("事务结束了.......");}public void beforeAdvice() {System.out.println("我是前置通知!!");}}
3、自定义异常类CustomException、异常通知AroundThrowingMethod
package com.aop.schema;public class CustomException extends RuntimeException {private static final long serialVersionUID = 8308193234255898346L;private Class clz;private String method;public CustomException() {super();}public Class getClz() {return clz;}public void setClz(Class clz) {this.clz = clz;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}public CustomException(Class clz, String method, String message) {super(message);this.clz = clz;this.method = method;}public CustomException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}public CustomException(String message, Throwable cause) {super(message, cause);}public CustomException(String message) {super(message);}public CustomException(Throwable cause) {super(cause);}}
package com.aop.schema;import org.springframework.stereotype.Component;@Componentpublic class AroundThrowingMethod {public void aroundThrowAdvice(CustomException ce) throws Throwable{System.out.println("抛异常的类是:"+ce.getClz().getName());System.out.println("抛异常的方法是:"+ce.getMethod());System.out.println("事務回滾..."+ce.getMessage());}}
4、spring 2.5 通知类MethodInterceptorAdvice
package com.aop.schema;import java.lang.reflect.Method;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;import org.springframework.stereotype.Component;@Componentpublic class MethodInterceptorAdvice implements MethodInterceptor{@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {//执行的类System.out.println("执行的类:"+invocation.getThis().getClass().getName());//获取方法名Method method = invocation.getMethod();System.out.println("执行的方法:"+method.getName());//获取参数Object[] params = invocation.getArguments();if (params != null) {for (int i = 0; i < params.length; i++) {System.out.println("参数"+i+"值为:"+String.valueOf(params[i]));}}System.out.println("MethodInterceptor开启...");long btime = System.currentTimeMillis();//执行具体的方法Object obj = invocation.proceed();System.out.println("MethodInterceptor结束...");long etime = System.currentTimeMillis() - btime;System.out.println("=========共耗时:"+etime+"ms");return obj;}}
5、bean.xml
<!-- 扫包 --><context:component-scan base-package="com.aop.schema"></context:component-scan><!-- 1:Scheme-AOP-配置文件的切面2:@Aspectj aop --><aop:config proxy-target-class="true"><aop:pointcut expression="execution(* add*(..))" id="before"/><!-- 通知类 :前置通知,后置通知,环绕通知,异常通知,引介通知(针对(对象))--><aop:aspect ref="aroundMethod"><!-- 环绕通知-方法aroundAdvice --><aop:around method="aroundAdvice" pointcut="execution(* update*(..))"/><!-- 前置通知-方法beforeAdvice --><aop:before method="beforeAdvice" pointcut-ref="before"/></aop:aspect><aop:aspect ref="aroundThrowingMethod"><!-- 异常通知-方法beforeAdvice --><aop:after-throwing method="aroundThrowAdvice" pointcut="execution(* del*(..))" throwing="ce"/></aop:aspect></aop:config><!-- schemeaop + springaop2.5x 环绕型通知 --><aop:config proxy-target-class="true"><aop:advisor advice-ref="methodInterceptorAdvice" pointcut="execution(* com.aop.schema.XiaoBaiImpl.addN*(..))"/></aop:config>
6、测试类
package com.aop.schema;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:com/aop/schema/bean.xml");XiaoBaiImpl xiaoBaiImpl = (XiaoBaiImpl) context.getBean("xiaoBaiImpl");xiaoBaiImpl.addPerson();System.out.println("------------------------------");xiaoBaiImpl.updatePerson();System.out.println("------------------------------");xiaoBaiImpl.addNum(12, "fyl");System.out.println("------------------------------");xiaoBaiImpl.del();}}
7、结果
一月 05, 2017 3:08:38 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4ccabbaa: startup date [Thu Jan 05 15:08:38 CST 2017]; root of context hierarchy一月 05, 2017 3:08:38 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [com/aop/schema/bean.xml]我是前置通知!! --前置通知add小白!------------------------------事务开启了...... --环绕通知update小白!事务结束了.......------------------------------我是前置通知!! --前置通知执行的类:com.aop.schema.XiaoBaiImpl --MethodInterceptor执行的方法:addNum参数0值为:12参数1值为:fylMethodInterceptor开启...添加NumMethodInterceptor结束...=========共耗时:1ms------------------------------抛异常的类是:com.aop.schema.XiaoBaiImpl抛异常的方法是:del事務回滾...nullException in thread "main" com.aop.schema.CustomExceptionat com.aop.schema.XiaoBaiImpl.del(XiaoBaiImpl.java:28)at com.aop.schema.XiaoBaiImpl$$FastClassBySpringCGLIB$$cf1f1ef7.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)at com.aop.schema.XiaoBaiImpl$$EnhancerBySpringCGLIB$$2d1b53f8.del(<generated>)at com.aop.schema.Test.main(Test.java:17)
0 0
- Java框架:AOP--Schema
- java 框架-spring-AOP
- java框架之AOP框架
- Java框架之AOP框架
- java框架之AOP框架
- Spring AOP Schema aop:config
- Schema-based AOP support
- Spring Aop Schema 实现
- 基于Schema的AOP
- 基于Schema的AOP
- 基于Schema的AOP
- Java框架:AOP--(JDK、CGLIB)
- Java框架:AOP--注解模式
- 第三章 AOP 基于Schema的AOP
- Spring AOP Schema aop:config、tx:advice
- Spring AOP Schema aop:config、tx:advice
- 6.3. Schema-based AOP support
- spring的aop 基于schema
- EasyAR开发教程第二弹--AR 视频的识别与播放
- REDIS安装后外网无法访问的问题
- Linux 文件操作权限
- Gambit建模中split的用法
- jboss的实体类过时出现错误
- Java框架:AOP--Schema
- 利用strstr与atoi的结合实现一个C语言获取文件中数据的工具
- Eclipse中Project的属性Deployment Assembly(支配程序集) 部署 组装 消失了
- angularjs学习总结 详细教程
- Unity3D之新版本5.5自定义图片字体(Custom Font)的使用
- 【java基础 13】两种方法判断hashmap中是否形成环形链表
- java freemarker模板 实现word文件导出
- 天道不一定酬勤,深度思考比勤奋更重要
- 微信小程序技术交流