前言:

随着spring 越来越强大,用spring4来搭建框架也是很快速,问题是你是对spring了解有多深入。如果你是新手,那么在搭建的过程中可以遇到各种各样奇葩的问题。

SSM框架的搭建是作为我搭建APP开发框架的基础。

我将会分以下几点:

1) 配置文件如何配置

2) 如何java配置启动servlet

3) 一些搭建过程中的坑

=============================================================================

配置文件如何配置

SSM框架的搭建配置方式有很多种,可具体分可以分为javaConfig配置,xml配置,或者xml文件与javaConf混合配置。其实用那种都行了,我个人搭建还是偏xml配置,不过现在的javaConfig也很成熟,也可以考虑,就是有一些坑,后面会讲到的;混合配置,用的情况也是蛮多的,分享中会涉及一点。

接下来,我主要是以java配置类做的配置:

这是项目的结构 com.ouyang.teson目录下直接放置配置类:

1)AppConfig.java

  1. package com.ouyang.teson;
  2.  
  3. import org.mybatis.spring.mapper.MapperScannerConfigurer;
  4. import org.springframework.context.annotation.*;
  5. import org.springframework.transaction.annotation.EnableTransactionManagement;
  6. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  7. import org.springframework.web.servlet.mvc.Controller;
  8.  
  9. /**
  10. * Created by ThinkPad on 2017/6/15.
  11. */
  12.  
  13. @Configuration
  14. @EnableAspectJAutoProxy
  15. @EnableTransactionManagement
  16. @ComponentScan(basePackages = {"com.ouyang.teson"},
  17. excludeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)}
  18. )
  19. @Import(AppDataConfig.class)
  20. //@PropertySource({"classpath:jdbc.properties"})
  21. //@ImportSource("XXXX.xml")
  22. /*@Configuration,用于表示这个类是一个配置类,用于配置Spring的相关信息
  23. @EnableAspectJAutoProxy,启用切面自动代理,用于AOP
  24. @EnableTransactionManagement,启用注解事务,即可以使用@Transactional注解来控制事务
  25. @ComponentScan,组件扫描,在basePackages指定的目录下扫描被@Controller、@Service、@Component等注解注册的组件
  26. @Import,引入指定的配置类,我们引入了Spring容器配置类和数据源事务配置类
  27. @PropertySource,加载指定的配置文件,配置文件内容会加载入Environment中等待调用*/
  28. public class AppConfig {
  29.  
  30. @Bean
  31. public MapperScannerConfigurer mapperScannerConfigurer() {
  32. MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
  33. // 跟@MapperScan(basePackages = { "com.ouyang.teson.dao" }) 等同
  34. //如果通过web.xml 加载servlet的话,可能找不到映射对象 建议用注解
  35. mapperScannerConfigurer.setBasePackage("com.ouyang.teson.dao");
  36. mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
  37. return mapperScannerConfigurer;
  38. }
  39.  
  40. }

