mengxh1990 / javaweb_note

learn about java web
0 stars 0 forks source link

Java web notes #3

Open mengxh1990 opened 6 years ago

mengxh1990 commented 6 years ago

设计模式

发布/订阅设计模式

JMS: 点对点,消息存在queue中,一个消息只能被一个消费者(订阅者)消费; 发布/订阅,消息存在topic中,一个消息可以被多个订阅者消费。 把不同事件的数据推送到不同的topic中,即以事件名称来作为topic分类,在Consumer端,建立自己的group来消费自己感兴趣的一组topic

观察者模式,被观察者每次执行一个方法时,都调用notifyObservers,遍历所有的observers,调用每一个observer的update方法。

责任链模式

所有的请求处理者连成一个处理链,请求在这个链上传递,直到有一个处理者处理它。 每个节点做两件事(即handleRequest方法的内容):判断为自己处理的类型或者级别就做出回应;不是自己处理的则转发给下一个处理者。 处理者的抽象类Handler已经完成了handleRequest和setNextHandler,具体的处理者类只需实现自己的业务逻辑。

单一职责原则

接口的职责一定要单一,面向接口编程。 除了接口、类,方法也要职责单一。

里氏替换原则

只要父类出现的地方,子类都可以顶上,子类替换父类之后不会有任何错误,但是反之不行。 为什么?因为子类继承了父类的所有属性和方法,并且可能会扩展自己的属性和方法,当然可以替换父类。 在类中调用其他类,或者给方法传递参数时,一定要使用父类或者接口,否则会违背里氏替换原则。 如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

依赖倒置原则

  1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象
  2. 抽象不应该依赖细节;
  3. 细节应该依赖抽象。 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。 总之就是,面向接口编程

每一个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块,原子逻辑的再组装就是高层模块。

实现类之间不要直接发生依赖关系,要通过接口或者抽象类发生依赖关系。 高层模块对底层模块的依赖建立在抽象上。

倒置: 不是实物类之间依赖,而是抽象之间依赖。

接口隔离原则

接口细化,接口纯洁。 接口中不要定义具体类的属性。 把臃肿的接口,拆分为独立专用的接口。接口是设计时对外提供的契约。

软件工程

构建之法(第三版)

mengxh1990 commented 6 years ago

随记、收藏、待读

构建之法(第三版)

孤傲苍狼博客

接口里不要定义每个对象专门的属性,而是定义公共的、共享的、固定的约束性的常量属性。具体属性放在具体类中。

序列化Serializable

变量(对象)从内存中变成可存储传输的过程称之为序列化。 对象序列化为字节,然后存储或者传输。 序列化为json字符串。

几种对象序列化方式: 对象序列化(二进制字节码):java原生支持,类实现Serializable接口,不能跨语言,序列化后为字节码; JSON字符串:跨语言,格式清晰可读性好,依赖不同的JSON库,jackson, fastjson, gson, org.json, json-lib等。

JNDI真正的用处是在J2EE系统中担任配置中心的角色, 各个系统通过RPC协议动态获取配置. J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。

在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。

SSO

https://www.cnblogs.com/ywlaker/p/6113927.html

mengxh1990 commented 6 years ago

JS

JS中的对象(即json),可以以数组的形式使用,比如: var json; json["key1"] = "value1"; json["key2"] = "value2"; json["key1"] = "changed_value1"; //引用json对象中的元素时,既可以用**[]**数组的形式,也可以用**.**对象的形式 json["key1"]; json.key1;

JS prototype : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

JS没有真正的类的概念 JS通过原型prototype实现继承,即原型继承,prototype属性可以理解我java中的父类对象。 typeof Function "function" typeof Array "function" typeof String "function" typeof Object "function" 通过new构造方法创建的实例对象,该对象的prototype即构造方法的prototype,构造方法的原型对象即构造方法所属的类本身的一个对象(理解为Java中的类,实际上js是没有类的,js实际上是基于原型,而不是基于类的)。比如: Object.prototype,是Object构造函数的原型对象,即Object类(理解为类)的对象。 原型可类比java中的父类。

jQuery.extend??

mengxh1990 commented 6 years ago

定时器

http://www.ibloger.net/article/2650.html

misfire机制: http://www.cnblogs.com/pzy4447/p/5201674.html

scheduler维护JobDetails和triggers的注册表。

3,可以手动触发job, triggerJob(String jobName, String jobGroup)

4,boolean mayFireAgain() Used by the Scheduler to determine whether or not it is possible for this Trigger to fire again. If the returned value is false then the Scheduler may remove the Trigger from the JobStore.

simple trigger在创建时被初始化指定一个MISFIRE_INSTRUCTION_XXX updateAfterMisfire:就是根据策略重新计算start_time, next_fire_time, repeat_count, timestriggered等。 Updates the SimpleTrigger's state based on the MISFIRE_INSTRUCTION_XXX that was selected when the SimpleTrigger was created.

If the misfire instruction is set to MISFIRE_INSTRUCTION_SMART_POLICY, then the following scheme will be used: If the Repeat Count is 0, then the instruction will be interpreted as MISFIRE_INSTRUCTION_FIRE_NOW. If the Repeat Count is REPEAT_INDEFINITELY, then the instruction will be interpreted as MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT. WARNING: using MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT with a trigger that has a non-null end-time may cause the trigger to never fire again if the end-time arrived during the misfire time span. If the Repeat Count is > 0, then the instruction will be interpreted as MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT.

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY Instructs the Scheduler that the Trigger will never be evaluated for a misfire situation, and that the scheduler will simply try to fire it as soon as it can, and then update the Trigger as if it had fired at the proper time. NOTE: if a trigger uses this instruction, and it has missed several of its scheduled firings, then several rapid firings may occur as the trigger attempt to catch back up to where it would have been. For example, a SimpleTrigger that fires every 15 seconds which has misfired for 5 minutes will fire 20 times once it gets the chance to fire.

existing_repeat_count: unchanged remaining_repeat_count : 剩余执行次数,还要减去misfire的次数。

misfire:就是本来应该在原计划的nextFireTime执行,却比nextFireTime延迟了。 timesTriggered:已经fire的次数

只有延时超过阈值,才算misfire.

mengxh1990 commented 5 years ago

华为云教程 https://activity.huaweicloud.com/devcloud_practice/index.html?utm_source=DevCloud&utm_medium=board 微服务上云实践课 https://education.huaweicloud.com:8443/courses/course-v1:HuaweiX+CBUCNXV007+Self-paced/courseware/c4f5d326122c4d329cdc48e002bac8cc/c381c1fb198d4827ac626c59868da93f/