容器

spring控制反转(IOC)

最后都变了- 提交于 2020-02-25 10:38:16
一、IOC的基础知识以及原理 背景:在采用面向对象方法设计的软件系统中,底层实现都是有N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对象A和对象B之间有关联,对象B又和对象C有依赖关系,这样对象和对象之间有着复杂的依赖关系,所有才有了控制反转这个理论。 什么是控制反转(IOC)? IOC是Inversion of Control的缩写,有的翻译成控制反转,还有翻译成为控制反向或者控制倒置。 简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现是对外部来说是透明的,从而降低了解决问题的复杂度,从而可以灵活地被重要和扩展。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖对象之间的解耦,如下图所示: 即把各个对象类封装之后,通过IOC容器来关联这些对象类。这样对象与对象直接就通过IOC容器进行联系,但对象与对象之间没有什么直接联系。 如果去掉IOC容器后系统中的对象A与对象B就有了直接联系,如右图所示 比如好多的对象类要关联起来的话,就会变得很复杂,如右图所示: 所以提出IOC控制反转还是很有必要的。 为什么要把这种方式叫做控制反转呢? 软件系统在没有引入IOC容器之前,对象A依赖对象B,那么A对象在实例化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建好的对象B

浅谈 Lifecycles 组件中 Transformations的switchMap 在MVVM 框架中的使用

谁说胖子不能爱 提交于 2020-02-25 00:32:03
LiveData<T>: 内容为T类型数据的容器,可监听内容的变化且具有一定的实时性 对外提供监听容器内容变化的接口observe(LifecycleOwner, Observer) 会在适当的时期通知监听器 适当的时期:激活状态(LifecycleRegistry监听fragment生命周期) 外部需MutableLiveData才能改变容器内容 MutableLiveData: 继承至LiveData 提供改变容器内容的接口setValue/postValue MediatorLiveData: 继承至MutableLiveData 可监听其他容器内容的变化,通过addSource(source:LiveData, Observer) addSource还需在激活状态下才会有机会调用addSource中的Observer(激活后,source才会添加Observer作监听器) Transformations.map: 容器A监听B内容的变化,变化时将B内容转化为相应的内容并通知A监听器 原理是利用MediatorLiveData的addSource对其他容器内容监听,在Observer中再对MediatorLiveData修改内容为转化了的相应的数据,来通知自己的监听器内容发生变化 Transformations.switchMap: 容器A监听B内容的变化

spring boot容器启动详解

