首页
友链
Search
1
01-快捷命令
134 阅读
2
寒假计划
129 阅读
3
浏览器规范(ES module)和 node.js 规范(Common JS)
121 阅读
4
03-概念解析
120 阅读
5
学期计划(大三下学期)
103 阅读
计划
算法
面试题
运维
Ansible
Linux
数据库
neo4j
共用
web 前端
CSS
JavaScript
Vue
Node.js
英语单词
工程化
JAVA
mysql
收获
面试
mybatis
Spring
基础
spring-mvc
问题
项目
宠物乐园
速查
问题集
git
学习
sql
二阶段
登录
Search
标签搜索
spring
mysql
vue
ansible
CSS
面试
计划
收获
JAVA面试题
spring-mvc
Starrylsi
累计撰写
106
篇文章
累计收到
37
条评论
首页
栏目
计划
算法
面试题
运维
Ansible
Linux
数据库
neo4j
共用
web 前端
CSS
JavaScript
Vue
Node.js
英语单词
工程化
JAVA
mysql
收获
面试
mybatis
Spring
基础
spring-mvc
问题
项目
宠物乐园
速查
问题集
git
学习
sql
二阶段
页面
友链
搜索到
51
篇与
的结果
2024-09-12
15-Spring-AOP-切入点表达式
/** * 切入点表达式 : * 在四个通知注解中添加的字符串 * 固定语法 : "execution(权限修饰符 返回值类型 全包名.类名.方法名(形参类型1,形参类型2,...))" * * 1.由于spring只支持拦截public方法 权限修饰符=public 可略 * * 2.返回值类型只有两种写法 1.精确指定返回值类型 2.* *代表所有数据类型 * * 3.包名允许编写完整包名 也可以编写com.*.包名 * * 4.包中的类名可以指定类名 也可以使用 * 代表当前包下的所有类 * * 5.方法名可以指定方法名 也可以使用 * 代表当前类下的所有方法名 也可以使用 方法名的前缀+*配合指定所有同类型方法 * 例如 : addStudent addTeacher addBook add* * 6.形参可以指定形参 也可以使用 ..代表所有的形参 * * 通常情况下 使用偏精确的匹配比较多 * * 一般要匹配service层的内容 * * 模糊匹配 : * execution(* *(..)) 匹配任意返回值 任意包 任意类名 任意方法 任意形参 * execution(* *.*(..)) 匹配任意类名.方法名 任意形参 * * 注:一般不使用 匹配的内容过多 * * 切入点表达式中允许使用 && 或者 || 运算符 * && 表示需要同时满足两个切入点表达式 * || 表示满足一个表达式则直接匹配 * * */图解AOP专业术语
2024年09月12日
16 阅读
0 评论
0 点赞
2024-09-12
14-Spring-AOP-使用Spring实现AOP简单切面编程
需要导入工程的jar包Spring的核心包 spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar Spring的测试包 spring-test-4.0.0.RELEASE.jar Spring日记相关包 commons-logging-1.1.3.jar log4j-1.2.17.jar Spring的AOP切面相关的包 spring-aop-4.0.0.RELEASE.jar spring-aspects-4.0.0.RELEASE.jar com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
2024年09月12日
13 阅读
0 评论
0 点赞
2024-09-12
13-Spring-AOP-计数功能加日记功能-cglib动态代理
优点:在没有接口的情况下,同样可以实现代理的效果。缺点:同样需要自己编码实现代理全部过程。但是为了更好的整合Spring框架使用。所以我们需要学习一下Spring 的AOP 功能。也就是学习Spring提供的AOP功能。{dotted startColor="#ff6c6c" endColor="#1989fa"/}package top.starrylsi.cglib; import net.sf.cglib.proxy.Enhancer; public class cglibProxyFactory { public static Object getProxy(Object target) { //1. 创建cglib执行器 Enhancer enhancer = new Enhancer(); //2. 指定被代理类是代理类的父类(子类可以继承父类的方法) enhancer.setSuperclass(target.getClass()); //3. 指定处理方式 enhancer.setCallback(new CglibInterceptor()); //4. 生成代理对象 return enhancer; } }package top.starrylsi.cglib; import static org.hamcrest.CoreMatchers.nullValue; import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import top.starrylsi.utils.LogUtils; public class CglibInterceptor implements MethodInterceptor { @Override public Object intercept(Object target, Method method, Object[] params, MethodProxy methodProxy) throws Throwable { //1.获取方法名 String methodName = method.getName(); //2.执行前置日志 LogUtils.logBefore(methodName, params); //3.声明结果 Object result = null; try { //4.执行方法并获取返回值 result = methodProxy.invokeSuper(target, params); } catch (Exception e) { //5.异常日志 LogUtils.logThrowing(methodName, e); }finally { //6.后置日志 LogUtils.logAfter(methodName); } //7.返回执行结果 if(result !=null) { LogUtils.logAfterReturing(methodName, result); } return null; } } 实现日记功能总结介绍aop的实现方式aop有两种实现方式 JDK动态代理和cglib代理jdk-->proxy类, InvocationHandler,需要接口cglib-->enhancer类,MethodInterceptor,需要类
2024年09月12日
12 阅读
0 评论
0 点赞
2024-09-12
12-Spring-AOP计数功能加日记功能-JDK实现完善
目标: 11-Spring-AOP-通过案例理解AOP这篇文章中是一个简单的实现JDK代理的功能,需要完善工具包(LogUtils)和代理操作(JDKProxyHandler).掌握1: 日志工具类中日志的四个阶段(logBefore,logAfter,logThrowing,logAfterReturing)掌握2: 代理操作实现日志记录的步骤{dotted startColor="#ff6c6c" endColor="#1989fa"/}计数功能加日记功能优化代码// logUtils.java(top.starrylsi.utils) package top.starrylsi.utils; import java.util.Arrays; public class LogUtils { //1.执行前 public static void logBefore(String method,Object ...params) { System.out.println("这是"+method+"方法"+"参数:"+Arrays.toString(params)); } //2.执行完毕 public static void logAfter(String method) { System.out.println("这是"+method+"方法"+"方法执行完毕"); } //3.执行异常 public static void logThrowing(String method,Exception e) { System.out.println("这是"+method+"方法抛出了异常 异常是:"+e.getMessage()); } //4.返回结果 public static void logAfterReturing(String method,Object result) { System.out.println("这是"+method+"方法: 结果是:"+result); } } // JDKProxyHandler(top.starrylsi.proxy) package top.starrylsi.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import top.starrylsi.caculate.Caculate; import top.starrylsi.utils.LogUtils; public class JDKProxyHandler implements InvocationHandler{ private Caculate caculate; public JDKProxyHandler(Caculate caculate) { this.caculate = caculate; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //1. 获取方法名 String methodName = method.getName(); //2. 调用日志 LogUtils.logBefore(methodName, args); //3. 声明结果 Object result =null; //4. 执行方法 并获取返回值 try { result = method.invoke(caculate, args); } catch (Exception e) { //5. 出异常显示异常日志 LogUtils.logThrowing(methodName, e); }finally { //6.执行日志完毕 LogUtils.logAfter(methodName); } if(result != null) { LogUtils.logAfterReturing(methodName, result); } return null; } }
2024年09月12日
10 阅读
0 评论
0 点赞
2024-09-12
11-Spring-AOP-通过案例理解AOP
目标: 通过加减乘除的这个案例理解AOP掌握: 未使用AOP时的代码和使用了AOP编程的代码概念AOP是面向切面编程。全称:Aspect Oriented Programming面向切面编程指的是:程序是运行期间,动态地将某段代码插入到原来方法代码的某些位置中。这就叫面向切面编程。1. 一个简单计算数功能加日记案例理解AOP的工作package top.starrylsi.caculate; public interface Caculate { public int add(int x,int y); public int sum(int x,int y); public int mul(int x, int y); public int div(int x,int y); } package top.starrylsi.caculate; public class Caculator implements Caculate{ @Override public int add(int x, int y) { // TODO Auto-generated method stub return x+y; } @Override public int sum(int x, int y) { // TODO Auto-generated method stub return x-y; } @Override public int mul(int x, int y) { // TODO Auto-generated method stub return x*y; } @Override public int div(int x, int y) { // TODO Auto-generated method stub return x/y; } }1.1 原始方法统一日记处理把日记的内容封装到一个类去中集中处理。缺点:这种方式的不足之处是,每有一个需要加日记的类,都需要到类的代码中去添加日记功能代码。无法做到所有对象都统一处理。1. 编写一个日记处理工具类package top.starrylsi.utils; import java.util.Arrays; public class LogUtils { public static void logBefore(String method,Object ...params) { System.out.println("方法"+method+"参数�:"+Arrays.toString(params)); } public static void logAfter(String method,Object result) { System.out.println("方法"+method+"结果:"+result); } } 2. 修改原来Calculator中的日记代码@Override public int add(int x, int y) { LogUtils.logBefore("add",x,y); int result = x +y; LogUtils.logBefore("add",x,y); return result; }1.2 使用jdk代理实现日记解释: 通过反射创建了一个新的caculate对象,里面有原本的功能也加了额外的功能((Caculate)Proxy.newProxyInstance(loader, interfaces, new JDKProxyHandler(caculate));)优点:这种方式已经解决我们前面所有日记需要的问题。非常的灵活。而且可以方便的在后期进行维护和升级。缺点:当然使用jdk动态代理,需要有接口。如果没有接口。就无法使用jdk动态代理。思路:完成代理我们是使用了两个类(top.starrylsi.proxy下的 JDKProxyFactory,JDKProxyHandler),JDKProxyFactory用来生成代理对象的.JDKProxyHandler是JDKProxyFactory中的一个参数,是专门用来实现操作逻辑的.1. 编写 JDKProxyFactory代码关键点1: Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h))关键点2: 调用JDKProxyHandler package top.starrylsi.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import top.starrylsi.caculate.Caculate; public class JDKProxyFactory { public static Caculate getProxy(Caculate caculate) { //1. 获取被代理类的类加载器 ClassLoader loader = caculate.getClass().getClassLoader(); //2. 获取被代理对象的父接口 Class<?> [] interfaces = caculate.getClass().getInterfaces(); //3. 创建代理对象 return (Caculate)Proxy.newProxyInstance(loader, interfaces, new JDKProxyHandler(caculate)); } }2. 编写 JDKProxyHandler代码 (top.starrylsi.proxy)关键: 实现InvocationHandler的方法package top.starrylsi.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import top.starrylsi.caculate.Caculate; import top.starrylsi.utils.LogUtils; public class JDKProxyHandler implements InvocationHandler{ private Caculate caculate; public JDKProxyHandler(Caculate caculate) { this.caculate = caculate; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //1. 获取方法名 String methdName = method.getName(); //2. 调用日志 LogUtils.logBefore(methdName, args); //3. 调用方法 并获取返回值 Object result = method.invoke(caculate, args); //4. 调用日志之后的功能 LogUtils.logAfter(methdName, result); return null; } } 3. 测试关键点: 知道如何调用// 调用的关键点 private Caculate caculateProxy = JDKProxyFactory.getProxy(caculate);package top.starrylsi.test; import org.junit.jupiter.api.Test; import top.starrylsi.caculate.Caculate; import top.starrylsi.caculate.Caculator; import top.starrylsi.proxy.JDKProxyFactory; class CaculateTests { private Caculate caculate = new Caculator(); private Caculate caculateProxy = JDKProxyFactory.getProxy(caculate); @Test public void testCaculator() { int result = caculate.add(5, 10); System.out.println(result); } @Test public void testProxy() { caculateProxy.add(2, 4); } }
2024年09月12日
14 阅读
0 评论
0 点赞
1
...
3
4
5
...
11