您现在的位置是:首页 > 正文

代码方式配置和xml文件方式混合配置spring

2024-02-01 03:40:38阅读 7

第一步

@Order(1)
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
    private static final PropertiesLoader propertiesLoader = new PropertiesLoader();

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{MvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected Filter[] getServletFilters() {
        return super.getServletFilters();
    }

    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
        Class<?>[] configClasses = getServletConfigClasses();
        if (!ObjectUtils.isEmpty(configClasses)) {
            servletAppContext.register(configClasses);
        }
        //读取spring.properties配置文件,这里主要是设置spring的profile
        Properties prop = propertiesLoader.load("spring.properties");
        servletAppContext.getEnvironment().setActiveProfiles(prop.getProperty("spring.profiles.active"));
        return servletAppContext;
    }
}

其实上一步相当于定义了
* Dispatcher-拦截路径为“/”
* 定义了ApplicationContext
其中 PropertiesLoader 主要在初始化上下文的时候,加载一些配置文件信息

package com.lizo.config.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * Created by hzlizhou on 2016/9/13.
 */
public class PropertiesLoader {
    public Properties load(String fileName) {
        Properties prop = new Properties();
        InputStream im = null;
        try {
            im = findFile(fileName);
            prop.load(im);
        } catch (IOException ignore) {
        } finally {
            if (im != null) {
                try {
                    im.close();
                } catch (IOException ignore) {
                }
            }
        }
        return prop;
    }

    private InputStream findFile(String fileName) throws FileNotFoundException {
        InputStream im = findInWorkingDirectory(fileName);
        if (im == null) im = findInClasspath(fileName);
        if (im == null) im = findInSourceDirectory(fileName);
        if (im == null) throw new FileNotFoundException(String.format("File %s not found", fileName));
        return im;
    }

    private InputStream findInSourceDirectory(String fileName) throws FileNotFoundException {
        return new FileInputStream("src/main/resources/" + fileName);
    }

    private InputStream findInClasspath(String fileName) {
        return Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
    }

    private InputStream findInWorkingDirectory(String fileName) {
        try {
            return new FileInputStream(System.getProperty("user.dir") + fileName);
        } catch (FileNotFoundException e) {
            return null;
        }
    }
}

第二步 Spring MVC 配置

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by hzlizhou on 2016/9/13.
 */
@Configuration
@EnableWebMvc
@ComponentScan("com.lizo")
public class MvcConfig extends WebMvcConfigurerAdapter {

    /*
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }
    */
}

其中 EnableWebMvc 相当于xml配置中

<mvc:annotation-driven/>

也就是自动注册了RequestMappingHandlerMapping, RequestMappingHandlerAdapter 和 ExceptionHandlerExceptionResolver

第三步 配置dataSource

首先使用一个config类,用来加载其他配置文件

@Configuration
@PropertySource({"classpath:spring.properties"})
@Import(DataSourceConfig.class)
@ImportResource("classpath:spring-db.xml")
public class AppConfig {


}
  • @PropertySource——用于加载配置文件
  • @Import——加载使用@Configuration注解的配置类
  • @ImportResource——加载xml形式的配置文件

@Configuration
@PropertySource("classpath:${spring.profiles.active}/jdbc.properties")
public class DataSourceConfig {
    @Value("${jdbcDriver}")
    String jdbcDriver;

    @Value("${jdbcUrl}")
    String jdbcUrl;

    @Value("${jdbcUser}")
    String jdbcUser;

    @Value("${jdbcPassword}")
    String jdbcPassword;

    @Bean(name= "dataSource")
    public DataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(jdbcDriver);
        druidDataSource.setUrl(jdbcUrl);
        druidDataSource.setUsername(jdbcUser);
        druidDataSource.setPassword(jdbcPassword);
        return druidDataSource;
    }
}

需要注意的是,上面加载配置文件的路径使用了变量(profile),这样就可以根据不同环境加载不同的配置文件信息

第四步 使用xml配置mybatis

虽然使用代码的配置方式也能配置,这里只是为了说明(其实就和xml配置文件是一样)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    <!-- 数据源事物管理 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- jdbc 模板 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- mybatis 配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations">
            <array>
                <value>classpath*:/**/*mapper.xml</value>
            </array>
        </property>
    </bean>

    <!-- 扫描mybatis映射接口类 -->
    <bean id="MapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.lizo.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>
