JAVA基础语法与Spring笔记
小马最近在执行一个spring项目源码翻译为PHP的任务。所以复盘了下JAVA知识,做下笔记并分享。笔记目前还比较乱但基本涵盖了主要知识点,入门起飞。
JAVA基础语法
JAVA参考教程文档(这里)。
是解释型的语言(.java文件 javac->.class文件 解释器->JVM虚拟机),GO是编译型的,PHP是解释型的。
JAVA变量有枚举类型,PHP8 才开始支持枚举类型。
重载(形参必须不同,方法名称可以一样)与重写(可不变,内部核心变) --- 多态性。多态存在的三个必要条件:继承,重写,父类引用指向子类对象:Parent p = new Child();
PHP是没有重载的,不能有同名函数。
多态的优点:
1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
JAVA的字符串是 类对象,这和PHP和GO是不一样的,PHP 字符串可以直接加号拼接,JAVA可以借助对象内函数来处理字符串拼接等操作(也可以直接加号拼)。
小马理解,JAVA的package名有点类似 GO的包,PHP的命名空间。
JAVA数据结构
Java 集合框架(https://m.runoob.com/java/java-collections.html)
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
集合框架体系如图所示(找一下图好理解)。
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
// 创建集合
ArrayList
sites.add("Google");
sites.add("Runoob");
sites.add("Taobao");
sites.add("Zhihu");
// 获取迭代器
Iterator
// 输出集合中的第一个元素
System.out.println(it.next());
Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。
泛型,泛型类(泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分)。
--- 这里与UML的泛化 是两种概念,泛化有继承的意思。
泛型类例子:
public class Box
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box
Box
integerBox.add(new Integer(10));
stringBox.add(new String("菜鸟教程"));
System.out.printf("整型值为 :%d/n/n", integerBox.get());
System.out.printf("字符串为 :%s/n", stringBox.get());
}
}
GO和PHP的泛型话题:Golang团队认为在类型系统和运行时的复杂性花费太大,还没找到可以和这个复杂性相抵的良好设计。内置的map和slice其实都有泛型的味道,加上可以用interface{}来构造容器,可以达到泛型的效果。所以目前为止还没有直接的支持泛型。至于PHP,目前还没必要支持泛型。
JAVA类型通配符
1、类型通配符一般是使用 ? 代替具体的类型参数。例如 List> 在逻辑上是 List
2、类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。
3、类型通配符下限通过形如 List super Number> 来定义,表示类型只能接受 Number 及其上层父类类型,如 Object 类型的实例。
对象的序列化和反序列化
类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,它们包含反序列化和序列化对象的方法。
请注意,一个类的对象要想序列化成功,必须满足两个条件:该类必须实现 java.io.Serializable 接口。该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。如果你想知道一个 Java 标准类是否是可序列化的,请查看该类的文档。检验一个类的实例是否能序列化十分简单, 只需要查看该类有没有实现 java.io.Serializable接口。
Java 网络编程
java.net 包中提供了两种常见的网络协议的支持:TCP UDP
Socket 编程
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
socket是一般的app用的(服务端之间的通信?),客户端是任何的socket client, websocket 是web上用,客户端一般是浏览器上的js或其他web客户端 SDK ?
Applet 是一种 Java 程序。它一般运行在支持 Java 的 Web 浏览器内。因为它有完整的 Java API 支持,所以 Applet 是一个全功能的 Java 应用程序。
好多java实例demo(这里)。
Java 8 新特性
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。
Java 9 新特性
注解的理解
JAVA注解是 jdk 5新特性,注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方式。拥有如下优势:简单易读的代码,编译器类型检查,使用 annotation API 为自己的注解构造处理工具。即使 Java 定义了一些类型的元数据,但是一般来说注解类型的添加和如何使用完全取决于你。
注解基本语法
注解的语法十分简单,主要是在现有语法中添加 @ 符号。比如常用的:
@Override:检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated:标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings:每当创建涉及重复工作的类或接口时,你通常可以使用注解来自动化和简化流程。
在这个例子中,注解可以和任何修饰符共同用于方法,诸如 public、static 或 void。从语法的角度上看,注解的使用方式和修饰符的使用方式一致。
自定义注解:
注意啊,interface前边有个@,@interface 这是自定义注解,不是接口。
public @interface Student{
String name(); //属性没有默认值,使用时必须指定值。
int age() default 0 ; //有默认值,使用时,可以不给,也可以给。
String[] hobbies(); //数组格式,按照数组格式赋值,只有一个时,可以省略大括号。
}
//这样使用。
@Student(name="小老犇",hobbies={"放牛","吃草"})
public void abc(){
sout("注解使用");
}
注解中属性的数据类型一共有三种:
八种基本数据类型(byte short int long float double boolean char)
Class, String, 枚举, 注解
以上所有类型的类型数组。
元注解
【用于定义注解】的注解,通常用于注解的定义上:
@Target:目标,描述自定义注解的使用范围,比如:类、接口、枚举、方法等等。 ---- 自定义一个注解类型(有字典列表),然后用来约束检查被 自定义注解注解的 元素:
我们定义了一个适用于类的注解,代码如下所示:
@Target({ElementType.TYPE})
public @interface AnnotationTest {//注意啊,interface前边有个@,这是自定义注解,不是接口。
}
@AnnotationTest
public class Test {
//@AnnotationTest Erro:'@AnnotationTest' not applicable to method
public void method(){
}
}
@Retention:保留,表示注解信息保存的时长。
值说明
SOURCE注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里)
CLASS注解在class文件中可用,但会被VM丢弃(该类型的注解信息会保留在源码里和class文件里,在执行的时候,不会加载到虚拟机中),请注意,当注解未定义Retention值时,默认值是CLASS,如Java内置注解,@Override、@Deprecated、@SuppressWarnning等
RUNTIMEVM 将在运行期也保留注解,因此可以通过反射机制读取注解的信息。
@Documented:生成的JavaDoc文档。
@Inherited:允许子类继承父类的注解,一般情况下获取不到父类注解。
@Repeatable:允许一个注解可以被使用一次或者多次(Java 8)。
不包含任何元素的注解称为标记注解(marker annotation),例如上例中的 @AnnotationTest 就是标记注解。
注解元素
注解元素可用的类型如下所示:
所有基本类型(int、float、boolean等)
String
Class
enum
Annotation
以上类型的数组
不允许使用任何包装类型,但是由于自动装箱的存在,这不算是什么限制。注解也可以作为元素的类型。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
@Documented
public @interface AnnotationTest {
int id();
String value() default "value";
double[] number();
}
public class Test {
@AnnotationTest(id=1,value = "123",number = {1,2,3})
public void method(){
}
@AnnotationTest(id=1,number = {1,2,3})
public void method2(){
}
}
编译器会进行类型检查,如果在注解某个方法时没有给出指定值时,会编译错误;使用default 关键字,则该注解的处理器会使用此元素的默认值。
使用反射操作注解
方法说明
getAnnotations()获取元素上所有的注解
getDeclaredAnnotations()获取元素上所有的注解,不包括从父类(inherited)继承
getAnnotation()获取元素上指定注解
getDeclaredAnnotation()获取元素上指定注解,不包括从父类(inherited)继承
isAnnotationPresent()指定类型的注解存在于此元素上,则返回 true,否则返回 false。
注解不支持继承
Spring
笔者要提醒的是,千万不要把Spring和Spring Framework搞混淆了,很多文章都错误的定义了spring:spring是一个一站式的轻量级的java开发框架,核心是控制反转(IoC)和面向切面(AOP),针对于开发的WEB层(springMVC)、业务层(IoC)、持久层(jdbcTemplate)等都提供了多种配置解决方案。这是Spring Framework的定义,至于Spring,是整个生态。
Spring framework
即Spring,是其他Spring全家桶的基础和核心:包括SpringMVC(业务开发)、SpringBoot(在MVC基础上简化了XML配置,自动装配)、SpringCloud(一整套基于Spring Boot的微服务解决方案)、SpringData、SpringSecurity。
Spring由Rod Johnson创立,2004年发布了Spring框架的第一版,其目的是用户简化企业级开发的难度和周期。
所以,我们学习的时候不要避重就轻,应该以Spring Framework和Spring Boot为主,而不是Spring Cloud。
spring文档:https://www.w3cschool.cn/wkspring/dcu91icn.html
spring视频教程:https://www.imooc.com/video/3662
IOC
接口A a = new 接口A实现类A1()
a.echoA1name();
接口cache
cache = new redis()
XML或注解方式 (实现IOC bean对象容器)
一个beanid 一个对象
xml
.java 载入xml文件,然后 某接口A a =super.getBean('bean_id')
a.hello();//接口函数(得到接口实现类中的具体实现)
初始化bean容器
spring注入(bean对象互相注入):设值注入,构造注入 (配置xml文件bean完成实现)(https://www.imooc.com/video/3668)。 ----- 写完代码后(含注入代码),然后依赖还需要通过 配置XML bean来实现注入后的最终对象
bean配置项
bean作用域: 单例,每次请求新建,每个http请求有效(像session),session(每个session内有效),global session
Spring 基于注解的配置
序号注解 & 描述
1@Required
@Required 注解应用于 bean 属性的 setter 方法。 -----必须要在xml配置文件定义属性
2@Autowired
@Autowired 注解可以应用到 bean 属性的 setter 方法,非 setter 方法,构造函数和属性。---- 自动装载(自定实例化 注入对象,不用在xml配置注入)
3@Qualifier
通过指定确切的将被连线的 bean,@Autowired 和 @Qualifier 注解可以用来删除混乱。
4JSR-250 Annotations
Spring 支持 JSR-250 的基础的注解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 注解。
AOP:面向切面编程 (适用于功能是垂直的)。实现方式:预编译 aspectJ 和 运行期动态代理spring-aop 。(https://www.w3cschool.cn/wkspring/izae1h9w.html)(https://www.jianshu.com/p/38e2ba053ed7)
日志,事务,安全控制
thinkphp AOP(面向切面编程)钩子和行为
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP大概意思指:在程序需要扩展时,不该动原本的代码
在thinkphp中实现类似java的AOP可以使用“行为”。
首先需要知道“切面”,在thinkphp 中称为标签位(钩子,行为)。即在代码的某个位子加入一个标签,这个标签代表执行一个或多个操作,thinkphp也提供了几个标签.
参: https://www.kancloud.cn/manual/thinkphp5_1/354129
参: https://www.kancloud.cn/manual/thinkphp5/118130
springBoot
spring的bean容器相关的注解有:@Required, @Autowired, @PostConstruct, @PreDestory。还有Spring3.0开始支持的JSR-330标准javax.inject.*中的注解(@Inject, @Named, @Qualifier, @Provider, @Scope, @Singleton).
springmvc相关的注解有:@Controller,@RequestMapping,@RequestParam, @ResponseBody等等。
@PostMapping("login")
@PostMapping
用于将POST请求映射到控制器处理方法上。具体来说,@PostMapping是一个作为快捷方式的组合注解等价于@RequestMapping(method = RequestMethod.POST)。
@Log("登录") 每个方法前面加注解,通过注解类实现拦截器。(Log类被定义为注解public @interface Log ,在具体某业务函数上加上注解代表该函数需要执行注解的拦截@Log("登录") ,Log类(其实是一个拦截器实现)实现拦截器接口class Log implements HandlerInterceptor这样即可实现在任意函数前加注解就可以日志写入)
版权声明:
作者:zhangchen
链接:https://www.techfm.club/p/51824.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论