Spring mvc配置消息转换器
配置消息转换器
配置FastJson转换器
-
选择一个配置文件类实现WebMvcConfigurer
-
重写configureMessageConverters方法注册添加消息转换器,需要配置UTF-8格式。
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); // FastJsonConfig fastJsonConfig = new FastJsonConfig(); List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); converter.setSupportedMediaTypes(fastMediaTypes); converters.add(converter); } @Autowired public SpringMvcConfig(UserController u){ }
钩子方法
父类定义一个模版方法,即方法中没有内容,但是有参数,子类重写方法,此时使用多态赋值父类,父类调用钩子方法,通过方法参数就能钓到子类运行后的值,本质就是地址里的值改变了,地址其实没有变,钩子里有个小参数诱饵但是经过执行后,钓到了大的鱼,即将其附上了其他值。对于spirng中就是容器实例化的自动注入,实现多态,然后钩子调用。
- 父类,但是方法上加了@Bean 此时如果IOC容器中有子类实例,则会多态自动注入到this中, 通过System.out.println(this);以及通过一个Controller类自动注入实现类,然后输出地址,你会发现其实是一个地址,也就是此时this其实就是其容器里注册后子类实例,然后spirng启动后会扫描执行该方法,此时容器是没有该类实例,只有实现类实例。
public class Student {
private String name;
private int age;
@Bean
public void beanTest(){
List<Integer>ss =new ArrayList<>() ;
this.hook(ss);
//ss相对于鱼饵
System.out.println(this);
//此时ss变成了大鱼,因为里面有东西了。
System.out.println("勾中了"+ss.toString());
}
//钩子方法
public void hook(List<Integer> s){
System.out.println(name);
}
//有参构造
public Student(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
-
子类,类上加了Componet注解,告诉容器要创建实例,然后重写了钩子方法,同时s加上了1。
@Component public class MyTest extends Student { private String name; private int age; public MyTest() { super("123",10); this.name ="ssss"; this.age =30; } @Override public void hook(List<Integer> s) { s.add(1); System.out.println("重写了"); } }
-
输出结果
而此时的自动注入的输出为:(具体代码不放了,应该都会)
可以发现实现了钩子功能,钓上了1。这就是钩子方法,其实原理就是多态然后方法内值改了,不过记住前提地址不能变,否则达不到效果,因为spring的注解+IOC容器原理,所以我们会理解不了。
@EnableWebMvc注解
注解
注解
注解为特殊标记,用于告诉程序如何执行
自定义注解
public @interface a{
public String name() default 默认值;//将方法作为属性。
String value();//特殊属性,即默认属性,即如果就只有一个value属性,则使用注解时无需指定value,默认赋值给value,注:此时的只有一个value属性,不仅代表注解只有一个value,如果注解有多个属性,但是多个属性都有默认值的话,则value属性也是可以不用写(value有默认值也是可以)。
}
元注解
注解注解的注解😏,第一个注解为动词,后面两个为名词。
- @Retention() 声明注解作用时机,即保留周期
- RetentionPolicy枚举类
- SOURCE 只作用源码阶段,字节码文件中不存在。
- CLASS(默认值)存在于源码与class文件中,但是运行时消失。
- RUNTIME 一直到运行时都存在。
- RetentionPolicy枚举类
- @Target() 声明注解作用位置
- ElementType 枚举类
- TYPE 类,接口
- FIELD, 成员变量
- METHOD, 成员方法
- PARAMETER, 方法参数
- CONSTRUCTOR, 构造器
- LOCAL_VARIABLE ,局部变量
- ElementType 枚举类