SSM框架学习记录-Spring_day01
1.核心概念
当前项目中的问题
下面代码的实现十分简单,但是业务层需要调用数据层的方法,就要在业务层new数据层的对象,如果数据层的实现类发生变化,业务层的代码也需要跟着改变,意味着要编译打包和重新部署
// 数据层实现
public class FoodDaoImpl implements FoodDao{public void save(){...}
}
// 业务层实现
public class FoodServiceImpl implements FoodService{private FoodDao fd = new FoodDaoImpl();public void save(){fd.save();}
}
IOC、IOC容器、Bean、DI*
针对上述问题,Spring提出了一个解决方案:使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象(Spring的核心概念)
IOC(Inversion of Control)
- 什么是控制反转
IOC
?使用对象时,由主动new
产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部 Spring
和IOC
之间的关系是什么?Spring
技术对IOC
思想进行了实现- Spring提供了一个容器(即
IOC
容器),用来充当IOC
思想中的外部
IOC
容器的作用以及内部存放的是什么?IOC
容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象- 被创建或被管理的对象在
IOC
容器中统称为Bean
- 当
IOC
容器中创建好service
和dao
对象后,程序能正确执行么?不行!service
运行需要依赖dao
对象,IOC
容器中虽然有service
和dao
对象,但service
对象和dao
对象没有任何关系,需要将二者进行绑定
DI(Dependency Injection)
上述提到需要绑定对象间的关系,使用的就是DI
什么是依赖注入DI?在容器中建立
bean
与bean
之间的依赖关系的整个过程称为依赖注入IOC
容器中哪些bean
之间要建立依赖关系?如业务层需要依赖数据层,service
就要和dao
建立依赖关系
目标
充分解耦:
- 使用
IOC
容器管理bean
- 在
IOC
容器内将有依赖关系的bean
进行关系绑定- 使用对象时不仅可以直接从
IOC
容器中获取,并且获取到的bean
已经绑定了所有的依赖关系
2.入门案例
IOC入门
思路分析
Spring
是使用容器来管理bean
对象的,管什么?主要管理项目中所使用到的类对象,比如Service
和Dao
- 如何将被管理的对象告知
IOC
容器?使用配置文件 - 被管理的对象交给
IOC
容器,要想从容器中获取对象先要获取IOC
容器,如何获取?Spring
框架提供相应的接口 IOC
容器得到后,如何从容器中获取bean
?调用Spring
框架提供对应接口中的方法
代码实现
参考Spring_01_quickstart
DI入门
分为思路和代码
思路分析
- 要想实现依赖注入,必须要基于
IOC
管理bean
Service
中使用new
形式创建的Dao
对象是否保留?删除,因为要使用IOC
容器中的bean
对象Service
中需要的Dao
对象如何进入到Service
中?在Service
中提供方法(set
方法),让IOC
容器可以通过该方法传入bean
对象Service
与Dao
间的关系如何描述?使用配置文件
代码实现
参考Spring_01_quickstart
3.IOC相关内容
bean基础配置
主要掌握:
bean
标签的id
和class
属性的使用- 对于是否设置单例的思考
代码参考Spring_02_base_config
id
:bean
的id
,在容器中唯一class
:bean
的类型(即bean
的全路径类名),注意不能使用接口(因为接口无法创建对象)name
:定义bean
的别名,存在多个就使用,;
或者空格分隔,之后在ref
和getBean
方法中中也可以使用别名scope
:定义bean
的作用范围,singleton
表示单例(默认),prototype
表示非单例为什么
bean
默认为单例?避免了对象的频繁创建与销毁,性能高bean
在容器中是单例的,会不会产生线程安全问题?- 如果对象是有状态对象(即该对象有成员变量可以用来存储数据的),所以会存在线程安全问题
- 如果对象是无状态对象(即该对象没有成员变量没有进行数据存储),因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题
哪些
bean
对象适合交给容器进行管理?- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
哪些
bean
对象不适合交给容器进行管理?- 封装实例的域对象,因为会引发线程安全问题
bean实例化
主要掌握:
bean
是如何创建的?- 实例化
bean
的三种方式代码参考Spring_03_bean_instance
bean
如何创建?使用反射,因为把构造方法设置为私有也可以使用bean
,所以使用的是反射实例化
bean
的三种方式:- 构造方法实例化:调用的是无参构造方法,因为把无参构造方法删除,并且设置一个有参构造方法,运行时会报错
<bean id="bookDao" class="com.psj.dao.impl.BookDaoImpl"/>
- 静态工厂实例化(了解即可):
<bean id="orderDao" class="com.psj.factory.OrderDaoFactory" factory-method="getOrderDao"/>
实例工厂实例化(了解即可):和静态工厂的区别在于工厂中的方法一个是静态一个不是,并且配置也不同
<bean id="userFactory" class="com.psj.factory.UserDaoFactory"/> <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
FactoryBean
的使用:上述配置过于复杂,因为factory-method
名称不固定每次都要配置,并且还需要特意创建id=userFactory
的bean
配合使用
// FactoryBean创建对象 public class UserDaoFactoryBean implements FactoryBean<UserDao> {// 代替原始实例工厂中创建对象的方法(相当于统一了方法名为getObject)public UserDao getObject() throws Exception {return new UserDaoImpl();}public Class<?> getObjectType() {return UserDao.class;}// 如果要设置为单例/非单例,还可以实现isSingleton方法(不实现就取默认值-单例) }
<bean id="userDao" class="com.psj.factory.UserDaoFactoryBean"/>
bean的生命周期
bean
生命周期指bean
对象从创建到销毁的整体过程;bean
生命周期控制指在bean
创建后到销毁前做的事主要掌握:
- 生命周期设置
bean
的生命周期代码参考Spring_04_bean_lifecycle
生命周期设置:
- 添加初始化和销毁方法:分为不实现接口和实现接口两种
- 在
BooDaoImpl
类中分别添加两个方法,方法名任意, - 在
BookServiceImpl
类中实现两个接口InitializingBean
和DisposableBean
,并实现接口中的方法afterPropertiesSet
和destroy
- 在
- 配置生命周期:对于不实现接口和实现接口两个情况,配置生命周期方式也不同
- 不实现接口的方式需要在配置文件添加配置
init-method
和destroy-method
- 实现接口的方式则无需添加上述方法
- 不实现接口的方式需要在配置文件添加配置
- 添加初始化和销毁方法:分为不实现接口和实现接口两种
关闭容器(了解即可,因为交给Tomcat容器管理):不关闭容器无法执行消耗方法,关闭方式分为直接使用
close
方法和先注册钩子再使用close
方法bean
的生命周期:- 初始化容器:
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set操作)
- 执行
bean
初始化方法
- 使用bean:
- 执行业务操作
- 关闭/销毁容器:
- 执行bean销毁方法
- 初始化容器:
4.DI相关内容
依赖注入的两种方式
主要掌握:
setter
注入- 构造器注入
- 两个方式的使用选择
代码参考Spring_05_di_set和Spring_06_di_constructor
setter
注入:引用类型:详情见代码
BookServiceImpl.java
和applicationContext.xml
基本数据类型:和引用类型的区别在于
applicationContext.xml
中将ref
改为value
<bean id="bookDao" class="com.psj.dao.impl.BookDaoImpl"><property name="connectionNum" value="100"/><property name="databaseName" value="mysql"/> </bean>
构造器注入:在实体类中添加有参构造器,主要修改在于
applicationContext.xml
引用类型:详情见代码中的
applicationContext.xml
,对于构造方法中形参名称和类型重复的问题也有说明基本数据类型:和引用类型的区别在于
applicationContext.xml
中将ref
改为value
使用选择:
- 强制依赖(指对象在创建的过程中必须要注入指定的参数)使用构造器进行,使用
setter
注入有概率不进行注入导致null对象出现 - 可选依赖(指对象在创建过程中注入的参数可有可无)使用
setter
注入进行,灵活性强 Spring
框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨- 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
- 如果受控对象没有提供setter方法就必须使用构造器注入,自己开发的模块推荐使用setter注入
- 强制依赖(指对象在创建的过程中必须要注入指定的参数)使用构造器进行,使用
自动装配
IOC
容器根据bean
所依赖的资源在容器中自动查找并注入到bean
中的过程称为自动装配主要掌握:
- 自动装配的方式
- 注意事项
代码参考Spring_07_di_autoware
自动装配方式:
<bean id="bookService" class="com.psj.service.impl.BookServiceImpl" autowire="xxx"/>
- 按类型(常用):
autowire="byType"
- 按名称:
autowire="byName"
,需要保证被依赖的bean
的id
名和类中setter
方法中把set
删除并将首字母大写后的名称一致 - 按构造方法
- 不启用自动装配
- 按类型(常用):
注意事项:
- 自动装配优先级低于
setter
注入与构造器注入,同时出现时自动装配配置失效 - 类中需要实现
setter
方法 - 只能对引用类型依赖注入,不能对基本数据类型操作
- 自动装配优先级低于
集合注入
前面完成的是引用类型和基本数据类型的注入,还有集合类型(既可装基本数据类型也可装引用数据类型)未说明
主要掌握:
- 不同集合类型的注入
代码参考Spring_08_di_collection
不同集合类型的注入:详情见
applicationContext.xml
property
标签表示setter
方式注入,构造方式注入constructor-arg
标签内部也可以写<array>、<list>、<set>、<map>、<props>
标签List
的底层也是通过数组实现的,所以<list>
和<array>
标签可混用- 集合中要添加引用类型,把
<value>
标签改成<ref>
标签即可
<property name="array"><array><ref bean="xxx"></array> </property>
参考
https://www.bilibili.com/video/BV1Fi4y1S7ix?p=1-16
SSM框架学习记录-Spring_day01相关推荐
- SSM框架学习文档以及SSM整合(附Github地址=含SSM学习时的实例代码)
SSM框架学习 软件架构: 基于流行SSM框架:Spring+SpringMVC+Mybatis 项目配置: 使用Maven进行项目jar导入 使用Git进行版本控制,并将每次编写的代码上传到Gi ...
- SSM框架学习总结第零篇--框架是什么
SSM框架系列文章: SSM框架学习总结第零篇–框架是什么 SSM框架学习总结第一篇–MyBatis SSM框架学习总结第二篇–Spring SSM框架学习总结第三篇–Spring MVC SSM框架 ...
- 【图解】SSM框架学习总结
SSM框架学习首先掌握SSM三层结构及配置 图1:Spring.SpringMVC.Mybatis结构图 图2:SSM三层结构Dao.service.controller图 图3:SSM配置说明图 图 ...
- SSM框架学习(1)CRM项目初期设计
1.web项目的开发:如何分析,设计,编码,测试. 2.crm(客户关系管理)项目的学习,编程思想和编程习惯的形成是非常重要的. 编程思想不对,功能的分析无法想出来,所以学好编程思想非常关键. 3.c ...
- SSM框架学习(一)————SSM框架简介
目录 一.SSM框架简介 1.1 Spring 1.2 SpringMVC 1.3 MyBatis 二.MVC模式 2.1 mvc模式 2.1.1 MVC应用举例 2.2 SSM和SSH在MVC模式上 ...
- SSM 框架学习(黑马程序员)
(Spring+SpringMVC+MyBatis) SSM框架教程 黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全套教程 01. Spring 简介 1.1 Spr ...
- SSM框架学习----Mybatis(2)
Mybatis框架学习--中 Mybatis框架学习----(2) 1. Mybatis的自定义分析 1. 第一步 2. 第二步 3. 第三步 4. 第四步 5. 第五步 2. Mybatis实现CR ...
- Scrapy框架学习记录
随着Python爬虫学习的深入,开始接触Scrapy框架 记录下两个参考教程: 官网教程:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutor ...
- SSM框架学习——Maven进阶学习
her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人! 博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正. 今天我们进入新的学习环节 ...
最新文章
- 《周志华机器学习详细公式推导版》发布,Datawhale开源项目pumpkin-book
- 《Haskell并行与并发编程》——第2章,第2.1节惰性求值和弱首范式
- wince mysql吗_wince的数据库操作
- python对话框机制_Chromium 新的弹窗机制以及 HTML 的 dialog 元素
- Django 学习第十一天——中间键和上下文处理器
- 【错误记录】Flutter 构建报错 ( Because xxx requires SDK version >=2.12.0-0 <3.0.0, versio | Dart SDK 版本低 )
- 我最近做产品的一些「感悟」
- 千万不要错过...超级搞笑
- jvm需要多长时间才能进行转义分析? 可能比您想象的要长。
- 关于tcp网络通讯的几个场景的小测试
- aut0cad2010卸载工具_win10系统cad卸载不干净怎么办?win10怎么把cad卸载干净
- 复现awvs——POODLE 攻击(带 CBC 密码套件的 SSLv3—CVE-2014-3566)
- mac nexus 资源下载及安装
- 巧用FC5的“添加/删除程序”(转)
- AH00526: Syntax error on line 534 of D:/Apache/Apache24/conf/httpd.conf: PHP
- 【LIDC-IDRI】 CT 肺结节 XML 标记特征良恶性标签PKL转储(一)
- Android R(11)文件读写适配
- 十、MYSQL数据库的条件查询
- cad在布局怎么调比例_在CAD布局中如何设置视口比例?
- scip指令集_明年1月实施!ECHA对输欧物品提出SCIP通报要求
热门文章
- 图像处理中像素和毫米的换算
- RGB彩色空间的不同转换公式 1
- 王者荣耀所有英雄皮肤爬取
- 此战成硕,我成功上岸西南交通大学了~~~
- Gitlab在线安装、离线安装、搭建、使用等详细介绍,不能再详细了……
- 修改计算机用户名bat,修改计算机名.bat
- 笔记本外接显示屏调节亮度
- 对于多组数据输入输出的基础题目
- 综述(三)无人驾驶中感知系统的工作流程及原理
- yaourt/yay 安装软件出现 parse “XXX“: first path segment in URL cannot contain colon 错误