2) AppDataConfig.java 是导入的配置

  1. package com.ouyang.teson;
  2.  
  3. import com.alibaba.druid.pool.DruidDataSource;
  4. import com.ouyang.teson.bean.TestBean;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.mybatis.spring.SqlSessionFactoryBean;
  7. import org.mybatis.spring.SqlSessionTemplate;
  8. import org.mybatis.spring.annotation.MapperScan;
  9. import org.mybatis.spring.mapper.MapperScannerConfigurer;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.context.annotation.*;
  12. import org.springframework.core.env.Environment;
  13. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  14. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  15. import org.springframework.transaction.annotation.EnableTransactionManagement;
  16.  
  17. import javax.sql.DataSource;
  18. import java.io.IOException;
  19.  
  20. /**
  21. * Created by ThinkPad on 2017/6/15.
  22. */
  23.  
  24. @EnableAspectJAutoProxy
  25. @EnableTransactionManagement
  26. @PropertySource({"classpath:jdbc.properties"})
  27. //@MapperScan(value={"/com/ouyang/teson/dao/*.xml"},basePackages = {"com.ouyang.teson.dao"})
  28. public class AppDataConfig {
  29.  
  30. @Autowired
  31. private Environment env;
  32.  
  33. //设置阿里druid数据源
  34. @Bean(name="dataSource")
  35. public DataSource getDataSource() {
  36. DruidDataSource druidDataSource = new DruidDataSource();
  37. System.out.println("=============env============"+env.getProperty("jdbc.driverClassName"));
  38. druidDataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
  39. druidDataSource.setUsername(env.getProperty("jdbc.username"));
  40. druidDataSource.setPassword(env.getProperty("jdbc.password"));
  41. druidDataSource.setUrl(env.getProperty("jdbc.url"));
  42. //连接超时时间
  43. druidDataSource.setMaxWait();
  44. //最大存活时间
  45. //druidDataSource.setMaxActive(10000);
  46. // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  47. druidDataSource.setTimeBetweenEvictionRunsMillis();
  48. //连接池中的最小生存时间
  49. druidDataSource.setMinEvictableIdleTimeMillis();
  50. //这里建议配置为TRUE,防止取到的连接不可用
  51. druidDataSource.setTestOnBorrow(true);
  52. druidDataSource.setTestOnReturn(false);
  53. //自动提交
  54. druidDataSource.setDefaultAutoCommit(true);
  55. druidDataSource.setPoolPreparedStatements(true);
  56. druidDataSource.setMaxPoolPreparedStatementPerConnectionSize();
  57. return druidDataSource;
  58. }
  59.  
  60. // 配置SqlSessionFactory对象
  61. public SqlSessionFactoryBean getSqSesionFactorys() throws IOException {
  62. SqlSessionFactoryBean sqlSessionFactoryBean =new SqlSessionFactoryBean();
  63. sqlSessionFactoryBean.setDataSource(getDataSource());
  64. // sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml")); // 这里可以通过mybatis-config.xml 来设置 typeAliasPackage和mapper。
  65. //这个setMapperLocations 必须把mapper文件放resources里面 不然获取文件
  66. //扫描mybatis配置文件的
  67. PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
  68. sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
  69. /* Resource[] mapperLocations = new Resource[] { new ClassPathResource("/com/ouyang/teson/mapper*//**//*.xml") };
  70. sqlSessionFactoryBean.setMapperLocations(mapperLocations);*//*
  71. *//* Resource resource =new ClassPathResource("mybatis.xml");
  72. sqlSessionFactoryBean.setConfigLocation(resource);*/
  73. //设置映射的bean类
  74. sqlSessionFactoryBean.setTypeAliasesPackage("com.ouyang.teson.bean");
  75. return sqlSessionFactoryBean;
  76. }
  77.  
  78. @Bean(name = "sqlSessionFactory")
  79. public SqlSessionFactory sqlSessionFactory() throws Exception {
  80. SqlSessionFactoryBean factoryBean = getSqSesionFactorys();
  81. SqlSessionFactory sqlSessionFactory = factoryBean.getObject();
  82. sqlSessionFactory.getConfiguration().setMapUnderscoreToCamelCase(true);// 开启驼峰映射
  83. sqlSessionFactory.getConfiguration().setCacheEnabled(true);
  84. //sqlSessionFactory.getConfiguration().setLazyLoadingEnabled(true);
  85. sqlSessionFactory.getConfiguration().setAggressiveLazyLoading(false);
  86. return sqlSessionFactory;
  87. }
  88.  
  89. @Bean(name = "transactionManager")
  90. public DataSourceTransactionManager dataSourceTransactionManager() {
  91. DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
  92. dataSourceTransactionManager.setDataSource(this.getDataSource());
  93. return dataSourceTransactionManager;
  94. }
  95.  
  96. @Bean
  97. @Scope("prototype")
  98. public SqlSessionTemplate sqlSessionTemplate() throws Exception {
  99. SqlSessionTemplate template =new SqlSessionTemplate(sqlSessionFactory());
  100. return template;
  101. }
  102.  
  103. }