</beans>

第五步 单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes  = AppConfig.class)
public class TestMapperTest {

    @Autowired
    TestMapper testMapper;

    @Test
    public void test(){
        Assert.assertNotNull(testMapper.test()); 
    }
}

总结

既然能够兼容两种模式,那么就可以有选择性的选择使用

网站文章

  • ubuntu 安装 repo 记录

    安装步骤:1、根目录下创建bin文件夹mkdir ~/bin2、配置为临时环境变量(也可配置为永久的)PATH=~/bin:$PATH3、下载repogit clonehttps://gerrit-g...

    2024-02-01 03:40:31
  • exe获得命令行参数的办法

    exe获得命令行参数的办法第一种办法——通过__argc宏、__argv[i]第二种办法——MFC中办法 第一种办法——通过__argc宏、__argv[i] for(size_t i=0;i&lt;...

    2024-02-01 03:40:00
  • 工业元宇宙->巨型新市场

    工业元宇宙->巨型新市场

    工业元宇宙->巨型新市场 李正海在清华大学新闻学院新媒体研究中心与南京江宁高新区管委会举办的工业元宇宙与工业互联网在线沙龙上的讲话元宇宙时代,要把人加进来大家好,我今天给大家分享的题目是《工业元宇宙到...

    2024-02-01 03:39:54
  • 微信浏览器移动端禁止图片放大图片效果

    解决第三方网页在微信浏览器中点击图片自动放大,因为微信Android客户端已经在底层支持img标签自动放大功能;传统方式:$(document).on(‘click’, ‘img’, e => {e.preventDefault();})这个方式可能会把所有的默认的属性都屏蔽了,典型的就是a标签不能跳转css方式:img{pointer-events: none;}这个会...

    2024-02-01 03:39:46
  • Spring-Spring Framework系统架构分析

    Spring-Spring Framework系统架构分析

    Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基。Spring的架构版本目前稳定在Spring 4.X;

    2024-02-01 03:39:39
  • 计算机导论新发展方向,基于新工科的计算机导论课程教学改革研究

    计算机导论新发展方向,基于新工科的计算机导论课程教学改革研究

    王金环 焦纯[摘 要]本文针对计算机导论课程教学存在的问题从教学目标设计、教学进程设计、教具的灵活应用和教学验收方法等方面进行了探讨,以期为应用型人才的培养提供重要依据和参考。[关键字]新工科 计算机导论 教学改革 教学方法引 言计算机导论是计算机类的专业基础课程之一,是一门理论与实践相结合的课程。为了培养适应经济迅速发展的新型工科人才,我们应该转变教学观念,改革教学模式,重组知识结构...

    2024-02-01 03:39:08
  • VMware 安装银河麒麟V10系统和安装达梦数据库及基本操作

    VMware 安装银河麒麟V10系统和安装达梦数据库及基本操作

    银河麒麟V10系统和达梦数据库

    2024-02-01 03:39:01
  • 计算机网络信息的获取教学反思,《浏览因特网》教学反思

    《《浏览因特网》教学反思》由会员分享,可在线阅读,更多相关《《浏览因特网》教学反思(3页珍藏版)》请在人人文库网上搜索。1、浏览因特网教学反思一、 为什么选浏览因特网在选题之前,我在网络上搜索了大量的...

    2024-02-01 03:38:54
  • 开源ChatGPT要来了;软件2.0智能革命;GLM、Diffusion模型大加速 热门推荐

    开源ChatGPT要来了;软件2.0智能革命;GLM、Diffusion模型大加速 热门推荐

    1. 2023年AI十大展望:GPT-4领衔大模型变革,谷歌拉响警报,训练数据告急新年伊始,大模型的话题热度不减。ChatGPT展现的惊人能力将大模型研究和应用热度推向高潮,人们激烈讨论着这个高级“物...

    2024-02-01 03:38:26
  • 虚拟机中Linux系统与主机之间通信的三种方式

    Linux系统与主机通信的三种方式介绍 及仅主机模式下的详细操作步骤!

    2024-02-01 03:38:20