首页
友链
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
二阶段
页面
友链
搜索到
17
篇与
的结果
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 点赞
2024-09-11
09-Spring-注解
目标: 通过注解创建Dao,Service,Controller关键: 当我们使用Spring的注解功能的时候。需要把aop的jar包导入注: 注解功能极其重要pojo中的component注解把xml写bean的操作节省了题外一般mybatis使用xml配置文件而不用注解,使用xml可以把java代码拆开了spring使用注解,认为spring是java代码的一部分耦合性低,方便改代码,方便分配任务使用注解: 不用配置bean了Spring配置bean的常用注解有@Controller 专门标注给web层的组件 @Service 专门给Service层的组件注解 @Repository 给Dao层组件标注 @Component 给Dao、Service、控制器Web层之外的组件进行标注。 @Scope 可以修改bean的Scope属性,默认不标注此注解表示单例。 也可以通过注解修改为多例@Scope(value="prototype")在类上使用注解注解在类上使用/** * @Repository注解的功能相当于在Spring配置文件中做了如下的配置: * <bean id="bookDao" class="top.starrylsi.dao.BookDao" scope="singleton"></bean> */ @Scope(value="prototype") @Repository(value="bookDao") public class BookDao { public BookDao() { System.out.println("BookDao也被初始化了"); } }当我们在类上使用了注解之后。一定要在Spring配置文件中加上包扫描的配置才能生效<!-- context:component-scan 表示包扫描 base-package 指定要扫描哪些包下的类(并且包含子包) --> <context:component-scan base-package="top.starrylsi"></context:component-scan> 测试@Test public void test1() throws Exception { @SuppressWarnings("resource") ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml"); System.out.println( applicationContext.getBean("bookDao") ); System.out.println( applicationContext.getBean("bookDao") ); System.out.println( applicationContext.getBean("bookDao") ); System.out.println( applicationContext.getBean("bookService") ); System.out.println( applicationContext.getBean("bookServlet") ); System.out.println( applicationContext.getBean("person") ); }
2024年09月11日
17 阅读
0 评论
0 点赞
2024-09-11
08-Spring-EL表达式
EL表达式
2024年09月11日
16 阅读
0 评论
0 点赞
1
2
3
4