一篇文带你入门SSM框架Spring开发!精彩干货不间断!

简介:

 

目录

一、什么是SSM框架?

1、Spring

2、SpringMVC

3、MyBatis

二、SpringIOC容器详解

1、什么是SpringIOC?

(1)、IOC(Inversion of Control):反转控制。

(2)、DI(Dependency Injection):依赖注入。

2、SpringIOC容器的实例化

3、IOC容器中添加bean

三、通过IOC容器获取Bean属性

1、通过bean属性的id进行获取

2、通过bean的类型来进行获取

3、通过类和属性名获取参数

四、在IOC中给bean的属性赋值的多种方法

1、通过无参构造并指定属性赋值

2、通过有参构造并指定属性进行赋值

3、通过有参构造不指定属性进行赋值

4、通过索引值指定参数的位置

5、通过类型不同区分重载的构造器

6、利用P名称空间进行赋值

五、写在最后


Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!

SSM框架相信很多学习java的小伙伴们已经非常熟悉了,作为现代企业级应用开发的主流框架,然而现在的SSM框架已经被大佬们认为是Java开发的入门级教学了,不会点SSM的技术,都不敢去外边找工作了。

image.gif编辑

所以今天来和大家分享一下到底什么是SSM框架,以及SSM框架的第一个S—Spring框架的基础入门,并且将会在之后的文章中继续和大家分享进阶深入,循序递进,层层套娃!为之后Java大牛之路奠定基础!【文章内容较多,建议收藏慢慢学习,后面更精彩!】

image.gif编辑

一、什么是SSM框架?

官方一点的话说:SSM框架集是Spring+SpringMVC+MyBatis的缩写,是由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。用大白话说就是方便进行前后端开发的整合,更加适应企业级项目开发,能够减少代码量的轻量级框架。

下面我们对这三个组成做一个简单的介绍:

1、Spring

Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。

通过Spring的IOC特性,可以将对象之间的依赖关系交给Spring控制,方便解耦,简化了开发。 通过Spring的AOP特性,很容易实现事务,日志,权限的控制。 同时Spring提供了对其他优秀开源框架的集成支持。 具体低侵入式的特点。

2、SpringMVC

SpringMVC在项目中拦截用户请求,它分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。同时springMVC是使用了MVC设计思想的轻量级web框架,对web层进行解耦,使得我们开发更简洁。它还能与Spring无缝衔接。具备灵活的数据验证,格式化,数据绑定机制。

3、MyBatis

MyBatis作用于数据库持久层,是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

