> 文档中心 > 一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)

一篇文章学会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页面插入一条用户信息,业务随机简单。醉翁之意不在此!
分层
一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)

代码示例

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>

容器注入失败

一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)
     当出现上面这个错误的时候,说明你要依赖的对象,没有被注入到容器中。可以理解为没有在IOC容器中找到要依赖的对象。

这个时候不要慌,请看蓝色字部分,安住Ctrl(仅限windows 用户,苹果用户自行搜索快捷键) 点击进去就可以找到错误的原因了如下:
一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)

可以看到使用autowired 自动注入bean 的userInfoService 字段上 报红线,在idea 里报红线一般是err和warning。在结合上面的报错提示可以看到,我们要依赖的 userInfoService 对象创建失败,没有注入到IOC容器就导致了controller 对象依赖它的时候报错。
解决方案
      由于service 层使用的是自动扫包所以,在接口的实现类上需要加上 @Service 这个注解才可以把对应的实现类注入到IOC容器
不加注解
一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)

加注解
一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)
从图中可以看出来~ 只是类上多了个Service 注解,通过service 注解就可以把实现类对象注入到容器中。

效果

首页
一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)
添加用户信息
一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)
添加成功!
一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)

源码分享

项目源码分享
一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)

感谢阅读~ 都已经看到这了,不妨给个一键三连一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)