二、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的技术,都不敢去外边找工作了。
所以今天来和大家分享一下到底什么是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的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的定义:
<bean id="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 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中同时存在有参构造和无参构造器时,上面那种方法还可以使用!
通过有参构造器进行赋值使用的并不是,而是在中,其中的参数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;
}
那么通过有参构造不指定属性进行赋值时,就需要将赋值元素书写的顺序按照有参构造器中元素属性的顺序进行书写了
## 最后
## 权威指南-第一本Docker书
引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。
总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。
![image](https://img-blog.csdnimg.cn/img_convert/dce53b293cbd6179fb9d8ef1390b9b35.png)
![image](https://img-blog.csdnimg.cn/img_convert/bf5edba58e1e6a2a3349810286ba29c0.png)
![image](https://img-blog.csdnimg.cn/img_convert/a87cc58b8e689a0c40eeeb7a692b8cba.png)
![image](https://img-blog.csdnimg.cn/img_convert/82ca41ac2cd8fcd7b1a3176c3c0f87df.png)
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**
ocker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。
总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。
[外链图片转存中...(img-3Mcqg5Xb-1630671257578)]
[外链图片转存中...(img-n4O6sowg-1630671257579)]
[外链图片转存中...(img-zrIC5rJG-1630671257580)]
[外链图片转存中...(img-hzaM56F8-1630671257582)]
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**