springmvc转springboot之项目配置

上篇我们将所有的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

以上基本把配置文件部分配置完成了。下篇说下启动的部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值