From b196cd6cc715a5c2d9a20e5bca17a339e39d3908 Mon Sep 17 00:00:00 2001 From: lmj01 Date: Wed, 24 Apr 2024 14:36:20 +0800 Subject: [PATCH] update --- {java => cpl}/Java.md | 410 +++++++++++++++---------- {java => dev-note}/maven.md | 35 ++- index/article.md | 2 +- index/computerScience.md | 2 +- java/JavaWeb.md | 94 ------ java/Spring.md | 73 ----- java/images/Hibernate-Architecture.png | Bin 19549 -> 0 bytes java/images/java-web-mvc.jpg | Bin 14067 -> 0 bytes java/javax.md | 9 - java/jpa.md | 25 -- java/springboot.md | 86 ------ 11 files changed, 275 insertions(+), 461 deletions(-) rename {java => cpl}/Java.md (56%) rename {java => dev-note}/maven.md (85%) delete mode 100644 java/JavaWeb.md delete mode 100644 java/Spring.md delete mode 100644 java/images/Hibernate-Architecture.png delete mode 100644 java/images/java-web-mvc.jpg delete mode 100644 java/javax.md delete mode 100644 java/jpa.md delete mode 100644 java/springboot.md diff --git a/java/Java.md b/cpl/Java.md similarity index 56% rename from java/Java.md rename to cpl/Java.md index db472be..23562e8 100644 --- a/java/Java.md +++ b/cpl/Java.md @@ -1,155 +1,255 @@ - -# Java - -## 编码 - -Java默认字符是Unicode编码,而String类型的编码方式与JVM编码方式都与本机操作系统的默认字符集有关 - - -## 语言特性 - -### 泛型 - -- E Element,在集合中使用,集合中存放的元素 -- T Type, Java的类 -- K key 键 -- V Value 值 -- N Number 数值类型 -- ?不确定的Java类型 - -### Class类 - -是所有对象的运行时类型标识,即RTTI-Run Time Type Identification -它是由JVM创建,它的作用就是在运行时提供或获得某个对象的类型信息 - -```java -public class Shape{} -// get Class method one -Class obj1 = Class.forName("Shape"); -// get Class method two -Shape shape = new Shape(); -Class obj2 = shape.getClass(); - -// instace obj -Class obj3 = Shape.class; - -``` - -### listener - -Java中的事件监听机制,事件观察者向事件发出者进行注册,当事件产生时,事件发出者调用注册的函数进行 -发送。 -事件发出者管理一个array或list来维护注册者,所以尽量不要在多线程中使用这样,需要单线程依次发送。 -特别对于网络的监听是非常多的。 - -### 反射机制 - -在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它们的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 - -即编译后,这些信息都是可获取的,在语言层面提供了支持。 - -### 注解 - -与C语言中的宏是类似功能,Java的注解是在class文件文件基础上的东西,class文件里面是没有注解的,注解的形式是便于编译器在处理class时关联Annotation信息,通过反射去获取信息。 - -#### 元注解 - -java.lang.annotation里面定义了4种原语 - -- @Target,用于明确被修饰的类型,方法,字段,类,接口等 -- @Retention,描述注解的生命周期 - 1. RetentionPolicy.RUNTIME 注解会在class字节码文件中存在,运行时反射即可获得 - 2. RetentionPolicy.CLASS,注解会在class字节码文件中存在,但运行时不能获取 - 3. RetentionPolicy.SOURCE,仅存在源码中,class字节码中不存在 -- @Documented -- @Jnherited - -#### 自定义注解 - -##### 简单注解 - -又称标记,这种注解仅利用自身的存在与否来提供信息,如@Override - -```java -// 定义一个注解 -public @interface Test{} - -// 使用注解 -@Test -public class MyClass{ -} -``` - -##### 复杂注解 - -又称元数据Annotation,提供更多的元数据 - -```java -// 定义注解 -@Rentention(RententionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface MyTag { - // 以method的形式提供 - String name(); - int age() default 32; -} - -// 使用注解 -public class Test { - @MyTag(name="test") - public void info() {} -} -``` - -使用Annotation修饰了程序后,并不会自己生成,需要开发者通过API来提取。所有的元数据的接口都继承 -Annotation父接口 - -方法就是通过反射获取Annotation,将Annotation转换为XXXAnnotation,调用XXXAnnotation中的方法 - -```java -Class clazz = Class.forName(className); -Annotation[] arr = clazz.getMethod("info").getAnnotations(); -for (Annotation an : arr) { - if (an instanceof MyTag) { - MyTag tag = (MyTag)an; - String str = String.format("%s, %d", tag.name(), tag.age()); - System.out.println(str); - } -} -``` - -### bean - -Java语言欠缺属性、事件、多重继承功能,要在Java中实现一些面向对象的常见需求,需要大量的胶水代码。 -Bean正是编写这套胶水代码的惯用模式或约定,包括 - -- getXxx -- setXxx -- isXxx -- addXxxListener -- XxxEvent -- ... - -这也是Java代码的常见写法,数据都是声明为 - -```java -private int size; -public int getSize() { return size}; -public void setSize(int _size) { size = _size; } -``` - -public保证接口的向后兼容,内部的实现与size可能会改变, 这就是Java Bean,但是更新的语言C#等就 -不需要,它们在语言自身中就提供了足够的语言特性来实现这些功能。 - -#### 进化 - -1. java bean1.00-A -2. 因需要实现事务,安全,分布式,升级为EJB -3. DI依赖注入,AOP面向切面技术来解决EJB的臃肿,升级为POJO -4. spring - - - -## 其他模块 - -- [maven](./maven.md) \ No newline at end of file + +# Java + +- 编码 + - Java默认字符是Unicode编码,而String类型的编码方式与JVM编码方式都与本机操作系统的默认字符集有关 + +## 语言特性 + +- 不支持默认参数,支持方法重载,同时支持存在歧义。非static方法都是虚方法。同样在C++的virtual方法中使用默认参数,会破坏多态性,所以很多C++编码规范都禁止在虚方法中使用默认参数 + +### 泛型 + +- E Element,在集合中使用,集合中存放的元素 +- T Type, Java的类 +- K key 键 +- V Value 值 +- N Number 数值类型 +- ?不确定的Java类型 + +### Class类 + +是所有对象的运行时类型标识,即RTTI-Run Time Type Identification +它是由JVM创建,它的作用就是在运行时提供或获得某个对象的类型信息 + +```java +public class Shape{} +// get Class method one +Class obj1 = Class.forName("Shape"); +// get Class method two +Shape shape = new Shape(); +Class obj2 = shape.getClass(); + +// instace obj +Class obj3 = Shape.class; + +``` + +### listener + +Java中的事件监听机制,事件观察者向事件发出者进行注册,当事件产生时,事件发出者调用注册的函数进行 +发送。 +事件发出者管理一个array或list来维护注册者,所以尽量不要在多线程中使用这样,需要单线程依次发送。 +特别对于网络的监听是非常多的。 + +### 反射机制 + +在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它们的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 + +即编译后,这些信息都是可获取的,在语言层面提供了支持。 + +### 注解 + +与C语言中的宏是类似功能,Java的注解是在class文件文件基础上的东西,class文件里面是没有注解的,注解的形式是便于编译器在处理class时关联Annotation信息,通过反射去获取信息。 + +#### 元注解 + +java.lang.annotation里面定义了4种原语 + +- @Target,用于明确被修饰的类型,方法,字段,类,接口等 +- @Retention,描述注解的生命周期 + 1. RetentionPolicy.RUNTIME 注解会在class字节码文件中存在,运行时反射即可获得 + 2. RetentionPolicy.CLASS,注解会在class字节码文件中存在,但运行时不能获取 + 3. RetentionPolicy.SOURCE,仅存在源码中,class字节码中不存在 +- @Documented +- @Jnherited + +#### 自定义注解 + +##### 简单注解 + +又称标记,这种注解仅利用自身的存在与否来提供信息,如@Override + +```java +// 定义一个注解 +public @interface Test{} + +// 使用注解 +@Test +public class MyClass{ +} +``` + +##### 复杂注解 + +又称元数据Annotation,提供更多的元数据 + +```java +// 定义注解 +@Rentention(RententionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface MyTag { + // 以method的形式提供 + String name(); + int age() default 32; +} + +// 使用注解 +public class Test { + @MyTag(name="test") + public void info() {} +} +``` + +使用Annotation修饰了程序后,并不会自己生成,需要开发者通过API来提取。所有的元数据的接口都继承 +Annotation父接口 + +方法就是通过反射获取Annotation,将Annotation转换为XXXAnnotation,调用XXXAnnotation中的方法 + +```java +Class clazz = Class.forName(className); +Annotation[] arr = clazz.getMethod("info").getAnnotations(); +for (Annotation an : arr) { + if (an instanceof MyTag) { + MyTag tag = (MyTag)an; + String str = String.format("%s, %d", tag.name(), tag.age()); + System.out.println(str); + } +} +``` + +### bean + +Java语言欠缺属性、事件、多重继承功能,要在Java中实现一些面向对象的常见需求,需要大量的胶水代码。 +Bean正是编写这套胶水代码的惯用模式或约定,包括 + +- getXxx +- setXxx +- isXxx +- addXxxListener +- XxxEvent +- ... + +这也是Java代码的常见写法,数据都是声明为 + +```java +private int size; +public int getSize() { return size}; +public void setSize(int _size) { size = _size; } +``` + +public保证接口的向后兼容,内部的实现与size可能会改变, 这就是Java Bean,但是更新的语言C#等就 +不需要,它们在语言自身中就提供了足够的语言特性来实现这些功能。 + +#### 进化 + +1. java bean1.00-A +2. 因需要实现事务,安全,分布式,升级为EJB +3. DI依赖注入,AOP面向切面技术来解决EJB的臃肿,升级为POJO +4. spring + +## SpringBoot +> 框架,快速开发,适合构建微服务系统,集成度较高,底层很难修改 + +### IoC + +Inversion of Control,控制反转,是spring框架的核心,本质就是spring负责控制对象的生命周期和对象间的关系。 + +在程序运行中,传统方法是,对象A要调用对象B,A具有B的所有控制权,而在IoC中,A的控制权转移到spring中,A向spring要对象B。 + +A不是主动请求的,是spring主动注入对象到A中,这就是**DI(Dependency Injection),依赖注入**的作用,实现的大致逻辑如下: + +- 容器启动阶段 + - 加载配置 + - 分析配置信息 + - 装备到BeanDefinition + - 其他后续处理 +- Bean实例化阶段 + - 实例化对象 + - 装配依赖 + - 生命周期回调 + - 对象其他处理 + - 注册回调接口 + +A不主动请求B,spring是如何知道需要注入对象的呢?主要有三种方式 + +- 接口注入,基本上deprecate了,spring会强制要求A实现不用到的接口,侵入性很强。 +- 构造方法注入,对象A构造完成后就可以使用了,性能上可能造成困扰 +- setter方法注入,可以继承的方法,在逻辑上更好理解些 + +### Ioc类型 + +spring框架提供了两种IoC容器 + +#### BeanFactory + +基础类型IoC容器,提供完整的服务支持,默认采用延迟初始化策略lazy-load。 + +#### ApplicationContext + +是继承自BeanFactory的,扩展了更多的内容。 + +### 注入方式 + +#### 通过注解方式 + +```java +@Component +public class XXXUtil { + @Autowired + private XXX xxxRepo; // + public static XXXUtil sXXX; + public XXXUtil() { + sXXX = this; + } + public void memberFunc() { + // 调用 xxxRepo.findByName + } +} +// 其他地方调用 +XXXUtil.sXXX.memberFunc(); // 不能new XXXUtil,否则xxxRepo为空 +``` + +### RESTful + +url很符合RESTful风格,根据每个controller来,模块化干净清晰 + +### boot.test + +在测试中,注意函数的执行顺序,是从下往上执行函数的 + +```xml + + org.springframework.boot + spring-boot-starter-test + test + +``` + +### boot.data.neo4j + +添加配置 + +```xml +// 依赖 + + org.springframework.boot + spring-boot-starter-data-neo4j + + + org.neo4j + neo4j-ogm-http-driver + +// 配置 +spring.data.neo4j.username=neo4j +spring.data.neo4j.password=123456 +spring.data.neo4j.uri=http://localhost:7474 +``` + +### 前后端分离 + +前端静态资源,通过元素a跳转到指定的href即可,后台的请求就可以全部使用RestController啦! +不直接返回页面,后面的页面也不处理! + + + diff --git a/java/maven.md b/dev-note/maven.md similarity index 85% rename from java/maven.md rename to dev-note/maven.md index f41ad2f..bda5fe7 100644 --- a/java/maven.md +++ b/dev-note/maven.md @@ -1,17 +1,18 @@ -# Maven - -## 命令 -配置好环境后,使用vscode开发,不使用IDE -- mvn test - -## itext7 - -itext7 的字体涉及到版权问题,基本就是与adobe有关 - -```java -PdfFont f2 = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true); -PdfFont f3 = PdfFontFactory.createFont("C:/Windows/Fonts/simhei.ttf", PdfEncodings.IDENTITY_H,true); -//Add paragraph to the document -document.add(new Paragraph("hellos你好").setFont(f2)); -document.add(new Paragraph("hellos你好").setFont(f3)); -``` +# Maven + +## 命令 +配置好环境后,使用vscode开发,不使用IDE +- mvn test 跑test下的所有类 +- mvn test -Dtest=ReportTest 跑test下指定的类 + +## itext7 + +itext7 的字体涉及到版权问题,基本就是与adobe有关 + +```java +PdfFont f2 = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true); +PdfFont f3 = PdfFontFactory.createFont("C:/Windows/Fonts/simhei.ttf", PdfEncodings.IDENTITY_H,true); +//Add paragraph to the document +document.add(new Paragraph("hellos你好").setFont(f2)); +document.add(new Paragraph("hellos你好").setFont(f3)); +``` diff --git a/index/article.md b/index/article.md index da13fba..2bab875 100644 --- a/index/article.md +++ b/index/article.md @@ -23,7 +23,7 @@ - [powershell](../dev-note/powershell.md) - [nodejs包管理](../web/pkg.md) - [包管理C++](../dev-note/pkg.md) -- [maven](../java/maven.md) +- [maven](../dev-note/maven.md) ### web - [网页开发内容](../web/index.md) diff --git a/index/computerScience.md b/index/computerScience.md index bc2d30a..a72a944 100644 --- a/index/computerScience.md +++ b/index/computerScience.md @@ -9,7 +9,7 @@ - [Cplusplus](../cpl/cplusplus.md) - [ECMAScript](../cpl/ECMAScript.md) - [lua](../cpl/lua.md) -- [Java](../java/Java.md) +- [Java](../cpl/Java.md) ### Database diff --git a/java/JavaWeb.md b/java/JavaWeb.md deleted file mode 100644 index b6e3712..0000000 --- a/java/JavaWeb.md +++ /dev/null @@ -1,94 +0,0 @@ -# JavaWeb - -三大组件 - -- Servlet -- Filter -- Listener - -## Servlet - -Server Applet组成的词Servlet - -处理客户端请求的动态资源,当在浏览器地址栏中按下回车后,请求会被发送到对应的Servlet上进行处理。 - -### 接收请求 - -客户端请求会被封装成HttpServletRequest对象,里面包含了请求头,参数等数据 - -### 处理请求 - -在service,doPost或doGet方法进行接收参数,然后调用业务层service进行处理 - -### 完成响应 - -处理完成后,会转发forward或重定向redirect到指定页面 - -#### forward - -HttpServletRequest - -#### redirect - -HttpServletResponse - - -### JSP - -java server pages, 是一种文本处理程序,就是HTML和Java代码在一个文件,与php与HTML一样。 - -JSP是Servlet对HTML的改进。JSP本身也是一种Servlet,JSP会在第一次被编译为HttpJspPage,它的父类是HttpServlet。 - -JSP比Servlet更好用的另一个重要性是,它内置了9个对象:out、session、response、request、config、page、application、pageContext、exception。 - -#### MVC -JSP是view层 -![](./images/java-web-mvc.jpg) - - - -## Filter - -主要负责拦截请求和放行,分四大类 -- REQUEST, 直接访问目前资源时执行的过滤器 -- FORWARD,转发访问 执行过滤器 -- INCLUDE, 访问执行过滤器 -- ERROR,当目标资源在web.xml中配置为``中时的异常 - -url-mapping规则 - -- 精确匹配,/foo.htm -- 路径匹配,/foo/* -- 后缀匹配,*.htm -- 其他写法 - -filter执行的顺序决定于web.xml中的filter-mapping的顺序,前面的先执行,后面的后执行。 -在这里使用static lambda声明了函数的原型 -```java -public class SystemFilter implements javax.servlet.Filter { - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain){ - } -} -``` -在这里调用覆盖了lambda的默认空函数 -```java -public class LoginValidator implements org.springframework.beans.factory.InitializingBean { - @Override - public void afterPropertiesSet() throws Exception { - } -} -``` -目前这样的处理方法,不能避免DOS请求攻击服务器 - -## Listener - -监听器,监听对象为 - -- Application -- Session -- Request - -一旦这些对象发送变化,其监听器就会执行 - - diff --git a/java/Spring.md b/java/Spring.md deleted file mode 100644 index 087db12..0000000 --- a/java/Spring.md +++ /dev/null @@ -1,73 +0,0 @@ -# Spring - -框架 - -## IoC - -Inversion of Control,控制反转,是spring框架的核心,本质就是spring负责控制对象的生命周期和对象间的关系。 - -在程序运行中,传统方法是,对象A要调用对象B,A具有B的所有控制权,而在IoC中,A的控制权转移到spring中,A向spring要对象B。 - -A不是主动请求的,是spring主动注入对象到A中,这就是**DI(Dependency Injection),依赖注入**的作用,实现的大致逻辑如下: - -- 容器启动阶段 - - 加载配置 - - 分析配置信息 - - 装备到BeanDefinition - - 其他后续处理 -- Bean实例化阶段 - - 实例化对象 - - 装配依赖 - - 生命周期回调 - - 对象其他处理 - - 注册回调接口 - -A不主动请求B,spring是如何知道需要注入对象的呢?主要有三种方式 - -- 接口注入,基本上deprecate了,spring会强制要求A实现不用到的接口,侵入性很强。 -- 构造方法注入,对象A构造完成后就可以使用了,性能上可能造成困扰 -- setter方法注入,可以继承的方法,在逻辑上更好理解些 - -### Ioc类型 - -spring框架提供了两种IoC容器 - -#### BeanFactory - -基础类型IoC容器,提供完整的服务支持,默认采用延迟初始化策略lazy-load。 - -#### ApplicationContext - -是继承自BeanFactory的,扩展了更多的内容。 - -### 注入方式 - -#### 通过文件记录被注入与依赖对象的关系 - -##### 文本格式 - -##### xml格式 - -#### 通过编写代码 - -#### 通过注解方式 - -```java -@Component -public class XXXUtil { - @Autowired - private XXX xxxRepo; // - public static XXXUtil sXXX; - public XXXUtil() { - sXXX = this; - } - public void memberFunc() { - // 调用 xxxRepo.findByName - } -} -// 其他地方调用 -XXXUtil.sXXX.memberFunc(); // 不能new XXXUtil,否则xxxRepo为空 -``` - - - diff --git a/java/images/Hibernate-Architecture.png b/java/images/Hibernate-Architecture.png deleted file mode 100644 index 062f777bb3146b612d67436221d4c3009baff69b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19549 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 diff --git a/java/images/java-web-mvc.jpg b/java/images/java-web-mvc.jpg deleted file mode 100644 index 4bd3cc06b952ceecea06fabfe86eba9b3e42ce57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14067 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 diff --git a/java/javax.md b/java/javax.md deleted file mode 100644 index 3ead029..0000000 --- a/java/javax.md +++ /dev/null @@ -1,9 +0,0 @@ -# javax - -是Java的standard extension,早期的历史原因沿用至今。 - -## persistence - -Java Persistence API是JPA对象持久化, 是API的接口规范,需要具体的ORM的实现,Hibernate就是它的实现。 - - diff --git a/java/jpa.md b/java/jpa.md deleted file mode 100644 index a1af613..0000000 --- a/java/jpa.md +++ /dev/null @@ -1,25 +0,0 @@ -# JPA - -## 配置 - -### Open Session In View - -OSIV,是为了解决mvc的controller中hibernate的lazy load的属性时没有session抛出的LazyInitializationException -,对hibernate来说,toMany关系是默认延迟加载,toOne默认是立即加载 - -```shell -spring.jpa.open-in-view=false -``` - -## Hibernate - - -JPA是标准接口,是一套规范;Hibernate是实现的一种方式,是框架 -![](./images/Hibernate-Architecture.png) - -Hibernate主要通过三个组件来实现的 - -- hibernate-annotation 是Hibernate支持annotation方式的配置的基础 -- hibernate-core 是核心实现 -- hibernate-entitymanager 实现了标准的JPA,是hibernate-core与JPA的适配器 - diff --git a/java/springboot.md b/java/springboot.md deleted file mode 100644 index 508945e..0000000 --- a/java/springboot.md +++ /dev/null @@ -1,86 +0,0 @@ -# SpringBoot - -快速开发,适合构建微服务系统,集成度较高,底层很难修改 - -## 配置 - -### RESTful - -url很符合RESTful风格,根据每个controller来,模块化干净清晰 - -### boot.test - -在测试中,注意函数的执行顺序,是从下往上执行函数的 - -```xml - - org.springframework.boot - spring-boot-starter-test - test - -``` - -### boot.data.neo4j - -添加配置 - -```xml -// 依赖 - - org.springframework.boot - spring-boot-starter-data-neo4j - - - org.neo4j - neo4j-ogm-http-driver - -// 配置 -spring.data.neo4j.username=neo4j -spring.data.neo4j.password=123456 -spring.data.neo4j.uri=http://localhost:7474 -``` - -## 前后端分离 - -前端静态资源,通过元素a跳转到指定的href即可,后台的请求就可以全部使用RestController啦! -不直接返回页面,后面的页面也不处理! - -# org.springframework.boot.SpringApplication - -```java -public static void main(String[] args) { - SpringApplication.run(DemoApplication.class, args); -} -``` - -spring也是从main函数开始,按F3进入 - -## org.springframework.boot.Banner - -启动server时打印的logo,即广告内容! - - -## org.apache.commons.logging.Log - -slf4j--Simple Loging Facade For Java, 是Java的日志输出规范接口 - -Logback是spring boot默认的日志实现 - -- trace -- debug -- info -- warn -- error - -log level 默认是info级别 - -## org.springframework.context - -### org.springframework.context.ApplicationContext - -### org.springframework.context.ConfigurableApplicationContext - - - - -