一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)
前言
我们之前整合的ssm框架都是通过xml 配置bean,在接触并且使用了spingboot的自动配置,自动注入之后。感觉开阔了新天地,从这点也可以对比出,为什么说springboot 并不是为了替代 spring 而是在已有的基础上,优化了ssm的繁琐配置。可以做到零配置就可以启动一个项目,本篇文章常识让xml配置bean 改成 想springboot 一样自动扫包。
目录
- 业务
- 代码示例
-
- Java代码
-
- controller
- service
- pojo
- dao
- JSP
- pom 依赖
- xml文件整合
- applictionContext 总配置文件
-
- dao
- controller
- service
- 整合注意事项
-
- pom xml过滤设置
- 容器注入失败
- 效果
- 源码分享
业务
通过jsp页面插入一条用户信息,业务随机简单。醉翁之意不在此!
分层
代码示例
Java代码
controller
package com.kuang.controller;import com.kuang.pojo.UserInfoPojo;import com.kuang.service.UserInfoService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.Resource;/ * @Description 用户信息 * @ClassName UserInfoController * @Author 康世行 * @Date 15:42 2022/4/20 * @Version 1.0 /@Controller@RequestMapping("/userInfo")public class UserInfoController { @Autowired private UserInfoService userInfoService; @PostMapping("/addUserInfo") public Object addUserInfo( UserInfoPojo userInfoPojo){ int i = userInfoService.addUserInfo(userInfoPojo); return "addUserInfo"; } // 跳转到增加书籍页面 @RequestMapping("/toAddUserInfo") public String pageJumps(){ return "addUserInfo"; }}
service
接口
package com.kuang.service;import com.kuang.pojo.UserInfoPojo;/ * @Description 用户信息接口 * @ClassName UserInfoService * @Author 康世行 * @Date 15:40 2022/4/20 * @Version 1.0 /public interface UserInfoService { /* * @author 康世行 * @description: 添加用户信息 * @date 2022/4/20 15:41 * @param userInfoPojo * @return int * @Version1.0 / int addUserInfo(UserInfoPojo userInfoPojo);}
实现类
package com.kuang.service;import com.kuang.dao.UserInfoMapper;import com.kuang.pojo.UserInfoPojo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;/ * @Description 用户信息 * @ClassName UserInfoImpl * @Author 康世行 * @Date 15:41 2022/4/20 * @Version 1.0 /@Servicepublic class UserInfoImpl implements UserInfoService{ @Autowired private UserInfoMapper userInfoMapper; //使用xml配bean 需要解开此注释// public void setUserInfoMapper(UserInfoMapper userInfoMapper) {// this.userInfoMapper = userInfoMapper;// } @Override public int addUserInfo(UserInfoPojo userInfoPojo) { return userInfoMapper.addUserInfo(userInfoPojo); }}
pojo
package com.kuang.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/ * @Description 用户信息 * @ClassName UserInfoPojo * @Author 康世行 * @Date 15:34 2022/4/20 * @Version 1.0 /@Data@AllArgsConstructor@NoArgsConstructorpublic class UserInfoPojo { private String userName; private String userPwd; private int age; private String sex;}
dao
package com.kuang.dao;import com.kuang.pojo.UserInfoPojo;/ * @Description 用户信息dao * @ClassName UserInfoMapper * @Author 康世行 * @Date 15:36 2022/4/20 * @Version 1.0 /public interface UserInfoMapper { int addUserInfo(UserInfoPojo userInfoPojo);}
xml dao实现
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.kuang.dao.UserInfoMapper"> <insert id="addUserInfo"> insert into user_info values (#{userName},#{userPwd},#{age},#{sex}) </insert></mapper>
JSP
<html><head> <title>添加用户信息</title> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"></head><body><div class="container"> <div class="row clearfix"> <div class="col-md-12 column"> <div class="page-header"> <h1> <small>新增用户信息</small> </h1> </div> </div> </div> <form action="${pageContext.request.contextPath}/userInfo/addUserInfo" method="post"> <div class="form-group"> <label for="userName">用户名</label> <input type="text" class="form-control" id="userName" name="userName" required> </div> <div class="form-group"> <label for="userPwd">用户密码</label> <input type="text" class="form-control" id="userPwd" name="userPwd" required> </div> <div class="form-group"> <label for="age">年龄</label> <input type="text" class="form-control" id="age" name="age" required> </div> <div class="form-group"> <label for="sex">性别</label> <input type="text" class="form-control" id="sex" name="sex" required> </div> <div class="form-group"> <input type="submit" class="form-control" value="添加"> </div> </form></div></body></html>
pom 依赖
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
xml文件整合
applictionContext 总配置文件
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="spring-dao.xml"/> <import resource="spring-service.xml"/> <import resource="spring-mvc.xml"/></beans>
dao
database.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true jdbc.username=rootjdbc.password=123456
mybatis-config
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <typeAliases> <package name="com.kuang.pojo"/> </typeAliases> <mappers> <!-- --> </mappers></configuration>
spring-dao
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:database.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="password" value="${jdbc.password}"/> <property name="user" value="${jdbc.username}"/> <property name="maxPoolSize" value="30"/> <property name="minPoolSize" value="10"/> <property name="autoCommitOnClose" value="false"/> <property name="checkoutTimeout" value="10000"/> <property name="acquireRetryAttempts" value="2"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <property name="basePackage" value="com.kuang.dao"/> </bean></beans>
controller
spring-mvc
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven /> <mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <context:component-scan base-package="com.kuang.controller" /></beans>
service
spring-service
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.kuang.service"/> <!-- --><!-- --><!-- --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean></beans>
整合注意事项
pom xml过滤设置
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>/*.properties</include> <include>/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>/*.properties</include> <include>/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
容器注入失败
当出现上面这个错误的时候,说明你要依赖的对象,没有被注入到容器中。可以理解为没有在IOC容器中找到要依赖的对象。
这个时候不要慌,请看蓝色字部分,安住Ctrl(仅限windows 用户,苹果用户自行搜索快捷键) 点击进去就可以找到错误的原因了如下:
可以看到使用autowired 自动注入bean 的userInfoService 字段上 报红线,在idea 里报红线一般是err和warning。在结合上面的报错提示可以看到,我们要依赖的 userInfoService 对象创建失败,没有注入到IOC容器就导致了controller 对象依赖它的时候报错。
解决方案
由于service 层使用的是自动扫包所以,在接口的实现类上需要加上 @Service 这个注解才可以把对应的实现类注入到IOC容器
不加注解
加注解
从图中可以看出来~ 只是类上多了个Service 注解,通过service 注解就可以把实现类对象注入到容器中。
效果
首页
添加用户信息
添加成功!
源码分享
项目源码分享
感谢阅读~ 都已经看到这了,不妨给个一键三连