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 062f777..0000000 Binary files a/java/images/Hibernate-Architecture.png and /dev/null differ diff --git a/java/images/java-web-mvc.jpg b/java/images/java-web-mvc.jpg deleted file mode 100644 index 4bd3cc0..0000000 Binary files a/java/images/java-web-mvc.jpg and /dev/null differ 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 - - - - -