Spring4新特性简述

  categories:资料  author:

Spring是一个java世界中极其流行的开源框架。Spring的初衷是降低企业级开发的复杂性,并试图通过POJO对象实现之前EJB这类重型框架才能实现的功能。Spring不仅仅对服务端开发有用,任何Java应用都可受益于Spring的简洁、易测试和低耦合等特性。

Spring框架中使用beansJavaBeans来表示应用程序中的组件,但这并不意味着该组件必须严格满足Java Bean的规范。
Spring做了很多事情,但是归根到底是一些基本的思路,而所有这些思路最终都导向Spring的使命:简化Java开发
Spring通过下列四种策略来简化Java开发:
基于POJO的轻量级、最小侵入式开发;
通过依赖注入和面向接口编程实现松耦合;
通过面向切面编程和惯例实现声明式编程;
通过面向切面编程和模板消除样板式代码
按照功能划分,这些模块可以分成六组,如下图所示:

这些模块几乎可以满足所有企业级应用开发的需求,但是开发人员并不需要完全使用Spring的这些模块,可以自由选择符合项目需求的第三方模块——Spring为一些第三方模块提供了交互接口。
CORE SPRING CONTAINER
Spring框架的核心模块,其他所有模块都基于该模块构建。Spring容器负责管理Spring应用中bean的创建、配置和管理。在这模块中有Spring bean factory,该接口提供了最基本的依赖注入(DI)功能;基于bean factory,该模块提供了集中Spring应用上下文的实现,可以供开发人员选择。
除了bean factory和application context,该模块还支持其他企业级服务,例如email、JNDI access、EJB integration和scheduling。
SPRING’s AOP MODULE
Spring框架通过AOP模块提供面向切面编程的能力。通过AOP模块,一些系统层面的需求(事务、安全)可以与它们真正要作用到的模块相互解耦合。
DATA ACCESS AND INTEGRATION
Spring的JDBC和data-access object阅读全文

Spring Framework 5.0 新特性

  categories:资料  author:

Spring Framework 5.0是在Spring Framework 4.0之后将近四年内一次重大的升级。 在这个时间框架内,主要的发展之一就是Spring Boot项目的演变。

Spring Framework 5.0的最大特点之一是响应式编程(Reactive Programming)。 响应式编程核心功能和对响应式endpoints的支持可通过Spring Framework 5.0中获得。 重要变动如下列表所示:

  • 常规升级
  • 对JDK 9运行时兼容性
  • 在Spring Framework代码中使用JDK 8特性
  • 响应式编程支持
  • 函数式Web框架
  • Jigsaw的Java模块化
  • 对Kotlin支持
  • 舍弃的特性

1. 常规升级

Spring Framework 5.0遵守JDK 8和Java EE 7规范。 基本上,这意味着以前的JDK和Java EE版本不再受支持了。

Spring Framework … 阅读全文

CSS盒模型之文档流与BFC

  categories:资料  author:

文档流:文档中可显示的元素在排列时候的开始位置以及他们所占的区域

原因:页面元素不同,按照各自的特点去显示,在页面中所占的区域是不一样的
顺序:从上到下,从左到右

css浮动float

概念:使元素脱离文档流,按照指定的方向发生移动,遇到父级元素或者相邻的元素就会停下来

特征:1)块元素可以在一行显示

2)按照一个方向移动

3)行内元素支持宽高

4)脱离文档流(元素不在页面中占位置了)

注意:浮动后跟的元素(没有浮动)的位置是从前面浮动的元素位置开始的

非浮动元素里的内容会留出前面浮动元素的位置(盒模型位置)

5)块元素的默认宽度(默认撑满一行)会改变(由内容撑开,也可以设置宽)

代码

1 .container div {
2         width: 100px;
3         height: 100px;
4         background: green;
5         float: left;
6     }
<div class='container'>
        <div></div>
        <span>浮动后跟的元素(没有浮动)的位置是从前面浮动的元素位置开始的
