Shout

高级开发必须理解的Java中SPI机制

霸气de小男生 提交于 2021-01-17 02:57:50
本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。 1 SPI是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。 整体机制图如下: Java SPI 实际上是“ 基于接口的编程+策略模式+配置文件 ”组合实现的动态加载机制。 系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。 Java SPI就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。所以SPI的核心思想就是 解耦 。 2 使用场景 概括地说,适用于: 调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略 比较常见的例子: 数据库驱动加载接口实现类的加载 JDBC加载不同类型数据库的驱动 日志门面接口实现类加载 SLF4J加载不同提供商的日志实现类 Spring Spring中大量使用了SPI,比如:对servlet3

(六)Spring从入门到入土——Bean的装配机制

牧云@^-^@ 提交于 2021-01-10 00:29:37
Spring Bean的装配机制 Spring中bean有三种装配机制,分别是: 在xml中显式配置; 隐式的bean发现机制和自动装配。 在java中显式配置;(java Config) Spring的自动装配需要从两个角度来实现,或者说是两个操作: 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean; 自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI; 组件扫描和自动装配组合发挥巨大威力,使得显示的配置降低到最少。 接下来我们就一起看一下如何用XML显示装配以及如何隐式的bean发现机制以及自动装配 XML中显式配置 1、新建一个项目 2、新建两个实体类,Cat Dog 都有一个叫的方法 public class Cat { public void shout() { System.out.println("miao~"); } } public class Dog { public void shout() { System.out.println("wang~"); } } 3、新建一个用户类 User public class User { private Cat cat; private Dog dog; private String str; } 4

JAVA3

。_饼干妹妹 提交于 2020-12-12 02:20:09
(一)学习总结 1.阅读下面程序,分析是否能编译通过?如果不能,说明原因。应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { System.out.println("Parent Created"); super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } public class Test{ public static void main(String args[]) { Child c = new Child(); } } -不能通过编译,运行结果为

C++ 奥特曼打怪兽之类的应用(系列3)

落爺英雄遲暮 提交于 2020-08-13 03:02:39
题目描述 在前面实验的基础上,根据题目要求进行修改,实现打斗过程。 怪兽分为四种类型(定义四个类): 普通型怪兽(NMonster):攻击力是等级2倍,生命是10倍,金钱经验是10倍 攻击型怪兽(AMonster):攻击力是等级4倍,生命是5倍,金钱经验是10倍 防御型怪兽(DMonster):攻击力是等级1倍,生命是20倍,金钱经验是10倍 肉鸡型怪兽(SMonster):攻击力是等级1倍,生命是10倍,金钱经验是20倍 定义一个守护神类(Angel),该类定义怪兽或奥特曼的守护神,为怪兽或奥特曼提供帮助。守护神等级为所守护对象的等级(例如守护神a1守护等级为3的攻击型怪兽am1,则a1的等级也为3),攻击是等级的一半,无生命。怪兽的守护神金钱和经验都为等级的5倍。奥特曼的守护神金钱和经验为0,等级随守护对象升级而升级。 为四个怪兽类和奥特曼类添加守护神对象成员,使它们都成为复合类。 当奥特曼战胜怪兽后,将获得怪兽及其守护神的经验金钱。 修改奥特曼类和怪兽类相关成员函数,实现守护神类与它们的关系,具体如下: 奥特曼,守护神为它攻击攻击型怪兽时,加1点攻击力,而在它攻击防御型怪兽时,加2点攻击力,在获得肉鸡型怪兽的金钱和经验时,翻倍(获得怪兽的经验和金钱翻倍)。 普通型怪兽和肉鸡型怪兽,无守护神。 攻击型怪兽,守护神为它在攻击奥特曼时,也打一次,使奥特曼除了受到怪兽攻击

利用Vue这些修饰符帮我节省20%的开发时间

独自空忆成欢 提交于 2020-08-08 16:45:03
为了方便大家写代码,vue.js给大家提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等~。 目录 表单修饰符 事件修饰符 鼠标按键修饰符 键值修饰符 v-bind修饰符(实在不知道叫啥名字) 表单修饰符 填写表单,最常用的是什么?input!v-model~而我们的修饰符正是为了简化这些东西而存在的 1.lazy 从这里我们可以看到,我们还在输入的时候,光标还在的时候,下面的值就已经出来了,可以说是非常地实时。 但是有时候我们希望,在我们输入完所有东西,光标离开才更新视图。 这样即可~这样只有当我们光标离开输入框的时候,它才会更新视图,相当于在onchange事件触发更新。 2.trim 在我们的输入框中,我们经常需要过滤一下一些输入完密码不小心多敲了一下空格的兄弟输入的内容。 为了让你更清楚的看到,我改了一下样式,不过问题不大,相信你已经清楚看到这个大大的hello左右两边没有空格,尽管你在input框里敲烂了空格键。 需要注意的是,它只能 过滤首尾的空格 !首尾,中间的是不会过滤的 3.number 看这个名字就知道,应该是限制输入数字或者输入的东西转换成数字,but不是辣么干的。 如果你先输入数字,那它就会限制你输入的只能是数字。 如果你先输入字符串,那它就相当于没有加.number 事件修饰符 1.stop 由于事件冒泡的机制

vue中的修饰符

