Spring查缺补漏
学校在学Spring啥的,记录一些以前没有注意到的点,一旦发现就记过来。
使用注解注册Converter
今天讲到Converter
,老师完全使用xml配置,但我懒得写xml,所以我需要一个用注解注册的办法。
然后找到了这篇文章:Guide to Spring Type Conversions
使用xml是这样写的:
<!-- 创建一个ConversionService Bean,然后向其中添加converters -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="converter.GoodsConverter"/>
</list>
</property>
</bean>
<!-- 添加conversion-service -->
<mvc:annotation-driven conversion-service="conversionService"/>
使用注解的话,你需要在你的某个实现自WebMvcConfigurer
的类中重写默认方法addFormatters
,然后通过参数FormatterRegistry
来注册转换器:
@Configuration
@EnableWebMvc
@ComponentScan({"top.yudoge.springmvc.controller"})
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new DateConverter());
}
}
在Spring中Formatter
和Converter
没有什么继承关系,不知道为什么他们选择让开发者在addFormatters
方法中注册Converter
,这不是很让人迷惑吗??
使用注解配置静态资源
下面是使用xml配置的方式
注解,需要在实现自WebMvcConfigurer
的配置类中重写如下方法:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
}
也可以使用如下办法将静态资源的处理交给servlet(不被DispatcherServlet拦截):
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
注解配置拦截器
基于xml的配置
基于注解的配置
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor());
}
2.4以上的多环境配置
Spring具有多环境配置功能
我们的应用在生命周期的各个阶段,如开发、测试、生产时可能都运行在不同的环境下,它们所使用的数据库配置或者其它的什么东西可能不同。这种差异会通过profile来反应,比如我们可能在叫dev
的profile中定义开发时程序具有的特定配置,在叫prod
的profile下定义生产环境下程序具有的特定配置,下面定义了三个文件,它们其中定义了三种不同的profile
下面是application-dev.yml
中的内容,它定义了三种数据库的地址,它其中的属性config.active.on-profile
指明了当前编写的配置所描述的profile是dev
所以
profile
并不和某个yml文件绑定,不是说这个文件叫application-dev.xml
,它就是在描述dev
这个profile。实际上你可以在一个yml文件中通过分段定义很多个不同的profile
下面是application-prod.yml
中的内容,它定义了这三种数据库在生产环境下的不同的地址:
下面是application.yml
,它定义了一些与特定环境无关的(在任何环境下都相同的)配置,并且指定了默认情况下激活的profile为dev
:
如果你不加任何参数,直接运行程序,现在dev
profile会被激活,application-dev.yml
中定义的生产环境下的数据库起作用。你可以通过命令行参数来改变这个行为:
在命令行参数后面添加:--spring.profiles.active=prod
,将激活prod
profile。