非浮动元素里的内容会留出前面浮动元素的位置(盒模型位置)
浮动后跟的元素(没有浮动)的位置是从前面浮动的元素位置开始的
非浮动元素里的内容会留出前面浮动元素的位置(盒模型位置)浮动后跟的元素(没有浮动)的位置是从前面浮动的元素位置开始的
非浮动元素里的内容会留出前面浮动元素的位置(盒模型位置)浮动后跟的元素(没有浮动)的位置是从前面浮动的元素位置开始的
阅读全文

如何用PS将一张模糊不清晰的照片快速处理变清晰!只需这几步操作!

  categories:资料  author:

施老师:

我们有时从网上下载的图片不清晰,但是又急需要用到这张图片,又找不到源素材,那该怎样把这张图片变清晰呢。下面就由宁双学好网施老师教大家方法。

先看下两张图片的比较

原图

处理之后的图

一、  首先我们用PHOTOSHOP打开这张不清晰的图片

二、然后将这张图所在的图层复制一层

三、然后执行-滤镜-高反差保留,把值变成4.

四、然后在图层面板上,把属性变为叠加

五、再执行图像菜单-调整-亮度/对比度。然后,保存文件就可以完成本例效果的制作了。

六:最后我们就得到了这张清晰的图片了

大家平时碰到不清晰的图片是如何变清晰的呢,欢迎在下方留言给我。与我一起探讨。

喜欢本文就关注宁双学好网施老师,本文欢迎转载,转载请注明出处。

宁双学好网微信订阅号:myplwaai

Photoshop CS5教程在线观看:http://study.163.com/course/courseMain.htm?courseId=1248001&utm_campaign=commission&utm_source=cp-6428185&utm_medium=share

来源:https://www.bilibili.com/read/cv265804/… 阅读全文

下载的图片太模糊?8 个方法把它变清晰

  categories:资料  author:

我们每个人每一天使用互联网,都会和各种格式的图片打交道,其中大部分图片格式在创造之初的目的并不是为了保存完整的图片信息,而是在占用空间尽可能小的同时保存更多的图片信息。

不仅如此,我们看到的图片往往是被「创造」出来后经过互联网上复杂渠道层层转发分享的结果,其中有太多机会被压缩(聊天软件,浏览器省流量访问,各种应用转发等等)。我们看到的「马赛克」也许原本是一张高清艳丽的图片:

绿化效果的确拔群

模拟转发 27 次后的效果,图片来源:Github/LionNatsu/terribleGreen。

看看就过的图片还好,当我们特别喜欢某张图片,想用作壁纸或者 PPT 素材的时候就会发现原本看起来还行的清晰度瞬间变成了「马赛克」。如果真的是特别喜欢这张图片,我们会花费精力去各处寻找原图,不过假设图片在它们被上传时清晰度就不能满足我们的要求,那么即使找到原图也无济于事。除了寻找原图,我们还可以尝试用一些在线服务与网站,将图片放大到甚至比原图还清晰,今天我就带大家来了解几个有名的图片放大网站和软件,比较下它们的优缺点。

开始介绍之前的说明:真正无损放大图片在理论上是不可能的。图片放大不能将原本就没有的,丢失掉的信息(手抖拍糊,故意加上的马赛克,超高噪点)再「创造」出来,图片放大算法做的只是「猜测」那里原本有什么,好的算法猜得更准而已,所以对于原本就有细节,只是被图片算法压缩的图片放大效果更好。

  • 测试照片作者:沃兹基派德
  • 测试插画作者:apapico/

插画,漫画,二次元与非现实图片

Waifu2x:将纸片人「老婆」放大两倍

随着「万能」的人工智能(机器学习)席卷各个领域,图片算法自然也逃不掉。Waifu2x 直译过来就是「将纸片人老婆放大两倍」,那么这个宅味十足的名字是怎么来的呢?

机器学习的一个优点是给予特定输入和输出之后,它能够自己寻找输入和输出之间的联系,之后你再给它相关的输入就能自动生成输出。看到这里你应该想到一个会机器学习的宅能做出什么了吧?没错,他用一大堆低分辨率和高分辨率的 Galgame 图片去训练深度卷积神经网络,让算法学会了把低分辨率 Galgame 变成高分辨率 Galgame。

Waifu2x 就这样出现了。作为一个用 Galgame 训练出来的人工智能算法,它最大特点是能对插画,漫画,二次元和其他非现实图片实现近乎「无损」的完美放大。