3)webConfig.java

  1. package com.ouyang.teson;
  2.  
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.ComponentScan;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.context.annotation.FilterType;
  9. import org.springframework.web.servlet.ViewResolver;
  10. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  11. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  12. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  13. import org.springframework.web.servlet.mvc.Controller;
  14. import org.springframework.web.servlet.view.InternalResourceViewResolver;
  15.  
  16. /**
  17. * Created by ThinkPad on 2017/6/15.
  18. */
  19. @Configuration
  20. @EnableWebMvc
  21. @ComponentScan(basePackages = {"com.ouyang.teson"},useDefaultFilters = true)
  22. public class WebConfig extends WebMvcConfigurerAdapter{
  23.  
  24. private final static Logger logger = LoggerFactory.getLogger(WebConfig.class);
  25.  
  26. public ViewResolver viewResolver() {
  27. InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
  28. viewResolver.setPrefix("/WEB-INF/views/jsp/function/");
  29. viewResolver.setSuffix(".jsp");
  30. return viewResolver;
  31. }
  32.  
  33. //静态文件
  34. @Override
  35. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  36. logger.info("addResourceHandlers");
  37. registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/");
  38. }
  39.  
  40. }

SpringMvc也设置了@ComponentScan,也会去扫相应的包,useDefaultFilters = true 会自动过滤 @Component@Repository@Service, or @Controller 一些重复的;

4) resources 配置目录下 主要是两个文件:1,jdbc.properties ;2,logback.xml

以下是logback.xml,还稍微比较乱,拿其他项目的配置,顺便改了一下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <property name="LOG_HOME" value="D:/logs2/" />
  4. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  5. <encoder>
  6. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{}] - %msg%n
  7. </pattern>
  8. </encoder>
  9. </appender>
  10. <appender name="FILE"
  11. class="ch.qos.logback.core.rolling.RollingFileAppender">
  12. <file>${LOG_HOME}/dts_rpc_main.log</file>
  13.  
  14. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  15. <!-- rollover daily -->
  16. <fileNamePattern>${LOG_HOME}/logbak/dts_rpc_main-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
  17. <timeBasedFileNamingAndTriggeringPolicy
  18. class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  19. <!-- or whenever the file size reaches 300MB -->
  20. <maxFileSize>1000MB</maxFileSize>
  21. </timeBasedFileNamingAndTriggeringPolicy>
  22. </rollingPolicy>
  23.  
  24. <!-- 日志输出格式 -->
  25. <encoder>
  26. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{} - %msg%n </pattern>
  27. </encoder>
  28. </appender>
  29.  
  30. <logger name="com.ouyang.teson" level="INFO" additivity="false">
  31. <appender-ref ref="FILE" />
  32. </logger>
  33.  
  34. <logger name="org.springframework" level="WARN" additivity="false">
  35. <appender-ref ref="STDOUT" />
  36. </logger>
  37. <logger name="org.springframework.boot" level="WARN" additivity="false">
  38. <appender-ref ref="STDOUT" />
  39. </logger>
  40. <logger name="org.mybatis" level="WARN" additivity="false">
  41. <appender-ref ref="STDOUT" />
  42. </logger>
  43. <logger name="org.apache" level="WARN" additivity="false">
  44. <appender-ref ref="STDOUT" />
  45. </logger>
  46. <logger name="com.ouyang" level="DEBUG" additivity="false">
  47. <appender-ref ref="STDOUT" />
  48. </logger>
  49. <logger name="com.alibaba" level="DEBUG" additivity="false">
  50. <appender-ref ref="STDOUT" />
  51. </logger>
  52. <root level="DEBUG">
  53. <appender-ref ref="STDOUT" />
  54. </root>
  55. </configuration>

