SpringMVC bean加载控制 -- SpringMVC入门保姆级教程(二)

news2024/11/25 8:23:48

文章目录

  • 前言
  • 二、SpringMVC bean 加载控制
    • 1.bean加载控制
    • 2.添加Spring开发环境
    • 3.SpringMVC bean加载控制
    • 4.SpringMVC bean控制相关知识点
  • 总结


前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

在这里插入图片描述

二、SpringMVC bean 加载控制

1.bean加载控制

SpringMVC和Spring都只加载对应的bean,因为他们的功能不同,所以要避免Spring加载到SpringMVC的bean

  1. Controller加载控制与业务bean加载控制
  • SpringMVC控制bean

SpringMVC加载的bean为表现层bean,对应的包均在org.example.controller包内

  • Spring控制的bean

Spring加载的bean为业务bean(Service)和功能bean(DataSource等)

  • Spring 避免加载到 SpringMVC 控制的 bean 的方式

方式一: Spring加载的bean设定扫描范围为org.example,排除掉controller包内的bean
方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
方式三:不区分Spring和SpringMVC的环境,都加载到同一环境中

2.添加Spring开发环境

(在SpringMVC入门案例的基础上编码,详情见个人主页资源的SpringMVC源码)

  • 在pom.xml导入Spring开发相关的坐标
    //导入spring框架
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
    
    //spring操作数据库
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    //spring整合mybatis
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>

    //导入mybatis
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

    //mybatis连接数据库
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    
  • 创建数据层dao接口userDao
public interface UserDao {
    @Insert("insert into tbl_user(name,age)values(#{name},#{age})")
    public void save(User user);
}

  • 创建数据层dao实体类User
public class User {
    private Integer id;
    private String name;
    private Integer age;
}

  • 创建service服务接口UserService
public interface UserService {
    public void save(User user);
}

  • 创建servide服务接口实现类UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
    public void save(User user) {
        System.out.println("user service ...");
    }
}

3.SpringMVC bean加载控制

  • 创建Spring全局配置类SpringConfig
  1. 方式一: Spring加载的bean设定扫描范围为org.example,排除掉controller包内的bean
@Configuration
@ComponentScan(value="org.example",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        )
)
public class SpringConfig {
}

  • 将SpringMvcConfig中的@Configuration注解注释掉,创建模拟测试类App并运行
public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        System.out.println(ctx.getBean(UserController.class));
    }
}

在这里插入图片描述
我们发现找不到SpringMVC控制的UserController类,过滤成功

  1. 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
@Configuration
@ComponentScan({"com.itheima.service","com.itheima.dao"})
public class SpringConfig {
}

  1. 方式三:不区分加载SpringMVC和Spring的加载环境

//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }

}

4.SpringMVC bean控制相关知识点

  1. @ComponentScan注解

1.名称:@ComponentScan
2.类型:类注解
3.功能: 设置spring配置类加载bean时的过滤规则
4.属性:

includeFilters:加载指定的bean,需要指定类别(type)与具体项(Classes)
excludeFilters属性:设置扫描加载bean时,排除的过滤规则
type属性:设置排除规则,需要指定类别(type)与具体项(Classes)
classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean
5.范例:

在这里插入图片描述

  1. 加载环境的简化开发
//web配置类简化开发,仅设置配置类类名即可
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下作者,后续还会更新mybatis, springboot,maven高级,微信小程序,等前后端内容的学习笔记。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/578947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

丝印设计~丝印内容、大小、距离、排列,位置

丝印设计 丝印的内容包括&#xff1a; a) PCB的名称/PCB的版本号 b) 元器件外形框 c) 元器件的序号 d) 元器件的极性和方向标志 e) 条码框 f) 插入PCB的名称&#xff08;母板&#xff09; g) 插针的位置序号 h) 安装孔位置代号 i) 元器件第1脚的位置代号 j) 过板方向 k) 光纤盘…

分治入门+例题

目录 &#x1f947;2.3.2 合并排序 &#x1f947;2.3.3 快速排序 &#x1f33c;P1010 [NOIP1998 普及组] 幂次方 &#x1f333;总结 形象点&#xff0c;分治正如“凡治众如治寡&#xff0c;分数是也”&#xff0c;管理少数几个人&#xff0c;即可统领全军 本质&#xff…

js数据类型和六种运算结果为false的情况

数据类型 number&#xff1a;数字&#xff08;整数、小数、NaN(Not a Number)&#xff09; string&#xff1a;字符串、单双引皆可 boolean&#xff1a;布尔。true、false null&#xff1a;对象为空 undefined&#xff1a;当声明的变量初始化时&#xff0c;该变量的默认值…

vuex五大核心、辅助函数

一、vuex五大核心 分别为&#xff1a;state、getters、mutations、actions、modules state&#xff1a;用来存放我们的状态&#xff0c;也可以理解数据&#xff0c;类似与data中定义的数据&#xff1b;mutations:可以获取state里面的状态&#xff0c;进行修改&#xff0c;他只…

Hadoop---10、生产调优手册

1、HDFS—核心参数 1.1 NameNode 内存生产配置 1、NameNode内存计算 每个文件块大概占用150byte&#xff0c;一台服务器128G内存为例&#xff0c;能储存多少文件块呢&#xff1f; 12810241024*1024/150Byte ≈ 9.1 亿 G M KB Byte 2、Hadoop2.x系列&#xff0c;配置 NameNode…