我们可以使用 Waifu2x 的演示网站来放大自己的图片,实际效果如图(右键选择「在新标签查看图片」看原图更明显):

插画 100% 放大演示,原图+降噪低中高三档
照片 100% 放大演示,原图+降噪低中高三档

可以看到,在放大两倍的情况下 Waifu2x 很好地保持住插画描边不出现锯齿与发虚,同时颜色甚至比原图还纯净,可以说达到了「超越原图」的清晰度。不过对于现实照片的放大效果就没有那么惊艳了,只能说和其他图片放大算法处于同一水准。

由于只是用于演示,网站只支持最高

阅读全文

LockSupport(park/unpark)源码分析

  categories:资料  author:

转载:http://www.cnblogs.com/zhizhizhiyuan/p/4966827.html

concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类:
  • Unsafe(提供CAS操作)
  • LockSupport(提供park/unpark操作)

因此,LockSupport非常重要。

两个重点

(1)操作对象

归根结底,LockSupport.park()和LockSupport.unpark(Thread thread)调用的是Unsafe中的native代码:

 

//LockSupport中
public static void park() {
        UNSAFE.park(false, 0L);
    }

 

//LockSupport中
public static void unpark(Thread thread)
阅读全文

从ReentrantLock的实现看AQS的原理及应用

  categories:资料  author:

前言

Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync Queue,不讲述包含共享锁和Condition Queue的部分(本篇文章核心为AQS原理剖析,只是简单介绍了ReentrantLock,感兴趣同学可以阅读一下ReentrantLock的源码)。

下面列出本篇文章的大纲和思路,以便于大家更好地理解:

1 ReentrantLock

1.1 ReentrantLock特性概览

ReentrantLock意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁。为了帮助大家更好地理解ReentrantLock的特性,我们先将ReentrantLock跟常用的Synchronized进行比较,其特性如下(蓝色部分为本篇文章主要剖析的点)

下面通过伪代码,进行更加直观的比较:

// **************************Synchronized的使用方式**************************
// 1.用于代码块
synchronized (this) {}
// 2.用于对象
synchronized (object) {}
// 3.用于方法
public synchronized void test () {}
// 4.可重入
for (
阅读全文

不可不说的Java“锁”事

  categories:资料  author:

前言

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。

Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:

11

1. 乐观锁 VS 悲观锁

乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。

先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。

而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。

乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。

12

根据从上面的概念描述我们可以发现:

  • 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。
  • 乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。

光说概念有些抽象,我们来看下乐观锁和悲观锁的调用方式示例:

// ------------------------- 悲观锁的调用方式 -------------------------
// synchronized
public synchronized void testMethod() {
	// 操作同步资源
}
// ReentrantLock
private ReentrantLock lock = new ReentrantLock(); 
阅读全文

Linux top和负载的说明

  categories:资料  author:

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。

top – 01:06:48 up  1:22,  1 user,  load average: 0.06, 0.60,  0.48
Tasks:  29 total,   1 running,  28 sleeping,   0 stopped,   0  zombie
Cpu(s):  0.3% us,  1.0% sy,  0.0% ni, 98.7% id,  0.0% wa,  0.0%  hi,  0.0% si
Mem:   
阅读全文

一张图读懂非公平锁与公平锁

  categories:资料  author:

在Java并发编程中,公平锁与非公平锁是很常见的概念,ReentrantLock、ReadWriteLock默认都是非公平模式,非公平锁的效率为何高于公平锁呢?究竟公平与非公平有何区别呢?

首先先简单从名字上来理解,公平锁就是保障了多线程下各线程获取锁的顺序,先到的线程优先获取锁,而非公平锁则无法提供这个保障。看到网上很多说法说非公平锁获取锁时各线程的的概率是随机的,这也是一种很不确切的说法。非公平锁并非真正随机,其获取锁还是有一定顺序的,但其顺序究竟是怎样呢?先看画了半天的图:
公平锁与非公平锁.jpg

公平锁与非公平锁的一个重要区别就在于上图中的2、6、10那个步骤,对应源码如下:

 

  //非公平锁
 final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
              //区别重点看这里
                if
阅读全文


快乐成长 每天进步一点点      京ICP备18032580号-1