三世轮回 提交于 2020-08-08 13:08:16
vue.js提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等 [TOC] 表单修饰符 v-model input最常用的双向绑定指令,实现了输入输出的实时绑定显示 <div> <input type = "text" v-model= "value" > <p>{{value}}</p> </div> 复制代码 .lazy 光标离开更新 但是有时候我们希望,在我们输入完光标离开才更新视图,相当于在onchange事件触发更新。 <div> <input type = "text" v-model.lazy= "value" > <p>{{value}}</p> </div> 复制代码 .trim 过滤首尾的空格 只能过滤首尾的空格!首尾,中间的是不会过滤的 <input type = "text" v-model.trim= "value" > 复制代码 .number 如果你先输入数字,那它就会限制你输入的只能是数字。 如果你先输入字符串,那它就相当于没有加.number 而不是单一的限制输入数字或者输入的东西转换成数字 事件修饰符 .stop 阻止事件冒泡 由于事件冒泡的机制,我们给元素绑定点击事件的时候,也会触发父级的点击事件; 一键阻止事件冒泡,相当于调用了event.stopPropagation()方法。 <div @click= "shout(2)

Java结构型模式(1)——适配器模式

。_饼干妹妹 提交于 2020-07-27 12:59:50
《2020年阿里云活动拼团》: https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=czfmwdn3 【限时】1年86元,3年229元,用来建站和编程学习【 附WordPress建站教程 】 适配器模式属于结构型模式的一种,它可以理解为现实生活中的电源适配器、网络适配器等。首先要搞清楚什么是结构型模式。 ​ 结构型模式是将系统中的多个类或对象组合在一起,相互协作来完成更复杂的任务或功能。就好比搭积木,许多简单积木可以搭建成更复杂、功能更强大的结构。它分为两种形式:类结构型模式和对象结构型模式。类结构型模式由多个类组合,存在继承和实现关系;对象结构型模式由类和对象组合,存在关联关系(比如车和轮胎的关系)。 ​ 下面我们再介绍适配器模式: ​ 1、定义:将一个类的接口转化成多个类可以兼容的接口,使其协同工作而无需修改现有类的内部结构。 ​ 2、模式结构: ​ (1)Target(目标抽象类):定义了特定的工作接口。 ​ (2)Adapter(适配器类):模式的核心类,作为转换器对Target和Adaptee进行适配。 ​ (3)Adaptee(适配者类):定义了需要适配的接口。 ​ (4)Client(客户类):针对目标抽象类编程,调用其定义的方法。 ​ 3、类适配器和对象适配器的比较: ​ 类适配器中

Java子类对于父类中static方法的继承

故事扮演 提交于 2020-05-01 06:18:21
今天看到了Java中子类继承父类的一个相关讨论,在网上综合了各家的观点,写下了一篇简短的总结。 问题如下,在父类中含有staic修饰的静态方法,那么子类在继承父类以后可不可以重写父类中的静态方法呢? 答案是:不能。 很多人可能会提出疑问,因为他们在写代码的时候出现过以下代码,举例: 父类:Animal.java public class Animal { public Animal() { } public void run() { System.out.println("动物可以奔跑"); } public static void shout() { System.out.println("动物可以叫"); } }    子类:Dog.java public class Dog extends Animal { public Dog() { // TODO Auto-generated constructor stub } public static void main(String[] args) { Dog dog = new Dog(); dog.run(); dog.shout(); } @Override public void run() { System.out.println("狗跑得很快"); } public static void shout() {

Abstract, sealed, virtual, new, override怎么用

亡梦爱人 提交于 2020-04-30 13:45:01
今天跟大家分享一下关于访问限定和数据成员的知识。主要包括以下两点: Abstract, sealed, virtual, new, override怎么用? Const 和 readonly好像都表示不能改变的值,有什么区别呢? 一、 访问限定 类和方法有一些访问限定符,如private,public等。除此之外,还包含一些预定义特性。下面几个你都知道吗? 1. 类的预定义特性 Abstract——抽象类。不能实例化。如果派生类不是抽象类,则必须实例化。 Sealed——密封类。不能做基类被继承。 要想既不能实例化又不能被继承? 需要两个步骤: seadled修饰。防止被被继承 ; 私有化无参构造器。防止实例化自动调用默认无参构造函数。例如: sealed class Demo { private Demo() { } ... } 2. 方法的预定义特性 Abstract——用于抽象类中的抽象方法,该方法不能包含具体实现。派生类如果不实现该方法,则必须为抽象类。 public abstract class Animal { public abstract void Shout(); } Virtual ——用于非静态方法。调用时实现的是继承链最末端的方法,也就是按照运行时类型调用的,而不是编译时类型。 New——隐藏但并不会改变基类中虚方法的实现。 Override—

Vue这些修饰符帮我节省20%的开发时间

亡梦爱人 提交于 2020-02-26 18:56:18
为了方便大家写代码,vue.js给大家提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等~ 目录 表单修饰符 事件修饰符 鼠标按键修饰符 键值修饰符 v-bind修饰符(实在不知道叫啥名字) 表单修饰符 填写表单,最常用的是什么?input!v-model~而我们的修饰符正是为了简化这些东西而存在的 .lazy <div> <input type="text" v-model="value"> <p>{{value}}</p> </div> 从这里我们可以看到,我们还在输入的时候,光标还在的时候,下面的值就已经出来了,可以说是非常地实时。 但是有时候我们希望,在我们输入完所有东西,光标离开才更新视图。 <div> <input type="text" v-model.lazy="value"> <p>{{value}}</p> </div> 这样即可~这样只有当我们光标离开输入框的时候,它才会更新视图,相当于在onchange事件触发更新。 .trim 在我们的输入框中,我们经常需要过滤一下一些输入完密码不小心多敲了一下空格的兄弟输入的内容。 <input type="text" v-model.trim="value"> 为了让你更清楚的看到,我改了一下样式,不过问题不大,相信你已经清楚看到这个大大的hello左右两边没有空格,尽管你在input框里敲烂了空格键