5) pom.xml

导入的包,都是当下最新的包

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.</modelVersion>
  4. <groupId>com.ouyang</groupId>
  5. <artifactId>Teson</artifactId>
  6. <packaging>war</packaging>
  7. <version>1.0-SNAPSHOT</version>
  8. <name>Teson Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10.  
  11. <properties>
  12. <!-- spring版本号 -->
  13. <spring.version>4.3..RELEASE</spring.version>
  14. <!-- log4j日志文件管理包版本 -->
  15. <slf4j.version>1.6.</slf4j.version>
  16. <log4j.version>1.2.</log4j.version>
  17. <!-- mybatis版本号 -->
  18. <mybatis.version>3.4.</mybatis.version>
  19.  
  20. </properties>
  21.  
  22. <dependencies>
  23. <dependency>
  24. <groupId>junit</groupId>
  25. <artifactId>junit</artifactId>
  26. <version>4.12</version>
  27. <scope>test</scope>
  28. </dependency>
  29.  
  30. <!-- spring-core -->
  31. <dependency>
  32. <groupId>org.springframework</groupId>
  33. <artifactId>spring-core</artifactId>
  34. <version>${spring.version}</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework</groupId>
  38. <artifactId>spring-context</artifactId>
  39. <version>${spring.version}</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework</groupId>
  43. <artifactId>spring-test</artifactId>
  44. <version>${spring.version}</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework</groupId>
  48. <artifactId>spring-aop</artifactId>
  49. <version>${spring.version}</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>org.springframework</groupId>
  53. <artifactId>spring-jdbc</artifactId>
  54. <version>${spring.version}</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.springframework</groupId>
  58. <artifactId>spring-webmvc</artifactId>
  59. <version>${spring.version}</version>
  60. </dependency>
  61.  
  62. <!-- AspectJ Runtime -->
  63. <dependency>
  64. <groupId>org.aspectj</groupId>
  65. <artifactId>aspectjrt</artifactId>
  66. <version>1.8.</version>
  67. </dependency>
  68. <!-- AspectJ Weaver -->
  69. <dependency>
  70. <groupId>org.aspectj</groupId>
  71. <artifactId>aspectjweaver</artifactId>
  72. <version>1.8.</version>
  73. </dependency>
  74.  
  75. <!-- log 日志 -->
  76. <dependency>
  77. <groupId>org.slf4j</groupId>
  78. <artifactId>jcl-over-slf4j</artifactId>
  79. <version>1.7.</version>
  80. </dependency>
  81. <dependency>
  82. <groupId>ch.qos.logback</groupId>
  83. <artifactId>logback-classic</artifactId>
  84. <version>1.1.</version>
  85. </dependency>
  86.  
  87. <!-- mybatis -->
  88. <dependency>
  89. <groupId>org.mybatis</groupId>
  90. <artifactId>mybatis</artifactId>
  91. <version>${mybatis.version}</version>
  92. </dependency>
  93. <dependency>
  94. <groupId>org.mybatis</groupId>
  95. <artifactId>mybatis-spring</artifactId>
  96. <version>1.3.</version>
  97. </dependency>
  98.  
  99. <!-- mysql驱动包 -->
  100. <dependency>
  101. <groupId>mysql</groupId>
  102. <artifactId>mysql-connector-java</artifactId>
  103. <version>5.1.</version>
  104. </dependency>
  105.  
  106. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  107. <dependency>
  108. <groupId>com.alibaba</groupId>
  109. <artifactId>druid</artifactId>
  110. <version>1.0.</version>
  111. </dependency>
  112.  
  113. <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
  114. <dependency>
  115. <groupId>com.google.code.gson</groupId>
  116. <artifactId>gson</artifactId>
  117. <version>2.8.</version>
  118. </dependency>
  119. <dependency>
  120. <groupId>junit</groupId>
  121. <artifactId>junit</artifactId>
  122. <version>RELEASE</version>
  123. </dependency>
  124.  
  125. <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  126. <dependency>
  127. <groupId>javax.servlet</groupId>
  128. <artifactId>javax.servlet-api</artifactId>
  129. <version>3.1.</version>
  130. <scope>provided</scope>
  131. </dependency>
  132.  
  133. </dependencies>
  134. <build>
  135. <finalName>Teson</finalName>
  136.  
  137. <!--<build>
  138. <finalName>app</finalName>
  139. </build>-->
  140. <resources>
  141. <resource>
  142. <directory>src/main/java</directory>
  143. <includes>
  144. <include>**/*.xml</include>
  145. </includes>
  146. <filtering>false</filtering>
  147. </resource>
  148. </resources>
  149. <plugins>
  150. <plugin>
  151. <groupId>org.apache.maven.plugins</groupId>
  152. <artifactId>maven-compiler-plugin</artifactId>
  153. <version>3.5.1</version>
  154. <configuration>
  155. <source>1.8</source>
  156. <target>1.8</target>
  157. <encoding>UTF-8</encoding>
  158. </configuration>
  159. </plugin>
  160.  
  161. <!--- 为防止 没有web.xml 情况下打包报错 -->
  162. <plugin>
  163. <groupId>org.apache.maven.plugins</groupId>
  164. <artifactId>maven-war-plugin</artifactId>
  165. <version>2.2</version>
  166. <configuration>
  167. <failOnMissingWebXml>false</failOnMissingWebXml>
  168. </configuration>
  169. </plugin>
  170. </plugins>
  171.  
  172. </build>
  173. </project>

基本的配置就这样,有基础基本都能看得懂

接下来,要说说怎么启动web服务器了

启动web服务

1)方法1

在servlet3.0之后,启动servlet,在spring里是可以直接通过java配置类进行加载servlet的。

springmvc 提供一个类AbstractAnnotationConfigDispatcherServletInitializer,该类创建了DispatcherServletContextLoaderListenergetServletConfigClasses()返回的配置类定义了Spring MVC应用容器中的beans;getRootConfigClasses()返回的配置类定义了Spring应用根容器中的beans。

Spring MVC容器是根容器的子容器,子容器可以看到根容器中定义的beans,反之不行。

注意:通过AbstractAnnotationConfigDispatcherServletInitializer配置DispatcherServlet仅仅是传统的web.xml文件方式的另一个可选项。尽管你也可以使用AbstractAnnotationConfigDispatcherServletInitializer的一个子类引入web.xml文件来配置,但这没有必要。

可以参考文章:https://segmentfault.com/a/1190000004343063?_ea=575820

所以你只要自定一个类继承AbstractAnnotationConfigDispatcherServletInitializer ,你可以删掉web.xml了

webAppInitalzer.java

  1. package com.ouyang.teson;
  2.  
  3. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  4.  
  5. /**
  6. * Created by ThinkPad on 2017/6/15.
  7. */
  8. public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  9.  
  10. @Override
  11. protected Class<?>[] getRootConfigClasses() {
  12. return new Class[] { AppConfig.class };
  13. }
  14.  
  15. @Override
  16. protected Class<?>[] getServletConfigClasses() {
  17. return new Class[] { WebConfig.class };
  18. }
  19.  
  20. /**
  21. * identifies one or more paths that DispatcherServlet will be mapped to.<br>
  22. * In this case, it’s mapped to /, indicating that it will be the application’s default servlet.<br>
  23. * It will handle all requests coming into the application.
  24. */
  25. @Override
  26. protected String[] getServletMappings() {
  27. return new String[] { "/" };
  28. }
  29.  
  30. }