99封情书 提交于 2020-02-24 20:21:06
目录 一、前言 二、容器启动 2.1 @SpringBootApplication注解 2.2 SpringApplication.run()静态方法 如上图,容器启动流程可以分为5个主要步骤: 1.getRunListeners获取监听器(SpringApplicationRunListeners ) 载入工厂名称(loadFactoryNames) 创建spring工厂实例(createSpringFactoriesInstances) 2.准备好环境 3.准备上下文 4.刷新上下文 5.刷新完上下文后 三、总结 一、前言 spring cloud大行其道的当下,如果不了解基本原理那么是很纠结的(看见的都是约定大于配置,但是原理呢?为什么要这么做?如何串联起来的?)。spring cloud是基于spring boot快速搭建的,今天咱们就看看spring boot容器启动流程(全文基于1.5.9版本)。(本文不讲解如何快速启动spring boot,那些直接官方看即可) 二、容器启动 spring boot一般是 指定容器启动main方法,然后以命令行方式启动Jar包 ,如下图: 1 @SpringBootApplication 2 public class Application { 3 public static void main(String[] args) { 4

Docker存储驱动之AUFS简介

可紊 提交于 2020-02-24 16:06:58
简介   AUFS曾是Docker默认的首选存储驱动。它非常稳定、有很多真实场景的部署、很强的社区支持。它有以下主要优点:   极短的容器启动时间。   有效的存储利用率。   有效的内存利用率。   虽然如此,但由于它没有包含在Linux内核主线中,所有很多Linux发行版并不支持AUFS。   以下章节介绍AUFS的特性,并且它们如何作用于Docker。 特性 镜像分层和部署   AUFS是一种联合文件系统。它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层。下图展示出ubuntu:latest的镜像的分层。       注意 :在Docker1.10之前,layer的ID对应着其在/var/lib/docker下的目录名称,但在Docker1.10之后,不再有这种直接的对应关系。   对于一个容器来说, 只有顶层的容器layer是可读写的,而下面的layer都是只读 的。 读写文件   Docker使用AUFS的CoW(Copy-on-Write)技术来实现镜像共享和最小化磁盘空间的使用。AUFS作用于文件层,也就是说AUFS CoW拷贝整个文件——即使文件只修改了一点点的内容。所以,它对容器的性能影响很明显,尤其拷贝多层镜像下的大文件,或者是在一个深层次的目录树中进行搜索。   不过

Web.xml配置详解之context-param

泪湿孤枕 提交于 2020-02-24 11:51:53
<context-param>   <param-name>contextConfigLocation</param-name>   <param-value>contextConfigLocationValue></param-value> </context-param> 作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。 param-name:设定上下文的参数名称。 必须是唯一名称 param-value:设定的参数名称的值 初始化过程: 在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>。 接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。 接着容器会将读取到<context-param>转化为键值对,并交给ServletContext。 容器创建<listener></listener>中的类实例,即创建监听(备注:listener定义的类可以是自定义的类但必须需要继承 ServletContextListener )。 在监听的类中会有一个 contextInitialized (ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext()

docker容器_网络配置

荒凉一梦 提交于 2020-02-24 04:55:15
docker 文章目录 docker 1 Linux内核实现名称空间的创建 1.1 ip netns命令 1.2 创建Network Namespace 1.3 操作Network Namespace 1.4 转移设备 1.5 veth pair 1.6 创建veth pair 1.7 实现Network Namespace间通信 1.8 veth设备重命名 2 四种网络模式配置 2.1 bridge模式配置 2.2 none模式配置 2.3 container模式配置 2.4 host模式配置 3 容器的常用操作 3.1 查看容器的主机名 3.2 在容器启动时注入主机名 3.3 手动指定容器要使用的DNS 3.4 手动往/etc/hosts文件中注入主机名到IP地址的映射 3.5 开放容器端口 3.6 自定义docker0桥的网络属性信息 3.7 docker远程连接 3.8 docker创建自定义桥 1 Linux内核实现名称空间的创建 1.1 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装。 注意:ip netns命令修改网络配置时需要 sudo 权限。 可以通过ip netns命令完成对Network Namespace

.NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)

依然范特西╮ 提交于 2020-02-24 02:53:27
07 | 用Autofac增强容器能力:引入面向切面编程(AOP)的能力 如何获取没有命名的服务呢? // 获取没有命名的服务,把 namd 去掉即可 var servicenamed = this.AutofacContainer.Resolve<IMyService>(); servicenamed.ShowCode(); // Autofac 容器获取实例的方式是一组 Resolve 方法 var service = this.AutofacContainer.ResolveNamed<IMyService>("service2"); service.ShowCode(); 启动程序,输出如下: MyService.ShowCode:61566768 MyServiceV2.ShowCode:44407631,NameService是否为空:True 接下来,讲解属性注入 builder.RegisterType<MyNameService>(); // 只需要在注册方法加上 PropertiesAutowired 即可 builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired(); 从服务里面获取它并且 ShowCode var servicenamed = this

Android布局之Layout

≯℡__Kan透↙ 提交于 2020-02-24 00:30:53
计算机113 袁博 android中的菜单有两种: 1、通过MENU键激活,叫Options Menu;另一种是当用户长按一个元素时激活,叫Context Menu。 2、Android视图有很多控件,我们需要容器来存放这些控件并控制它们的位置排列。Android布局主要有以下几种:Linear Layout(线性布局),Relative Layout(相对布局),Absolute Layout(绝对布局),Table Layout(表格布局).它们都属于ViewGroup类。 实现运行效果: 1. Linear Layout (1) ViewGroup以线性方向显示它的子视图元素,即后一个元素垂直或水平显示在上一个元素之后。显示方式的属性: android:orientation="horizontal"(水平显示,默认方式) android:orientation="vertical" (垂直方式) (2) Fill Mode填充方式,在Linear Layout的控件都必须指定它的填充方式,即设置android:layout_width和android:layout_height,可以为三种值:具体的像素,如20px;控件文本实际长度显示(wrap_content);填充剩下的所有可用空间(fill_parent). (3)Weight权重

Java基础:容器

十年热恋 提交于 2020-02-23 05:52:35
转载请注明出处: jiq•钦's technical Blog 一、Collection:存放独立元素 Collection中的接口都是可选操作,事实上现类 并不一定实现了其全部接口,这是为了防止“接口爆炸”。最常见的 Unsupported Operation 都源自于背后由固定尺寸的数据结构支持的容器,比方使用ArrayList.asList将数组转换成List的时候,就会得到这种容器。 (1) Collection 之 List List较之Collection添加了非常多额外的接口。 特别是LinkedList。 长处 缺点 保存元素的顺序 应用 ArrayList 随机訪问速度快 。内部使用数组实现。 迭代。插入和删除元素慢,尤其是当List]尺寸比較大的时候。 插入顺序 可变长数组 LinkedList 迭代(顺序訪问经过优化),插入。删除都非常快 内部使用 双向链表 实现 随机訪问速度慢 插入顺序 顺序訪问, 批量插入删除元素的场合 (2)Collection 之 Set 存入Set的每个元素都必须是唯一的,由于Set不保存反复元素。可是存入Set的元素必须要定义 equals() 方法以确保对象的惟一性。另外Set与Collection有着全然同样的接口。Set并不保证维护元素的次序。 所以须要注意。Set不包括随机訪问的get方法。由于Set是自己维护内部顺序的

java基础-容器-Set

孤人 提交于 2020-02-23 05:41:16
Set:set不存重复元素,如果是使用set存储java预定义的Integer,String等类型会很简单,如果是存储自定义类型的数据类型,就必须要重新定义equals()方法以确保set中保存的对象得人唯一性,set接口是不保证元素的次序的,所以当你的set使用场景不同时,也要根据实际情况选着不同的set实现; HashSet:为快速查找而设计,存入HashSet的元素必须定义hashCode()(默认选择) TreeSet:存储在TreeSet里面的数据是有序的,底层是树结构,元素必须实现Comparable接口; LinkedHashSet:具有HashSet的查询速度,内部顺序是用链表维护的(插入的次序),元素必须定义hashCode(); 来源: https://www.cnblogs.com/sharing-java/p/10703164.html