目录
(1)、IOC(Inversion of Control):反转控制。
(2)、DI(Dependency Injection):依赖注入。
Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!
SSM框架相信很多学习java的小伙伴们已经非常熟悉了,作为现代企业级应用开发的主流框架,然而现在的SSM框架已经被大佬们认为是Java开发的入门级教学了,不会点SSM的技术,都不敢去外边找工作了。
编辑
所以今天来和大家分享一下到底什么是SSM框架,以及SSM框架的第一个S—Spring框架的基础入门,并且将会在之后的文章中继续和大家分享进阶深入,循序递进,层层套娃!为之后Java大牛之路奠定基础!【文章内容较多,建议收藏慢慢学习,后面更精彩!】
编辑
一、什么是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使用有如下几个优点:
- sql写在xml文件中,便于统一管理和优化,解除sql和程序代码的耦合。
- 提供映射标签,支持对象和和数据库orm字段关系的映射,支持对象关系映射标签,支持对象关系的组建
- 提供xml标签,支持编写动态sql。
同时缺点是:
- 工作量较大,特别是在表的字段多,关联表多的情况下
- sql语句的编写依赖于数据库,移植性差
- 不支持级联删除,级联更新,需要自己对表进行删除。
其实上面说了这么多,可能刚开始让小伙伴们理解起来什么是SSM框架还是有一些吃力,我再用大白话和大家讲一下就是:
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。
编辑
了解了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容器的两种实现方式,分别是:
- BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的。
- ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。
而ApplicationContext接口下面也有两个常用的实现类,分别是:
- ClassPathXmlApplicationContext:对应类路径下的XML格式的配置文件
- 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>
三、通过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); }
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); }
有小伙伴可能就问了,要是在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); }
以上就是从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>
其中的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>
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; }
那么通过有参构造不指定属性进行赋值时,就需要将赋值元素书写的顺序按照有参构造器中元素属性的顺序进行书写了
<!-- 通过有参构造不指定属性进行赋值,但是需要按照构造函数的参数顺序赋值 --> <!-- 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>
在这里有一点需要注意:
就是如果两个有参构造器属于重载,那么在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>
按照上面的方式同样可以得到相同的赋值效果
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 >
6、利用P名称空间进行赋值
下面我们来介绍一个全新的赋值方式,利用P名称空间进行赋值。
为了简化XML文件的配置,越来越多的XML文件采用属性而非子元素配置信息。Spring从2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置Bean的属性。
使用p命名空间后,基于XML的配置方式将进一步简化。具体使用如下,
首先我们应该在xml文件中加入P名称空间的使用插件。
加入P名称空间的使用插件的方法如下:以eclipse为例:
编辑
编辑
编辑
之后在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>
这样也能达到为bean进行赋值的效果。
对于上面进行赋值的几种方法,我们在直接获取到ioc对象之后,调用期getBean方法就可以获取到对象的bean,并且可以获取到其中某一个属性的值。
我们来演示一下:
/** * 通过p标签对bean进行赋值 * */ @Test public void text04() { Person person05 = (Person)iocContext.getBean("person05"); System.out.println(person05); }
控制台输出结果:
编辑
五、写在最后
这篇文章讲解了关于SSM框架中Spring的简单入门,IOC容器的概述,以及如何创建IOC容器,如何实例化并获取IOC容器,如何在其中添加bean,如何获取其中的bean,还有如何在容器中对bean进行简单赋值。
之后我将继续和大家分享如何对赋值属性进行赋值,如一个类、Map、List等,以及bean之间的继承和更加简洁的注解开发。
有问题的小伙伴可以在评论区留言提出,最后记得点赞关注哟!
我是灰小猿,我们下期见!
编辑