2) 方法2

你还是可以依然使用web.xml 来加载servlet,以下是web.xml的配置

  1. <!DOCTYPE web-app PUBLIC
  2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  3. "http://java.sun.com/dtd/web-app_2_3.dtd" >
  4.  
  5. <web-app>
  6. <context-param>
  7. <param-name>contextClass</param-name>
  8. <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
  9. </context-param>
  10. <context-param>
  11. <param-name>contextClassLocation</param-name>
  12. <param-value>com.ouyang.teson.AppConfig</param-value>
  13. </context-param>
  14.  
  15. <listener>
  16. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  17. </listener>
  18. <servlet>
  19. <servlet-name>springServlet</servlet-name>
  20. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  21. <init-param>
  22. <param-name>contextClass</param-name>
  23. <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
  24. </init-param>
  25. <init-param>
  26. <param-name>contextConfigLocations</param-name>
  27. <param-value>com.ouyang.teson.WebConfig</param-value>
  28. </init-param>
  29.  
  30. <load-on-startup></load-on-startup>
  31. </servlet>
  32.  
  33. <servlet-mapping>
  34. <servlet-name>springServlet</servlet-name>
  35. <url-pattern>/</url-pattern>
  36. </servlet-mapping>
  37.  
  38. <display-name>Archetype Created Web Application</display-name>
  39. </web-app>