MyBatis使用有如下几个优点:

    1. sql写在xml文件中,便于统一管理和优化,解除sql和程序代码的耦合。
    2. 提供映射标签,支持对象和和数据库orm字段关系的映射,支持对象关系映射标签,支持对象关系的组建
    3. 提供xml标签,支持编写动态sql。

    同时缺点是:

      1. 工作量较大,特别是在表的字段多,关联表多的情况下
      2. sql语句的编写依赖于数据库,移植性差
      3. 不支持级联删除,级联更新,需要自己对表进行删除。

      其实上面说了这么多,可能刚开始让小伙伴们理解起来什么是SSM框架还是有一些吃力,我再用大白话和大家讲一下就是:

      页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。

      image.gif编辑

      了解了SSM框架的基本应用原理和结构,那么接下来就是如何入门和使用的过程了,接下来我们先来从spring入手,介绍一下spring的IOC容器的使用。

      二、SpringIOC容器详解

      1、什么是SpringIOC?

      我们知道spring主要是由两大部分构成的,包括IOC和AOP,我们下面就先来和大家聊一下什么是IOC,

      (1)、IOC(Inversion of Control):反转控制。

      在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下我们往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。

      反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

      (2)、DI(Dependency Injection):依赖注入。

      说到控制反转,那么就离不开依赖注入,那么什么是依赖注入?DI依赖注入是IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。

      2、SpringIOC容器的实例化

      那么接下来就是如何使用IOC容器实现bean的配置了,首先我们需要先对IOC容器进行实例化,

      Spring提供了IOC容器的两种实现方式,分别是:

        1. BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。
        2. ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。

        而ApplicationContext接口下面也有两个常用的实现类,分别是:

          1. ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件
          2. FileSystemXmlApplicationContext:对应文件系统中的XML格式的配置文

          我们在平常的开发中最常用到的应该是ClassPathXmlApplicationContext了,

          如我们平常获取IOC容器的方法是:

          ApplicationContext iocContext = new ClassPathXmlApplicationContext("ioc.xml");

          3、IOC容器中添加bean

          在IOC容器中配置bean的方法也有固定的格式,spring中规定在容器中添加的bean属性需要写在<bean></bean>中,并指明该bean的id和类路径,如下:

          <!-- 使用bean元素定义一个由IOC容器创建的对象 -->
          <!-- class属性指定用于创建bean的全类名 -->
          <!-- id属性指定用于引用bean实例的标识 -->
          <bean id="student" class="com.atguigu.helloworld.bean.Student">
              <!-- 使用property子元素为bean的属性赋值 -->
              <property name="studentId" value="1001"/>
              <property name="stuName" value="Tom2015"/>
              <property name="age" value="20"/>
          </bean>

          image.gif

          三、通过IOC容器获取Bean属性

          我们现在大概了解到了如果进行ioc容器的实例化和获取,那么我们在获取到ioc容器之后一般是如何获取其中的bean属性的呢?在spring中获取bean常用的方法是getBean(),该方法中的参数不同,所表示的含义也不同。

          在这里介绍两种在spring中常用的获取bean的方法,

          1、通过bean属性的id进行获取

          这种方法需要知道我们所要获取的bean在容器中定义的id,如在ioc容器中有如下bean的定义:

          <beanid="person01"class="com.spring.beans.Person"></bean>

          则通过bean的id获取这个bean属性的方法就是:

          ApplicationContext iocContext = new ClassPathXmlApplicationContext("ioc.xml");
          /**
           * 普通方法获取参数
           * */
          @Test
          public void test01() {
              Person person01 = (Person)iocContext.getBean("person01");
              System.out.println(person01);
          }

          image.gif

          2、通过bean的类型来进行获取

          这种方法是在getBean()中赋于类的class进行获取的,方法如下:

          ApplicationContext iocContext = new ClassPathXmlApplicationContext("ioc.xml");
          /**
           * 通过bean的类型获取参数
           * */
          @Test
          public void test02() {
              Person person01 = (Person)iocContext.getBean(Person.class);
              System.out.println(person01);
          }

          image.gif

          有小伙伴可能就问了,要是在ioc容器中定义多个同一个类的bean属性,那么使用该方法到底该获取哪一个呢?

          哎,这就对了!

          所以这一种方法只能在ioc中只有一个该类型的bean时进行获取,否则就会报以下错误:

          org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.spring.beans.Person] is defined: expected single matching bean but found 4: person01,person03,person04,person05

          也就是说,没有找到结果,原因是符合要求的bean有多个,不知道该用哪一个了!

          那么要是还是想用这一种方法,那该怎么办呢?

          接下来就是第三种方法了。

          3、通过类和属性名获取参数

          这种方法是上面两个方法的结合体,在getBean()中传入的参数是两个,分别是属性的id和bean属性的类型,如下:

          ApplicationContext iocContext = new ClassPathXmlApplicationContext("ioc.xml");
          /**
           * 通过类和属性名获取参数
           * */
          @Test
          public void test02() {
              Person person02 = (Person)iocContext.getBean("person01",Person.class);                                              
              System.out.println(person02);
          }

          image.gif

          以上就是从ioc容器中获取bean属性的常用方法,

          接下来我来和大家聊一下在IOC容器中又该如何给bean中的属性进行赋值呢?

          四、在IOC中给bean的属性赋值的多种方法

          现在我们已经知道了如何在容器中添加需要的bean了,那么接下来就是如何对这些bean进行赋值的问题,针对bean中属性的类型不同,spring中有多种为bean中属性赋值的方法。接下来我们对这几种方法一一介绍。

          1、通过无参构造并指定属性赋值

          首先第一种方法,也是最普通常用的一种方法,就是利用bean中属性的set方法进行赋值,这种方法对属性的赋值语句需要写了<bean></bean>的<property></property>中,

          <!-- 通过无参构造并指定属性进行赋值  -->
          <bean id="person01" class="com.spring.beans.Person">
              <property name="name" value="张三"></property>
              <property name="age" value="18"></property>
              <property name="sex" value="男"></property>
              <property name="email" value="133@qq.com"></property>
          </bean>

          image.gif

          其中的name中的参数是你在bean中定义的属性名,value是你将要赋予的属性值,

          2、通过有参构造并指定属性进行赋值

          上面那种方法指定在bean没有有参构造器的情况下进行属性的赋值的方法,那么现在这种方法就是,当bean中存在有参构造器时使用的赋值方法,当然,当bean中同时存在有参构造和无参构造器时,上面那种方法还可以使用!

          通过有参构造器进行赋值使用的并不是<property></property>,而是在<constructor-arg></constructor-arg>中,其中的参数name和value与上面的含义一样。

          <!-- 通过有参构造并指定属性进行赋值  -->
          <bean id="person03" class="com.spring.beans.Person">
              <constructor-arg name="name" value="小明"></constructor-arg>
              <constructor-arg name="sex" value="男"></constructor-arg>
              <constructor-arg name="age" value="30"></constructor-arg>
              <constructor-arg name="email" value="xioaming@136.com"></constructor-arg>
          </bean>

          image.gif

          3、通过有参构造不指定属性进行赋值

          第二种方法介绍了使用有参构造指定属性进行赋值,但是有小伙伴们就该说了,那这不是和第一种方法使用差不多嘛,哎,那我们现在再来看一种方法。利用有参构造不指定属性进行赋值,也就是说不使用name了,直接使用value进行赋值。比如我们的bean中的有参构造器长这样:

          public Person(String name, int age, String sex, String email) {
              super();
              this.name = name;
              this.age = age;
              this.sex = sex;
              this.email = email;
          }

          image.gif

          那么通过有参构造不指定属性进行赋值时,就需要将赋值元素书写的顺序按照有参构造器中元素属性的顺序进行书写了

          <!-- 通过有参构造不指定属性进行赋值,但是需要按照构造函数的参数顺序赋值 -->
          <!-- Person(String name, int age, String sex, String email) -->
          <!-- 重载情况下type可以指定参数的类型 -->
          <bean id="person04" class="com.spring.beans.Person">
              <constructor-arg value="小刚"></constructor-arg>
              <constructor-arg value="20"></constructor-arg>
              <constructor-arg value="男"></constructor-arg>
              <constructor-arg value="xiaogang@qq.com"></constructor-arg>
          </bean>

          image.gif

          在这里有一点需要注意:

          就是如果两个有参构造器属于重载,那么在ioc中进行赋值时就需要使用type在 value的后面指明赋值的元素的属性,比如是string还是int型的。

          关于type的使用我们看下面的方法!

          4、通过索引值指定参数的位置

          当我们在使用有参构造器不指定属性赋值时,还有另外的方法,可以不必须的按照顺序来书写赋值。那就是使用索引和属性类型了,使用索引进行赋值时需要使用到index参数,指定要赋值的属性的序号,如对于上面person的构造函数,使用index指定元素位置进行赋值。name的index是0,age是1.

          <bean id="person04" class="com.spring.beans.Person">
              <constructor-arg value="20" index=”1”></constructor-arg>
              <constructor-arg value="小刚" index=”0”></constructor-arg>
              <constructor-arg value="xiaogang@qq.com" index=”3”></constructor-arg>
              <constructor-arg value="男" index=”2”></constructor-arg>
          </bean>

          image.gif

          按照上面的方式同样可以得到相同的赋值效果

          5、通过类型不同区分重载的构造器

          如我们现在有两个同名的有参构造器,但是其中参数类型不一样,如果我们依然使用上面的两种方法来对bean中的属性进行赋值,那么明显是会报错提示构造器不唯一的。

          所以这个时候就需要使用type指定参数的类型,同时index和type可以结合使用,如下:

          <bean id="book" class="com.atguigu.spring.bean.Book" >
                <constructor-arg value= "10010" index ="0" type="java.lang.Integer" />
                <constructor-arg value= "Book01" index ="1" type="java.lang.String" />
                <constructor-arg value= "Author01" index ="2" type="java.lang.String" />
                <constructor-arg value= "20.2" index ="3" type="java.lang.Double" />
          </bean >

          image.gif

          6、利用P名称空间进行赋值

          下面我们来介绍一个全新的赋值方式,利用P名称空间进行赋值。

          为了简化XML文件的配置,越来越多的XML文件采用属性而非子元素配置信息。Spring从2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置Bean的属性。

          使用p命名空间后,基于XML的配置方式将进一步简化。具体使用如下,

          首先我们应该在xml文件中加入P名称空间的使用插件。

          加入P名称空间的使用插件的方法如下:以eclipse为例:

          image.gif编辑

          image.gif编辑

          image.gif编辑

          之后在xml的头文件的<beans>中看到如下代码就添加成功了,或者直接在<beans>头文件中加入以下代码:

          xmlns:p="http://www.springframework.org/schema/p"

          P名称空间的使用方法是这样的,在<bean></bean>建立完成之后,直接在<bean>中使用P:的格式进行赋值。

          <!-- 通过p名称空间对bean进行赋值,导入p名称空间 -->
          <!-- 利用名称空间的作用是防止标签重复的 -->
          <bean id="person05" class="com.spring.beans.Person" 
          p:name="小哈" p:age="21" p:sex="女" p:email="xiaoha@wx.com"></bean>

          image.gif

          这样也能达到为bean进行赋值的效果。

          对于上面进行赋值的几种方法,我们在直接获取到ioc对象之后,调用期getBean方法就可以获取到对象的bean,并且可以获取到其中某一个属性的值。

          我们来演示一下:

          /**
           * 通过p标签对bean进行赋值
           * */
          @Test
          public void text04() {
              Person person05 = (Person)iocContext.getBean("person05");
              System.out.println(person05);
          }

          image.gif

          控制台输出结果:

          image.gif编辑

          五、写在最后

          这篇文章讲解了关于SSM框架中Spring的简单入门,IOC容器的概述,以及如何创建IOC容器,如何实例化并获取IOC容器,如何在其中添加bean,如何获取其中的bean,还有如何在容器中对bean进行简单赋值。

          之后我将继续和大家分享如何对赋值属性进行赋值,如一个类、Map、List等,以及bean之间的继承和更加简洁的注解开发。

          有问题的小伙伴可以在评论区留言提出,最后记得点赞关注哟!

          我是灰小猿,我们下期见!

          image.gif编辑

          目录
          相关文章
          |
          27天前
          |
          XML 安全 Java
          |
          4天前
          |
          存储 安全 Java
          Spring Security 入门
          Spring Security 是 Spring 框架中的安全模块,提供强大的认证和授权功能,支持防止常见攻击(如 CSRF 和会话固定攻击)。它通过过滤器链拦截请求,核心概念包括认证、授权和自定义过滤器。配置方面,涉及密码加密、用户信息服务、认证提供者及过滤器链设置。示例代码展示了如何配置登录、注销、CSRF防护等。常见问题包括循环重定向、静态资源被拦截和登录失败未返回错误信息,解决方法需确保路径正确和添加错误提示逻辑。
          Spring Security 入门
          |
          5天前
          |
          设计模式 XML Java
          【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
          本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
          【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
          |
          28天前
          |
          Java 开发者 微服务
          Spring Boot 入门:简化 Java Web 开发的强大工具
          Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
          50 6
          Spring Boot 入门:简化 Java Web 开发的强大工具
          |
          12天前
          |
          IDE Java 测试技术
          互联网应用主流框架整合之Spring Boot开发
          通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
          28 5
          |
          23天前
          |
          缓存 Java 数据库连接
          Spring框架中的事件机制:深入理解与实践
          Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
          51 8
          |
          25天前
          |
          Java 数据库连接 数据库
          从入门到精通---深入剖析Spring DAO
          在Java企业级开发中,Spring框架以其强大的功能和灵活性,成为众多开发者的首选。Spring DAO(Data Access Object)作为Spring框架中处理数据访问的重要模块,对JDBC进行了抽象封装,极大地简化了数据访问异常的处理,并能统一管理JDBC事务。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring DAO,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
          22 1
          |
          29天前
          |
          监控 Java 数据安全/隐私保护
          如何用Spring Boot实现拦截器:从入门到实践
          如何用Spring Boot实现拦截器:从入门到实践
          49 5
          |
          关系型数据库 Java MySQL
          SSM-Spring-20:Spring中事务基础
            ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       事务 事务是什么?   我记得当初的百度百科上讲,事务是执行的最小逻辑单元,它们要么都执行,要么都不执行   (同生共死) 事务解决什么问题?   简单的提一个小例子,...
          1274 0
          |
          2月前
          |
          人工智能 自然语言处理 前端开发
          SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
          【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
          245 2