leetcode506.相对名次

题目描述跳转leetcode详情 给你一个长度为 n 的整数数组 score &#xff0c;其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。 运动员将根据得分 决定名次 &#xff0c;其中名次第 1 的运动员得分最高&#xff0c;名次第 2 的运动员得分第 2 高&#xff0…

day1 -- 资料库管理系统DBMS

学习目标&#xff1a; 了解什么是Mysql 如何安装Mysql 学习内容&#xff1a; 资料库概念资料库管理系统概念资料库管理系统分类SQL是什么安装Mysql启动Mysql并建立一张测试表格 正文部分 资料库 比如你喜欢摘抄优美的词句&#xff0c;那些优美的词句就是一种文字资料&#xf…

香橙派4和树莓派4B构建K8S集群实践之六:App服务部署

目录 1. 说明 1.1 关于PHPNginx体系的WebApp&#xff0c;这里将实践两种部署模式&#xff1a; 1.2 配置清单 2. PHPNginx体系的WebApp部署 2.1 单节点多容器模式A 2.1.1 准备工作 2.2.2 部署 2.2.3 访问效果 ​编辑 2.2 多节点单容器模式B 2.2.1 准备工作 2.2 配置…

笔记 | FastAPI创建新项目

当使用FastAPI创建项目时&#xff0c;首先需要安装FastAPI和其依赖项。可以使用pip来安装它们。请确保已经安装了Python和pip。 创建项目文件夹并进入该文件夹&#xff1a; mkdir myproject cd myproject创建并激活一个新的Python虚拟环境&#xff08;可选&#xff0c;但强烈…

虚拟机扩容

文章目录 虚拟机扩容扩容背景软件版本操作步骤1、VM上修改磁盘信息2、在系统中挂载磁盘(1) 使用命令查看磁盘状态(2) 通过命令查看到新磁盘的分区(3) 然后对新加的磁盘进行分区操作(4)重启虚拟机(5) 再次用以下命令查看到磁盘当前情况(6) 查看卷组名(7) 初始化刚刚的分区(8) 将…

MongoDB入门

mongodb与sql术语对应关系 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引 对应关系图例

Microsoft Edge有哪些你不知道却超级好用的插件?(Microsoft Edge功能测评)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:对Edge浏览器的简单测评,分享一些自己在使用好用的插件. 目录…

阿里系文生图(PAI+通义)

PAI-Diffusion模型来了&#xff01;阿里云机器学习团队带您徜徉中文艺术海洋 - 知乎作者&#xff1a;汪诚愚、段忠杰、朱祥茹、黄俊导读近年来&#xff0c;随着海量多模态数据在互联网的爆炸性增长和训练深度学习大模型的算力大幅提升&#xff0c;AI生成内容&#xff08;AI Gen…

Ae 效果详解:3D 摄像机跟踪器

Ae菜单&#xff1a;效果/透视/3D 摄像机跟踪器 Effects/Perspective/3D Camera Tracker 使用 3D 摄像机跟踪器 3D Camera Tracker效果可自动分析视频&#xff0c;以便提取摄像机运动和 3D 场景数据。然后&#xff0c;可以在 2D 素材的基础上正确合成 3D 元素。 提示&#xff1a…

基于DataX的海量时序数据迁移实战:从MySQL到TDengine3.x

背景 MySQL 数据库中&#xff0c;设备历史数据单表过亿&#xff0c;如何快速、低成本地迁移到 TDengine3.x 中&#xff1f; 从标题可以看出&#xff0c;我们使用的数据迁移/同步工具是 DataX &#xff0c;数据源&#xff08; Source &#xff09;为传统的关系型数据库 MySQL …

Yarn学习笔记

Apache Hadoop YARN &#xff08;Yet AnotherResource Negotiator&#xff0c;另一种资源协调者&#xff09;是一种新的 Hadoop 资源管理器&#xff0c;它是一个通用资源管理系统&#xff0c;可为上层应用提供统一的资源管理和调度&#xff0c;它的引入为集群在利用率、资源统一…

全面SOA化的电子电气架构是什么样?

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 作者 | 张萌宇 在汽车产业向智能化转型的过程中&#xff0c…

《C++程序设计原理与实践》笔记 第18章 向量和数组

本章将介绍如何拷贝以及通过下标访问向量。为此&#xff0c;我们讨论一般的拷贝技术&#xff0c;并考虑向量与底层数组表示之间的关系。我们将展示数组与指针的关系及其使用引发的问题。我们还将讨论对于每种类型必须考虑的五种基本操作&#xff1a;构造、默认构造、拷贝构造、…

C++中queue的用法(超详细,入门必看)

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

轩辕:首个千亿级中文金融对话模型

背景 目前开源的大语言模型或多或少存在以下痛点&#xff1a; 缺少专门针对中文进行优化过的的大语言模型。 支持中文的开源模型的参数规模偏小&#xff0c;没有超过千亿。比如清华和智谱AI的ChatGLM-6B目前只开源了6B参数模型&#xff0c;盘古alpha也只开源了13B的模型。 支…