一些坑的总结

1)@PropertiesSource 该注解主要是导入配置属性的,可是如果该配置类里面,如果有@bean的方法加载失败,则会直接报@PropertiesSource的属性找不到,而是定位到具体的@bean配置出现问题。

查看源码,确实很难debug代码到具体的问题,层次太深了。

2)同一个配置类,@bean的方法,在处理@bean时,是把配置加载到List集合,然后统一实例化,如果有@bean的方法是通过ContentServlet去获取bean的可能获取不到而直接报错。

ConfigurationClassParser.java 是直接加载配置类注解的主要逻辑处理,处理流程是先加载配置文件@PropertiesSource,然后处理 ComponentScans注解,加载文件,接着是处理@Import 和@importSource注解,调用processImports(configClass, sourceClass, getImports(sourceClass), true)进行处理,处理导入的配置类如果没有异常,就会把bean加载到serveltcontenx里,在主配置类就可以注入使用,如果注入不了,说明导入的配置类有问题,接着处理配置中@Bean的方法,接着processInterfaces(configClass, sourceClass)处理继承接口的默认方法。其实这个过程中,是有重复加载的,@bean的方法实例化的对象也是有重复的过程,具体怎么实现没有跟踪下去。 有时间可以自己去跟踪一下代码。

3) 还有一个坑,就是mybatis的配置,PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml")); 这里配置到com.ouyang.teson.mapper 不起作用,原因是maven打包的时候不会把classpath下的xml打包进去,不过在resources下的配置文件是可以被打包进去的,所有必须把xml文件放到resources下面,才能在命名空间,映射到具体的sql。

建议:

1,配置的时候建议一步步来,不要一下配置得太多,而且一边配置,一边测试,那是最好的,避免配置太多无法一下子定位问题。

