java基础梳理及感悟

程序是使用代码对现实世界进行抽象,自己简单写的Hello World程序基本上算不上什么软件,所谓软件开发就是以“人”为出发点,设计出满足“人”特定期望的东西。在实现“事”的过程中会依据“规则”使用某些“物”。例如电商,其所做的事情就是对交易场景的抽象。在满足了helloworld的牙牙学语后,要试着模拟现实世界事情。

          比如一个媒体资料库,可以一个Database类里面存有CD,DVD两类事物的集合,然后给这个资料库cd,dvd的添加查看方法,这样就简单的模拟了一个录像店。

private ArrayList<CD>cds = new ArrayList<CD>();private ArrayList<DVD>dvds = new ArrayList<DVD>();

public void add(CD cd){cds.add(cd)}public void add(DVD dvd){dvds.add(dvd)}

public void list(){for(CD cd:cds){cd.print()}for(DVD dvd :dvds){dvd.print()}

但是这样看起来有很多重复代码 ,CD和DVD也有重复属性,且如果需要存储新的类型又要复制粘贴,这时候引入一个Item类,Database类只存ArrayList<Item>,CD,DVD继承于Item,将添加查询具体的CD,DVD改为添加查询Item类,有新增类继承Item即可

private ArrayList<Item>items = new ArrayList<Item>();

public void add(Item item){items.add(item)}

public void list(){for(Item item:items){item.print()}

类定义了类型,子类定义了子类型,子类对象可以被当作父类对象来使用:子类对象可以赋值给父类变量、子类对象可以传递给需要父类对象的函数、子类对象可以放在存放父类对象的容器里。

当我们去构造子类对象时,先调用父类构造方法,属性初始化,然后再轮到子类构造器和属性初始化。在子类有自己的属性和从父类继承的属性,this代指自己super代指父类。如果子类当中有父类有过的相同名字成员变量,在子类中父类成员变量不是不存在而是被隐藏了,但用super关键字调用父类方法赋值是赋给父类属性,在谁的类的就是指谁的成员变量。通常来说离我最近的是我的,每个类管理自己范围内的事。

在java中对象变量赋值并不是让一个对象给另一个对象赋值,而是让这两个对象管理者去管理一个共同对象,赋值运算就是让某个变量去指向另一个对象,去管理另一个对象。这时候就会发生让静态类型为某个类型的变量去管理动态类型和静态类型不符的对象,java的对象变量是多态的,可以保存声明类型或者子类类型的对象。子类对象可以赋值给父类变量,父类对象只能造型为子类对象。

用封装来降低耦合,用接口或抽象来实现聚合,用数据加容器来提供可扩展性

要有属于自己的思维,自己对于某个业务某个知识点的判断

要学习设计者思维,自定义自己身边的任何业务功能

思考 :一个http请求传输数据最终存储到数据库的完整过程 

计算机启动:主板-->ROM(BIOS)-->指定位置去加载操作系统-->调度系统 循环执行不同进程(包含jvm进程)

客户端 -->数据一定包含ip-->服务器-->网卡硬件-->收到数据--中断信号-->CPU-->执行驱动将数据读取到内存

数据从CPU收到硬件传递的中断信号开始,这个信号后,cpu停止手上工作处理这个中断信号【信号编号】

内存包括内核态(操作系统代码,驱动代码,ip网络数据)和用户态(应用程序),数据从内核态拷贝到用户态,内核态不仅仅独立隔离内存 还有cpu高权限指令执行。

当java程序中某线程收到网络请求后,将硬件驱动加载数据存放到堆内存,通过socket读取数据,从用户态切换到内核态调用数据库服务

 

Tomcat

当通过浏览器请求域名下路径时,首先客户端请求DNS服务器,响应回域名对应ip,客户端向该ip建立TCP连接,Tcp连接建立成功,客户端http请求路径对应资源,服务器响应页面浏览器渲染展示html。Tomcat就是一个java编写的apache软件基金会开源软件,默认webapps为应用部署目录

server.xml中Connector组件负责接收客户端发过来的TCP连接请求,创建一个Request和Response对象用于和请求端交换数据,交给Container组件一直到执行web应用的代码此时会根据web.xml找到相应servlet处理并返回。并且通过<Executor>可配置Connector指定依赖线程池,事先创建一定数目线程,当有任务时从池中取出用完再放回此内

JDBC 主要步骤为

// 1 加载数据库驱动

Class.forName(DRIVER);

// 2 获得数据库连接

Connection conn = DriverManager.getConncetion(URL, USER, PASS);

//3 创建Statement 可以视为 sql容器

Statement stmt = conn.createStatement();

//4 执行sql语句,获取执行结果

ResultSet rs = stmt.executeQuery("select userName from user"):

// 遍历结果  异常处理  清理资源

使用出于内存效率防止乱码等方面考虑,JDBC还提供了游标 流方式 批处理 设置字符集等高级特性

而mysql客户端和服务端建立连接时间开销大,往往通过连接池的连接复用将建立连接变为租借连接。

数据库事务是指一系列sql操作形成的逻辑整体,在一个可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)

 两个或以上事务执行过程中会因争夺锁资源而互相等待造成死锁。

多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题如脏读(Drity Read),幻读(Phantom Read),不可重复读(Non-repeatable read)。通过设置数据库的事务隔离级别可以解决多个事务并发情况下出现的脏读、不可重复读和幻读问题,数据库事务隔离级别由低到高依次为Read uncommitted、Read committed、Repeatable read和Serializable等四种。MySQL数据库支持上面四种事务隔离级别,默认为Repeatable read。

Mybatis不是建立java对象到关系数据表的映射关系,而是建立对对象操作方法到sql语句的映射关系,因为灵活性好,

根据xml或注解加载sql语句、参数映射、结果映射到内存中,应用程序调用APE传入参数和sql ID。Mybaits自动生成sql语句完成数据库访问,转换执行结果返回应用程序

Spring JDBC封装数据库访问操作,利用JdbcTemplate进行数据操作但是结果集处理不够友好,对JDBC的SQLException的check异常变为DataAccessException的unchecked异常,不用写try catch语句,Spring已经封装好了

Spring对数据库事务的支持,抽象成统一事务编程模型PlatorformTransactionManager,可以兼容JDBC事务和Hibernate事务

我们可以编程式使用TransactionTemplate对象,也可以声明式使用@Transaction。

隔离等级的实现:基本和数据库事务隔离等级保持一致。
传播行为:属于事务增强特性。解决的是嵌套事务的相互影响的问题

 

注解 java.lang.reflect包

是对java代码进行标注,通过反射访问标注信息,以此再运行时改变注解对象的行为。如果不和反射结合,注解就和注释一样只是起标识作用,但是注释再编译后class文件中不存在,注解则可以保存到class文件,甚至根据元注解内容可以运行期加载的class对象中,使用@interface创建注解。注解名上加上元注解(描述注解的注解)

@Retention定义注解的生命周期(source --> class --> runtime)

@Documented 文档注解 会被javadoc工具文档化

@Inherited 是否让子类继承该注解

@Target 描述注解应用范围(顾名思义:TYPE、PACKAGE、PARAMETER、ANNOTATION_TYPE、METHOD、FIELD、CONSTRUCTOR、LOCAL_VARIABLE)

注解内部可以设置值也可以不设置,支持java基本数据结构。

反射 java.lang.annotation包

在运行状态中,只要知道类名字就可以动态获取类信息及动态调用方法功能,特别是当属性方法作用域为私有,通过 setAccessible 支持访问。通过反射可以自由的访问某一个类,提高java程序灵活性和扩展性,降低耦合性。

代理模式

不直接访问某一对象,通过访问继承该类或实现共同接口的代理类,实现扩展类功能而非修改已经写好的类,符合开闭原则。

静态代理:需要手动继承类或实现接口,且如果接口增加方法,目标对象代理对象都需要维护,会出现大量重复代码

动态代理:利用反射机制在程序运行时动态生成代理类,java.lang.reflect.Proxy类的静态方法newProxyInstance返回一个接口的代理实例。针对不同的代理类,传入相应的ClassLoader 对象、一组 interface 来、代理程序控制器InvocationHandler。如果接口数量大于65535,抛出非法参数错误

企业开发模式经历了Model1(jsp javabean)-->Model2(jsp servlet javabean)--> Model3(表现层 业务层 持久层)

从model1的javabean或其他服务完成业务逻辑、数据库操作、返回页面,jsp接受客户端请求获取结果、css,js,java片段混合一起,jsp既要负责页面控制又要负责逻辑处理,没有单一职责。再到model2虽然职责清晰部分解耦可业务逻辑和数据库操作还是混在一起,model3将业务逻辑中数据库处理部分分离单独作为一层,但仍然需要new的业务bean太多,分层太多,重复代码太多,直到Spring ioc出现,后台开发基本是表现层SpringMVC 业务层 Spring  持久层Mybatis/Hibernate。再到现在Springboot/SpringCloud。耦合度越来越低,职责越来越细分。

    由solid坚固的六大设计原则:单一职责,开闭原则,里氏替换,迪米特法则(最小知识原则),接口隔离,依赖倒置。衍生出的设计模式是前辈们对代码开发的经验总结,是解决某些特定问题的通用套路。这些原则、模式是为了提高代码可复用,可维护,可读,健壮安全的解决方法。GOF23种设计模式分为创建型、结构型、行为型。

(1)创建型(提供不用new方式实例化对象,创建对象的同时隐藏创建逻辑,使得程序或者容器可以灵活的选择在哪些时刻创建哪些对象)有工厂,抽象工厂,单例,建造者,原型。

(2)结构型(关注类和对象的结构,通过继承方式组合接口和扩展对象新功能,这里似乎和合成复用原则违背?尽量使用合成/聚合的方式,而不是使用继承)有代理,适配,桥接,过滤器,组合,装饰器,外观,享元

(3)行为型(关注对象之间的通信)有观察者,迭代器,责任链,策略,命令,状态等

23种设计模式都是建立在面向对象的基础之上的,但其实面向过程的编程中也有很多高效的编程模式。

生产者消费者模式便是其中之一,在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据。缓冲区就相当于将生产者消费者解耦,引申开就是分布式系统框架架构中重要的组件:消息队列技术。也是为了通过异步处理提高系统性能和削峰、降低系统耦合性。。。。

框架是为了辅助开发,封装jdk高度抽象,要知其然知其所以然,学习框架是学习框架的思想:

1 找到逻辑基点 它的最小知识是什么,比如Spring核心思想是控制反转,需要将自己的java对象提供给spring管理,管理就需要一个容器存放这些对象

2 大胆假设 使用application.getBean这个方法可以根据名字获得bean,传入一个字符串获得一个对象,这个行为就像一个Map3 反向推论  既然是个map,假设我们自己来写一个Spring容器应该怎么去做?

 

     学习要戒骄戒躁,当然知易行难,所以才要打卡呀写博客呀说出目标大家监督呀,但是如果这些都是外部因素,自己不想行动自己不努力自己不狠心一有诱惑就葛优躺就把持不住那外界再怎么逼迫也没用,就像有台生产机器你如果使用它就可以减少你手工作业的时间,但是你就是不想启动它就想自己手工,原因有很多,手工久了习惯舒适区、机器启动复杂害怕变化、畏难自我设限瞻前顾后、与众不同不合群、攀比焦虑心不定等等。。。但是不改变是不行的呀,压力尽管不能让你产生动力,但是压力能压死你,所以要正视困难直面挫折,要相信自己能过上理想生活,不要胡思乱想带着问题死敲,就算他人不理解他人指责尽管有时候是自我臆想,但是要自己尊重自己,我只能被自己定义,对自己的人生负责,这样才能不忘初心慎始慎终,不要亵渎了这份初心这份尊重。

      尊重自己尊重他人,尊重科学尊重规律,不以富喜不以穷悲。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值