使用maven来构建项目
pom.xml pom依赖如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 <dependencies> <!-- SpringMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.11.RELEASE</version> </dependency> <!-- Spring JDBC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.11.RELEASE</version> </dependency> <!-- Spring AOP --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.0.11.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.0.11.RELEASE</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- MyBatis整合Spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <!-- C3P0 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- JSTL --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- ServletAPI --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.6</version> <scope>provided</scope> </dependency> </dependencies>
接下来是spring容器的初始化,加载springmvc来初始化webApplicationContext,传统方式都是在web.xml中配置初始化dispatcherServerlet
1 2 3 4 5 6 7 8 9 <!-- SpringMVC的前端控制器,拦截所有请求 --> <!--<servlet>--> <!--<servlet-name>mvc-dispatcher</servlet-name>--> <!--<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>--> <!--<init-param>--> <!--<param-name>contextConfigLocation</param-name>--> <!--<param-value>classpath:springmvc.xml</param-value>--> <!--</init-param>--> <!--</servlet>-->
现在通过实现WebApplicationInitializer接口来完成
1 2 3 4 在Spring-web项目中有类SpringServletContainerInitializer,它实现了Servlet3.0的ServletContainerInitializer接口,且优先级会高于xml中配置的listener。在SpringServletContainerInitializer中有注解@HandlesTypes(WebApplicationInitializer.class),具体如下: 因为这个类声明了HandlesTypes,并指定了类型为WebApplicationInitializer.class,在Servlet3.0+中web容器启动时,会扫描类路径下所有的WebApplicationInitializer接口实现类,并提供一个set集合给onStartup方法执行。 onStartup方法执行时,会遍历该set,并使用newInstance()方式进行实例化,实例化后依据@Order注解进行排序,最后在依次调用onStartup(ServletContext)方法,完成初始化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { // Load Spring web application configuration AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext(); ac.register(AppConfig.class); ac.refresh(); // Create and register the DispatcherServlet DispatcherServlet servlet = new DispatcherServlet(ac); // servlet.setContextConfigLocation(); ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet); registration.setLoadOnStartup(1); System.out.println("init end"); registration.addMapping("/*"); } }
治理就直接同过AnnotationConfigWebApplicationContext()来完成容器的初始化,通过AppConfig这个类完成配置
AppConfig.java
1 2 3 4 5 6 @Configuration @PropertySource("classpath:application.properties") @ComponentScan("cn.lzl") @EnableAspectJAutoProxy @Import(LoggerAspect.class) public class AppConfig {
springmvc的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 @Configuration public class MvcConfig { @Bean public InternalResourceViewResolver internalResourceViewResolver(){ InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver(); internalResourceViewResolver.setPrefix("/"); internalResourceViewResolver.setSuffix("jsp"); System.out.println("end"); return internalResourceViewResolver; } // @Bean // public CommonsMultipartResolver multipartResolver(){ // CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); // commonsMultipartResolver.setDefaultEncoding("utf-8"); // commonsMultipartResolver.setMaxUploadSizePerFile(1231214); // commonsMultipartResolver.setMaxUploadSize(124143242); // return commonsMultipartResolver; // } @Bean(name = "multipartResolver") public MultipartResolver multipartResolver(){ CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("UTF-8"); resolver.setResolveLazily(true);//resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常 resolver.setMaxInMemorySize(40960); resolver.setMaxUploadSize(50*1024*1024);//上传文件大小 50M 50*1024*1024 return resolver; } }
mybatis的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 @Configuration public class MybatisConfig { //配置MyBatis SqlSessionFactory @Bean public SqlSessionFactory sqlSessionFactory(ApplicationContext applicationContext) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource()); factoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml")); // factoryBean.setMapperLocations(new Resource[]{applicationContext.getResource("classpath:mapper/*.xml")}); return factoryBean.getObject(); } //配置数据源,可以使用连接池 @Bean public DataSource dataSource(){ PooledDataSource pooledDataSource = new PooledDataSource(); pooledDataSource.setUsername("root"); pooledDataSource.setPassword("123456"); pooledDataSource.setUrl("jdbc:mysql://localhost:3306/test"); pooledDataSource.setDriver("com.mysql.cj.jdbc.Driver"); return pooledDataSource; } /** * mapper扫描,扫描mapper接口,并生成bean * @return */ @Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setBasePackage("cn.lzl.mybatis"); return mapperScannerConfigurer; } }
mybatis-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="logImpl" value="STDOUT_LOGGING" /> <!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"/> </settings> <typeAliases> <typeAlias alias="User" type="cn.lzl.mybatis.User"/> </typeAliases> <!--<!– mybatis-config.xml –>--> <typeHandlers> <typeHandler handler="cn.lzl.mybatis.ExampleHandler"/> </typeHandlers> <!--<environments default="development">--> <!--<environment id="development">--> <!--<transactionManager type="JDBC"/>--> <!--<dataSource type="POOLED">--> <!--<property name="driver" value="com.mysql.cj.jdbc.Driver" />--> <!--<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=UTF-8" />--> <!--<property name="username" value="root" />--> <!--<property name="password" value="123456" />--> <!--</dataSource>--> <!--</environment>--> <!--</environments>--> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
Usermapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.lzl.mybatis.UserMapper"> <cache></cache> <select id="selectUser" resultType="User"> select * from t_user limit 1 </select> <select id="selectUserById" resultType="User"> select * from t_user where id = #{id} </select> </mapper>
一个简单的测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Controller public class Test { @Autowired private UserMapper userMapper; @Autowired private SqlSessionFactory sqlSessionFactory; @GetMapping(value = "/test",produces = "text/html;charset=UTF-8") public String test(String id,HttpServletRequest request) { // System.out.println(sqlSessionFactory.getConfiguration()); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); System.out.println(sqlSession.getMapper(UserMapper.class).selectUser()); System.out.println(userMapper.selectUserById("1")); request.getParameter("id"); System.out.println("-------------"); System.out.println(userMapper.selectUser()); System.out.println("-----------"); return "test"; }