spring4+srpingmvc+mybatis基本框架(app后台框架搭建一)的更多相关文章

  1. 整合springboot(app后台框架搭建四)

    springboot可以说是为了适用SOA服务出现,一方面,极大的简便了配置,加速了开发速度:第二方面,也是一个嵌入式的web服务,通过jar包运行就是一个web服务: 还有提供了很多metric,i ...

  2. springmvc跨域+token验证(app后台框架搭建二)

    这是app后台框架搭建的第二课,主要针对app应用是跨域的运用,讲解怎么配置跨域服务:其次讲解怎么进行token验证,通过拦截器设置token验证和把token设置到http报文中.主要有如下:   ...

  3. 关于vue 框架与后台框架的混合使用的尝试

    这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 ph ...

  4. 关于vue 框架与后台框架的混合使用的尝试------转载

    这几天我在研究前台框架和后台框架融合的问题,进行了一些尝试; 我前台选择的是 vue,当然也可以选择 react 等其他 mvvm 框架,不过 vue 对于我来说是最熟悉的; 后台话,我选择的是 ph ...

  5. 自定义统一api返回json格式(app后台框架搭建三)

    在统一json自定义格式的方式有多种:1,直接重写@reposeBody的实现,2,自定义一个注解,自己去解析对象成为json字符串进行返回 第一种方式,我就不推荐,想弄得的话,可以自己去研究一下源码 ...

  6. spring4+springmvc+mybatis基本框架(app后台框架搭建一)

    前言: 随着spring 越来越强大,用spring4来搭建框架也是很快速,问题是你是对spring了解有多深入.如果你是新手,那么在搭建的过程中可以遇到各种各样奇葩的问题. SSM框架的搭建是作为我 ...

  7. APP后台API文档管理对接(APP后台框架五)

    这一章还是总结点API管理工具,也大都是组件来的,关于spring-rest-doc 以为很不错,其实还是有点局限性的: 1,每一个接口文档,都要自己手动设置文档的展示: 2,每一个接口就独立一个文档 ...

  8. springmvc SSM shiro redis 后台框架 多数据源 代码生成器

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

  9. springmvc SSM 多数据源 shiro redis 后台框架 整合

    A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址    ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...

随机推荐

  1. java web mysql 入门知识讲解

     MySQL学习笔记总结 一.SQL概述: SQL:Structured Query Language的缩写(结构化查询语言) SQL工业标准:由ANSI(ISO核心成员) 按照工业标准编写的SQ ...

  2. 算法-找出与目标数字相同的digit组成的整数中比该数字大的数集中的最小数字

    题目: 给出1个正整数,找到用与这个数字相同的digit组成的整数中比这个数字大的数集中的最小数字.比如:12352874 的结果是 12354278 分析: 这道题目的考虑目标是数组的查找与排序. ...

  3. DevOps之网络

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <网络(Network)> 关于网络的网络架构和网络模型:知识与技能的层次(知道. ...

  4. C++类中静态变量和静态方法使用介绍

    静态成员的提出是为了解决数据共享的问题.实现共享有许多方法,如:设置全局性的变量或对象是一种方法.但是,全局变量或对象是有局限性的.这一章里,我们主要讲述类的静态成员来实现数据的共享. 静态数据成员 ...

  5. uva1629,Cake Slicing,记忆化搜索

    同上个题一样,代码相似度极高,或者说可以直接用一个模板吧 dp[i,j,p,q]表示一块长为j-i+1,宽为q-p+1,左上角在位置(i,j)上的蛋糕,dp[]表示当前状态下的最优值,然后对该块蛋糕枚 ...

  6. php环境搭建工具推荐

    楼楼最近由于一系列原因,使用了几款php环境搭建工具,安装配置方便,所以在这里推荐一下.第一款是XAMPP(网址http://www.xampps.com/),软件包原来的名字是 LAMPP,但是为了 ...

  7. LINUX 笔记-条件测试

    格式:test condition 文件测试状态 -d 目录 -s 文件长度大于0,非空 -f 正规文件 -w 可写 -l 符号链接 -u 文件有suid位设置 -r 可读 -x 可执行 字符串测试 ...

  8. Java的继承、封装与多态

    Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...

  9. linux命令行下svn常用命令

    linux命令行下svn常用命令 1. 将文件checkout到本地目录 1 #path是服务器上的目录 2 svn checkout path 3 4 #示例 5 svn checkout svn: ...

  10. 2017年最受欢迎的UI框架

    前端领域最近几年发展的特别迅速,可以说是百家争鸣.在底层的前端框架领域中,最早是jquery称霸互联网,近两年MVVM类型的框架慢慢成为主流,Vue.React和Angular三大框架并驾齐驱.可以说 ...