十大网站黄页免费,浙江第一水电建设集团网站,网站建设与管理 ppt模板,长沙做网站开发价格多少一、Spring框架使用Api接口-继承类实现AOP的切面编程示例 要使用Spring框架AOP#xff0c;除了要导入spring框架包外#xff0c;还需要导入一个织入的包org.aspectj#xff0c;具体maven依赖如下#xff1a;
dependencygroupIdorg.springframework/gr…一、Spring框架使用Api接口-继承类实现AOP的切面编程示例 要使用Spring框架AOP除了要导入spring框架包外还需要导入一个织入的包org.aspectj具体maven依赖如下
dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.1.10.RELEASE/version
/dependency
dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.6.9/version/dependency 注本文最先发表于publish:September 29, 2020 -Tuesday在后来发现此时的代码已经有问题了依赖的包加载报错aspectj的版本需要换一下我这里换成1.9.9后正常。 然后我们编写几个类一个是接口类ArticleInterface二是这个接口的实现类Article三是需要往这个实现类Article中切入的切面类BeforeLog 和AfterLog 分别在方法执行起和末尾执行的方法。类的实现代码如下
//接口类ArticleInterface
package proxy;public interface ArticleInterface {public void query(); public void add() ;public void edit() ;public void delete() ;
}//接口的实现类Article
package proxy;public class Article implements ArticleInterface{public void query() {System.out.println(获取了一篇文章); }public void add() {System.out.println(添加了一篇文章);}public void edit() {System.out.println(修改了一篇文章);}public void delete() {System.out.println(删除了一篇文章);}
}//前置切面类
package proxy;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;public class BeforeLog implements MethodBeforeAdvice{//Method 目标对象的方法Object目标对象target:目标对象public void before(Method method, Object[] args, Object target) throws Throwable {// TODO Auto-generated method stub//此方法内容在目标方法执行前会自动执行System.out.println(开始执行方法: target.getClass().getName() . method.getName());}}//后置切面类
package proxy;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class AfterLog implements AfterReturningAdvice{public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {// TODO Auto-generated method stubSystem.out.println(执行方法完成: target.getClass().getName() . method.getName() );}} 注意前置切面类和后置切面类分别实现了MethodBeforeAdvice和AfterReturningAdvice接口也正因此他们能切入方法进行执行。至于切入至哪个目标类的哪个方法执行需要我们进入applicationContext.xml中进行aop配置。如上我们需要将这两个切面类BeforeLog和AfterLog加至Article执行。applicationContext.xml的配置及运行结果如下
?xml version1.0 encodingutf-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd!-- 上方导入aop约束 --aop:aspectj-autoproxy /bean idarticle classproxy.Article /bean idbeforelog classproxy.BeforeLog /bean idafterlog classproxy.AfterLog /!-- 进行aop配置 --aop:config!-- 表示Article.*(..) Article类的所有方法任意参数 --aop:pointcut expressionexecution(* proxy.Article.*(..)) idlogcut/aop:advisor advice-refbeforelog pointcut-reflogcut/aop:advisor advice-refafterlog pointcut-reflogcut//aop:config/beans
程序的运行结果如下
//运行结果如下
开始执行方法:proxy.Article.add
添加了一篇文章
执行方法完成:proxy.Article.add 二、Spring使用自定义类来实现AOP切面编程 上一篇文章 使用Sprint的API即要添加的通知功能都实现于Spring的接口实现了AOP切面编程也可以使用自定义的类来实现我们可以写一个独立的CLASS类和一些方法然后通过在applicationContext IOC容器配置中自定义切面 在这个切面中自定义我们的切入点并ref相关的方法从而实现切面编程。同样我们编写一个interface Printers和Computer类还有一个自定义的横切关注点切面即自定义类。代码如下
//interface
package aspect;public interface Printers {public void print();
}//interface的实现类
package aspect;public class Computer implements Printers{public void print() {System.out.println(打印机执行打印);}}//自定义的横切关注点类
package aspect;public class PrintReady {public void ready() {System.out.println(准备墨水和纸);}public void clear() {System.out.println(整理桌面);}} 如上我们编写了一个计算类其有打印的方法而我们想在打印机执行打印前后添加点其它功能比如打印执行前准备墨水和纸打印后整理桌面。注意看我们的横切关注点类PrintReady没有继承任何的Spring类或者接口。然后我们开始编辑applicationContext.xml配置以及如下
?xml version1.0 encodingutf-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsdaop:aspectj-autoproxy /bean idcomputer classaspect.Computer /bean idprintready classaspect.PrintReady /aop:config!-- 自定义切面 --aop:aspect refprintready!-- 切点 --aop:pointcut expressionexecution(* aspect.Computer.*(..)) iddoprint/aop:before methodready pointcut-refdoprint /aop:after methodclear pointcut-refdoprint//aop:aspect/aop:config
/beans 测试类User的代码及运行结果如下
package com.kermit.dotest;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import aspect.Printers;public class User {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(ApplicationContext.xml);Printers computer (Printers)context.getBean(computer);computer.print();}
}运行结果如下
//运行结果
准备墨水和纸
打印机执行打印
整理桌面 三、后来使用Api接口实现AOP切面编程的补充测试记录
1. execution缺少括号不报错但是切面方法就是不执行的坑 在测试的时候发现有一个坑aplicationContext.xml配置文件中如果expression里面少了一个括号程序执行并不报错但是就是不会执行AOP切面方法如下请注意 代码 expressionexecution(* com.kermit.aoptest.Article.*(..)/ 中少了一个右括号程序不报错导致排查时一直未发现还以为是哪里加载出现了问题。 bean idbeforelog classcom.kermit.aoptest.BeforeLog /bean idafterlog classcom.kermit.aoptest.AfterLog /aop:configaop:pointcut idlogcut expressionexecution(* com.kermit.aoptest.Article.*(..)/aop:advisor advice-refbeforelog pointcut-reflogcut/aop:advisor advice-refafterlog pointcut-reflogcut //aop:config
2. 使用Spring的API接口实现AOP编程有两种方式 文章1是一种实现方式其是将要切入的类方法都继承自 Spring的类方法 org.springframework.aop.MethodBeforeAdvice;和org.springframework.aop.AfterReturningAdvice; 还有一种方式是使用自定义类先自己配置一个类实现方法前和方法后要切入的方法然后加入切面中。
被切入的类内容如下
package com.kermit.aoptest;import org.springframework.stereotype.Component;import java.sql.SQLOutput;
Component
public class Article implements ArticleInterface{Overridepublic void insert() {System.out.println(insert one record.);}Overridepublic void update() {System.out.println(update one record.);}
}自定义要切入的方法内容类定义如下
package com.kermit.aoptest;public class DiyLog {public void before(){System.out.println(do before method);}public void after(){System.out.println(do after method);}
}然后在配置文件中使用如下配置
bean iddiylog classcom.kermit.aoptest.DiyLog /aop:configaop:aspect refdiylogaop:pointcut idlogcut expressionexecution(* com.kermit.aoptest.Article.*(..))/aop:before methodbefore pointcut-reflogcut/aop:after methodafter pointcut-reflogcut//aop:aspect/aop:config-- 这种方法与第1种方法相比其的局限性比较大因为其切入的只能是一些独立的方法内容功能受限。 四、Java各数据类型的默认值/最大值/最小值
以前保存的 Java获取数据类型及基本数据类型的默认值、最大值、最小值保存在这里。
1. Java取各数据类型的认值/最大值/最小值的程序
//Java获取变量的数据类型及基本数据类型的默认值、最大最小值
package data.type;
public class Array {static boolean bool;static byte by;static char ch;static double dv;static float fv;static int iv;static long lv;static short shv;static String strv;public static void main(String[] args) {//Java中的基本数据类型System.out.println(------------各数据类型定义------------);byte b 2; showType(b);short s 3;showType(s);int i 10; showType(i);long l 19; showType(l);float f1.3f;showType(f);double d0.5;showType(d);char c a;showType(c);boolean bo true; showType(bo);//Java 基本数据类型的默认值System.out.println(---------各类型默认值-------------);System.out.println(Bool : bool);System.out.println(Byte : by);System.out.println(Character: ch);System.out.println(Double : dv);System.out.println(Float : fv);System.out.println(Integer : iv);System.out.println(Long : lv);System.out.println(Short : shv);System.out.println(String : strv);//Java 基本数据类型的信息System.out.println(---------各类型信息-------------);System.out.println(byte类型字节数 Byte.BYTES 最小值: Byte.MIN_VALUE ,最大值Byte.MAX_VALUE);System.out.println(short类型字节数 Short.BYTES 最小值: Short.MIN_VALUE ,最大值Short.MAX_VALUE);System.out.println(int类型字节数 Integer.BYTES 最小值: Integer.MIN_VALUE ,最大值Integer.MAX_VALUE);System.out.println(long类型字节数 Long.BYTES 最小值: Long.MIN_VALUE ,最大值Long.MAX_VALUE);System.out.println(float类型字节数 Float.BYTES 最小值: Float.MIN_VALUE ,最大值Float.MAX_VALUE);System.out.println(double类型字节数 Double.BYTES 最小值: Double.MIN_VALUE ,最大值Double.MAX_VALUE);System.out.println(char类型字节数 Character.BYTES 最小值: (int)Character.MIN_VALUE ,最大值 (int)Character.MAX_VALUE);}public static void showType(Object obj) {System.out.println(obj.getClass().getTypeName() );}
}
2. Java取各数据类型的认值/最大值/最小值的程序运行结果
------------各数据类型定义------------ java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long java.lang.Float java.lang.Double java.lang.Character java.lang.Boolean ---------各类型默认值------------- Bool :false Byte :0 Character: Double :0.0 Float :0.0 Integer :0 Long :0 Short :0 String :null ---------各类型信息------------- byte类型字节数1最小值:-128,最大值127 short类型字节数2最小值:-32768,最大值32767 int类型字节数4最小值:-2147483648,最大值2147483647 long类型字节数8最小值:-9223372036854775808,最大值9223372036854775807 float类型字节数4最小值:1.4E-45,最大值3.4028235E38 double类型字节数8最小值:4.9E-324,最大值1.7976931348623157E308 char类型字节数2最小值:0,最大值65535