SSH免密登录--正常流程和异常处理
用了那么久现在才来回顾系列一:maven重学习
Find算法--java代码实现
Springboot周边游1-yaml
Springboot周边游2-SpEL
写在SpEL之前
EL表达式是JSP中一个十分重要的概念。它允许我们从model中读取数据以及条件性的渲染JSP页面。Spring在3.0的版本中也引入了Spring Expression Language从而使得spring具有更好的可扩展性和跨平台性。
虽然SpEL引擎作为Spring 组合里的表达式解析的基础 ,但它不直接依赖于Spring,可独立使用。这也是SpEL的最大优点。
这一章内容将包括SpEL的使用,并且会举一个例子从配置文件中读取相应的属性。因为最终的项目是为了实现thymeleaf+springboot+mysql, 而很多地方都无形中使用了SpEL,比如Thymeleaf获取model数据,比如项目从config文件中获取常量配置。让我们赶紧来感受一下这个功能的强大吧。
spring-boot周边游3-Thymeleaf 一个简单的demo以及初识Standard Dialect
Thymeleaf简介
配置Thymeleaf
这个教程是基于maven环境进行配置的。
1.在resources文件夹之下新加两个文件夹,分别为templates和static,其中templates用于存放界面HTML文件,而static则用于存储静态文件比如js,css或img。目录格式如下:
1 | -project |
2.pom.xml文件中添加依赖:
1 | <dependency> |
猫头鹰的深夜翻译:软件设计原则--更健壮的代码
猫头鹰的深夜翻译:核心JAVA并发一
猫头鹰的深夜翻译:核心JAVA并发二
前言
上一篇文章请参考猫头鹰的深夜翻译:核心JAVA并发(一)
安全发布
发布一个对象是指该对象的引用对当前的域之外也可见(比如,从getter方法中获取一个引用)。要确保一个对象被安全的发布(即在初始化完成之后发布),可能需要使用同步。可以通过以下方法实现安全的发布:
静态初始化方法。只有一个线程能够初始化静态变量因为该类的初始化是在一个排它锁之下完成的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class StaticInitializer {
// Publishing an immutable object without additional initialization
public static final Year year = Year.of(2017);
public static final Set<String> keywords;
// Using static initializer to construct a complex object
static {
// Creating mutable set
Set<String> keywordsSet = new HashSet<>();
// Initializing state
keywordsSet.add("java");
keywordsSet.add("concurrency");
// Making set unmodifiable
keywords = Collections.unmodifiableSet(keywordsSet);
}
}volatile关键字。读者线程总是能获取最近的值,因为写线程总是在后续的读取之前进行
1
2
3
4
5
6
7
8
9class Volatile {
private volatile String state;
void setState(String state) {
this.state = state;
}
String getState() {
return state;
}
}Atomics。比如,AtomicInteger将一个值存储为volatile类型,所以这里和volatile变量的规则相同
1
2
3
4
5
6
7
8
9class Atomics {
private final AtomicInteger state = new AtomicInteger();
void initializeState(int state) {
this.state.compareAndSet(0, state);
}
int getState() {
return state.get();
}
}Final类型
1
2
3
4
5
6
7
8
9class Final {
private final String state;
Final(String state) {
this.state = state;
}
String getState() {
return state;
}
}