注解
1、是一种特殊的接口——使用 @interface 声明
2、注解默认不会被继承——除了被 @Inherited 修饰的注解
一般注解不能被继承;但若该注解被 @Inherited 修饰,那么对于被该注解修饰的class类,可以被继承到该类的子类中,且只有注解目标为class 时有作用, 其他java类型都不起作用(interface, field, method, constructors)。
例如 @Transactional 注解:
1、当修饰的是父类方法或任何非class的java类型时,子类的重写方法或实现方法不会具有@Transactional 的特性——调用该子类方法时,不会开启事务,即使调用了父类被注解修饰的方法也不会(因为,事务控制通过动态代理实现,调用父类方法属于实例的内部调用,不会产生动态代理)
class Father{
@Transactional//用于修饰 method
void select(){
//todo
}
}
class Son extends Father{
public static void main(String[] args) {
Son son = new Son();
son.select();//不会开启事务
Father farher = new Father();
father.select();//会开启事务
}
}
2、当修饰的是实现 类 class时,那么该实现类的所有子类都会继承@Transactional的特性,会为该子类实例所有 public 方法的调用开启事务(除了 toString\equals\hashCode)。
@Transactional annotation on a class specifies the default transaction semantics for the execution of any public operation in the class.
@Transactional//用于修饰 class
class Father{
void select(){
//todo
}
}
class Son extends Father{
public static void main(String[] args) {
Son son = new Son();
son.select();//会开启事务。若没有在内部特定开启动态代理进行事务控制,那么只会开启一个事务
Father farher = new Father();
father.select();//会开启事务
}
}
http请求的content-type设置
详见 org.springframework.boot.web.server.MimeMappings
,里面保存了文件后缀名与对应content-type的关系
另有详细的content-type列表文档详见https://www.iana.org/assignments/media-types/media-types.xhtml#application