上篇我们将所有的mvc配置文件都复制到项目中了,在springboot中项目配置不使用bean注解的方式去配置了而是使用bean类去配置,或者yml的方式(springboot的配置文件)。如果在yum中有提示的我们都可以使用yul的配置方式。
1、springboot当中会按照你引入的jar判断你是否使用这个jar然后加载启动器中的内置bean类配置的方式帮你加载这些配置。例如datasource,如果引入了druid-spring-boot-starter这个包,springboot会自动配置datasource的配置类替代我们之前手动配置xml中的bean标签的配置。由于我们需要自己指定url、username、password等。我们可以在yum中配置手动指定配置前缀@ConfigurationProperties注解。
@Bean
@ConfigurationProperties("spring.datasource.druid")
public DataSource initDataSource(){
return new DruidDataSource();
}
然后在yum中配置
spring:
datasource:
druid:
url: jdbc:mysql://10.0.0.0:3306/xxx?useUnicode=true&characterEncoding=utf- 8&zeroDateTimeBehavior=convertToNull
username: root
password: 123456
initial-size: 5
max-active: 60
max-wait: 60000
min-idle: 5
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
filters: mergeStat,wall
2、还有一些jar是没有启动器的我们需要自己手动配置。使用bean类的方式配置。例如shiro,我们如果直接引用shiro的jar包而不是带有starter的我们需要手动对其配置。
新建一个java类,使用注解@Configuration注解生命是配置类,springboot在加载的时候会扫描到该注解然后加载到springboot的容器中。mvc中的xml的bean配置替换成创建方法,方法上加@Bean注解标识是一个bean配置,方法返回值为bean对象。例如:
@Configuration
public class ShiroConfig{
@Bean(name = "initMyRealm")
public CustomRealm initMyRealm() {
CustomRealm realm = new CustomRealm();
return realm;
}
@Bean(name = "cacheManager")
public EhCacheManager cacheManager() {
EhCacheManager manager = new EhCacheManager();
manager.setCacheManagerConfigFile("classpath:shiro-ehcache.xml");
return manager;
}
@Bean
@DependsOn({"initMyRealm", "cacheManager"})
public DefaultWebSecurityManager defaultWebSecurityManager(CustomRealm realm, EhCacheManager cacheManager) {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(realm);
manager.setCacheManager(cacheManager);
return manager;
}
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
//定义shiroFactoryBean
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置securityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
//设置默认登录的url
shiroFilterFactoryBean.setLoginUrl("/sys_login.do");
//设置未授权界面
shiroFilterFactoryBean.setUnauthorizedUrl("/tpmp/error.do");
Map<String, String> filterDeMap = new LinkedHashMap<>();
filterDeMap.put("/static/**", "anon");
filterDeMap.put("/fonts/**", "anon");
filterDeMap.put("/login/login.do", "anon");
filterDeMap.put("/logout.do", "logout");
filterDeMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterDeMap);
return shiroFilterFactoryBean;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor
= new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
@Bean
@ConditionalOnMissingBean
@DependsOn("lifecycleBeanPostProcessor")
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
defaultAAP.setProxyTargetClass(true);
return defaultAAP;
}
@Bean(name = "lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
}
简单来说之前xml中bean的class=“”就是现在的方法返回值。
如果有先后顺序的可以用@DependsOn来控制里面是bean的name
注意:springboot中包扫描如果不指定的话是默认和Application.java同级开始向下扫描,可以把Application.java放在外层的保重,保证所有注解可以被扫描到。
基本上大部分的配置文件都可以转换完成,但是监听器、过滤器、拦截器、控制器等配置需要特殊处理。
3、配置监听器、过滤器、拦截器、控制器等
定义一个配置类使用@Configration注解,实现WebMvcConfigurer接口。
1)拦截器重写addInterceptors方法,myInterceptor为你的拦截器可以用@Resource注入到类中。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/portal/**");
}
2)监听器定义ServletListenerRegistrationBean,myListener为你的监听器可以用@Resource注入到类中。
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean () {
ServletListenerRegistrationBean sb= new ServletListenerRegistrationBean();
sb.setListener(myListener);
return sb;
}
3)过滤器定义FilterRegistrationBean,myFilter为你的过滤器可以用@Resource注入到类中。
@Resource
private MyFilter myFilter;
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public FilterRegistrationBean filterRegistrationBean () {
FilterRegistrationBean fb= new FilterRegistrationBean();
fb.setFilter(myFilter);
fb.addUrlPatterns("/*");
return fb;
}
4)控制器比如说对@ResponseBody的返回值进行json格式化和时间类型转换yyyy-MM-dd标准格式等,重写extendMessageConverters方法。
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.clear();//先清空附加控制器
converters.add(mappingJackson2HttpMessageConverter());
}
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);//排除空值在json串中
converter.setObjectMapper(mapper);
ObjectMapper objectMapper = converter.getObjectMapper();
// 时间格式化
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// 设置格式化内容
converter.setObjectMapper(objectMapper);
return converter;
}
4、开启事务
这个直接在application.java中加上@EnableAspectJAutoProxy(proxyTargetClass=true, exposeProxy=true) @EnableTransactionManagement注解即可开启事务。在service层方法中直接使用@Transactional注解。
5、开始spring自带Schedule定时任务。直接在启动类上增加@EnableScheduling注解即可。
6、配置mapper文件和包扫描。在mvc当中配置mapperLocations、typeAliasesPackage、basePackage这三种。将mapper配置文件全都放到springboot-resources下,在yum中配置
mybatis-plus:
mapper-locations: classpath*:mapper/**/*.xml
type-aliases-package: com.boot.**
在启动类上加@MapperScan("com.boot.*.dao.**")
7、配置log4j,引入log4j的依赖在spring-boot-starter-web排除logging。在resources中增加log4j.properties配置文件。在yum中配置一些日志级别即可。
logging:
level:
com.xxx: debug
org.springframework: debug
org.springframework.boot.autoconfigure: ERROR
8、由于springboot项目一般都打成jar包使用内置的tomcat,所以端口号和项目url需要在yum配置文件中指定配置如下
server:
tomcat:
uri-encoding: UTF-8
max-threads: 1000
min-spare-threads: 30
port: 8080
servlet:
context-path: /xxx
以上基本把配置文件部分配置完成了。下篇说下启动的部分。