第三讲
-
try-with-resources
jdk7之后异常处理的一个新方法,在try()中声明的资源,不用再finally中手动释放,而是系统自动会调用close()方法
-
copy-on-write
读写分离,读的时候不上锁,add元素的时候先拷贝一份,添加完成后再修改之前的final变量应用
第十三讲
public class VIPCenter {
private Map<User.TYPE, ServiceProvider> providers;
void serviceVIP(T extend User user) {
providers.get(user.getType()).service(user);
}
}
interface ServiceProvider{
void service(T extend User user) ;
}
class SlumDogVIPServiceProvider {
void service(T extend User user){
// do somthing
}
}
class RealVIPServiceProvider{
void service(T extend User user) {
// do something
}
}
上面的示例,将不同对象分类的服务方法进行抽象,把业务逻辑的紧耦合关系拆开,实现代码的
隔离保证了方便的扩展。
第二十三讲
Java 8 以前各种类加载器的结构
启动类加载器(Bootstrap Class-Loader),加载 jre/lib 下面的 jar 文件,如 rt.jar。它是
个超级公民,即使是在开启了 Security Manager 的时候,JDK 仍赋予了它加载的程序
AllPermission。
# 指定新的 bootclasspath,替换 java.* 包的内部实现
java -Xbootclasspath:<your_boot_classpath> your_App
# a 意味着 append,将指定目录添加到 bootclasspath 后面
java -Xbootclasspath/a:<your_dir> your_Ap
p# p 意味着 prepend,将指定目录添加到 bootclasspath 前面
java -Xbootclasspath/p:<your_dir> your_A
使用最常见的 “/p”,既然是前置,就有机会替换个别基础类的实现
扩展类加载器(Extension or Ext Class-Loader),负责加载我们放到 jre/lib/ext/ 目录下
面的 jar 包,这就是所谓的 extension 机制。该目录也可以通过设置 “java.ext.dirs”来覆
盖。
java -Djava.ext.dirs=your_ext_dir HelloWord
应用类加载器(Application or App Class-Loader),就是加载我们最熟悉的 classpath 的
内容。这里有一个容易混淆的概念,系统(System)类加载器,通常来说,其默认就是 JDK
内建的应用类加载器,但是它同样是可能修改的,比如:
java -Djava.system.class.loader=com.yourcorp.YourClassLoader HelloWorld
**在 JDK 9 中,由于 Jigsaw 项目引入了 Java 平台模块化系统(JPMS),Java SE 的源代码被划
分为一系列模块**
前面提到的 -Xbootclasspath 参数不可用了。API 已经被划分到具体的模块,所以上文中,
利用“-Xbootclasspath/p”替换某个 Java 核心类型代码,实际上变成了对相应的模块进行
的修补,可以采用下面的解决方案:
首先,确认要修改的类文件已经编译好,并按照对应模块(假设是 java.base)结构存放, 然
后,给模块打补丁:
java --patch-module java.base=your_patch yourApp
扩展类加载器被重命名为平台类加载器(Platform Class-Loader),而且 extension 机制则
被移除。也就意味着,如果我们指定 java.ext.dirs 环境变量,或者 lib/ext 目录存在,JVM
将直接返回错误!建议解决办法就是将其放入 classpath 里。
部分不需要 AllPermission 的 Java 基础模块,被降级到平台类加载器中,相应的权限也被更
精细粒度地限制起来。
rt.jar 和 tools.jar 同样是被移除了!JDK 的核心类库以及相关资源,被存储在 jimage 文件
中,并通过新的 JRT 文件系统访问,而不是原有的 JAR 文件系统。虽然看起来很惊人,但幸
好对于大部分软件的兼容性影响,其实是有限的,更直接地影响是 IDE 等软件,通常只要升
级到新版本就可以了。
1.@TableField(exist=false)
entity中属性加上这个注解可以使entity返回不属于表中的字段,sql查询的时候直接写那个字段就可自动注入
2.配置扫描包
<context:component-scan base-package="controller" />
<context:component-scan base-package="serviceimpl"/>
<context:component-scan base-package="model"/>
3.同一接口不同实现类
@Autowired
@Qualifier("myService1") //名称是service注解上写的名称
4.数据库datetime类型,在mybatis的xml中不能用
<if test="( null !=addTime and addTime != '' )">
之类进行判断,不然会报错
Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String