首页
友链
Search
1
01-快捷命令
132 阅读
2
寒假计划
128 阅读
3
浏览器规范(ES module)和 node.js 规范(Common JS)
120 阅读
4
03-概念解析
119 阅读
5
学期计划(大三下学期)
102 阅读
计划
算法
面试题
运维
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
二阶段
页面
友链
搜索到
14
篇与
的结果
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 点赞
2024-09-11
10-Spring-注解的包含和排除
问题: 为什么将spring和spring mvc的注解分开扫描问题解决<!-- 使用注解需要让spring解析xml时 知道注解属于哪个包 在spring中排除掉spring-mvc的注解 use-default-filters="true" 在spring-mvc中 只包含spring-mvc的注解 use-default-filters="false" --> <context:component-scan base-package="top.starrylsi" use-default-filters="true"> <!-- 包含spring自身的注解 --> <!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/> --> <!-- 排除spring-mvc的注解 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
2024年09月11日
15 阅读
0 评论
0 点赞
1
2
3