一篇文章学会ssm-配置文件整合-原来ssm也可以像springBoot 一样自动扫包(对ssm的误解)
前言
我们之前整合的ssm框架都是通过xml 配置bean,在接触并且使用了spingboot的自动配置,自动注入之后。感觉开阔了新天地,从这点也可以对比出,为什么说springboot 并不是为了替代 spring 而是在已有的基础上,优化了ssm的繁琐配置。可以做到零配置就可以启动一个项目,本篇文章常识让xml配置bean 改成 想springboot 一样自动扫包。
目录
业务
通过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
**/
@Service
public 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
@NoArgsConstructor
public 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实现
<?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="com.kuang.dao.UserInfoMapper">
<insert id="addUserInfo">
insert into user_info values (#{userName},#{userPwd},#{age},#{sex})
</insert>
</mapper>
JSP
<%--
Created by IntelliJ IDEA.
User: 康世行
Date: 2022/4/20
Time: 16:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加用户信息</title>
<%-- 引入bootstarp--%>
<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 依赖
<!--junit-->
<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>
<!-- servletjsp-->
<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>
<!--mybatis-->
<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>
<!--spring-->
<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 总配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- ssm整合总的配置文件-->
<import resource="spring-dao.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-mvc.xml"/>
</beans>
dao
database.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
jdbc.username=root
jdbc.password=123456
mybatis-config
<?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>
<typeAliases>
<package name="com.kuang.pojo"/>
</typeAliases>
<!--关联接口映射的xml文件-->
<mappers>
<!--导入具体dao层实现的xml文件-->
<!-- <mapper resource="com/kuang/dao/BookMapper.xml"/>-->
</mappers>
</configuration>
spring-dao
<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--配置整合mybatis-->
<!--1,关联数据文件-->
<context:property-placeholder location="classpath:database.properties"/>
<!-- 2,数据库连接池-->
<!--
dbcp 半自动操作 不能自动连接
c3p0 自动化操作 (自动的加载配置文件 并且设置到对象里面)
-->
<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}"/>
<!--c3p0连接池私有属性-->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<!--关闭连接后不自动commit-->
<property name="autoCommitOnClose" value="false"/>
<!--获取连接超时时间-->
<property name="checkoutTimeout" value="10000"/>
<!--当获取连接失败重试次数-->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!--3,配置sqlsessionFactory对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据连接池-->
<property name="dataSource" ref="dataSource"/>
<!--配置MyBaties全局配置文件:mybatis-config.xml-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 4,配置扫描Dao接口包,动态实现Dao接口注入到Spring容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.kuang.dao"/>
</bean>
</beans>
controller
spring-mvc
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置SpringMVC -->
<!-- 1.开启SpringMVC注解驱动 -->
<mvc:annotation-driven />
<!-- 2.静态资源默认servlet配置-->
<mvc:default-servlet-handler/>
<!-- 3.配置jsp 显示ViewResolver视图解析器 -->
<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>
<!-- 4.扫描web相关的bean -->
<context:component-scan base-package="com.kuang.controller" />
</beans>
service
spring-service
<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描service相关的bean-->
<context:component-scan base-package="com.kuang.service"/>
<!--UserInfoImpl注入到IOC容器中 使用自动扫描bean代替手动注册bean-->
<!-- <bean id="userInfoImpl" class="com.kuang.service.UserInfoImpl">-->
<!-- <!–给字段赋值–>-->
<!-- <property name="userInfoMapper" ref="userInfoMapper"/>-->
<!-- </bean>-->
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据库连接-->
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
整合注意事项
pom xml过滤设置
<!-- maven资源过滤设置-->
<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 注解就可以把实现类对象注入到容器中。
效果
首页
添加用户信息
添加成功!
源码分享
**感谢阅读~ 都已经看到这了,不妨给个一键三连
**
文章来源: kangshihang.blog.csdn.net,作者:康世行,版权归原作者所有,如需转载,请联系作者。
原文链接:kangshihang.blog.csdn.net/article/details/124541798
- 点赞
- 收藏
- 关注作者
评论(0)