框架概述

1.框架的概念

所谓的框架其实就是程序的架子。
把web开发中和业务无关的重复部分提取成通用的程序的架子,就是框架。

2.javaweb开发中的框架SSH

老三大框架:SSH
Struts2
Spring
Hibernate

新三大框架:SSM
SpringMVC
Spring
MyBatis

大家可以发现不管是老三大框架还是新三大框架,有一个框架是大家一直没有替换的,就是Spring框架,所以我们今天先来学习Spring框架。

Spring概述

1.Spring概述

Spring是Service(业务逻辑层)的框架。Spring可以整合很多其他技术协同工作。Spring核心主要是:
IOC(DI) - 控制反转(依赖注入)。
AOP - 面向切面编程。

2.下载使用Spring

a.提示

spring推荐使用maven方式使用spring包,因此虽然官方提供了spring离线包的下载方式,但下载过程较为繁琐。
在后续课程学习maven后我们将会使用maven加载Spring相关包, 此节仅供参考。

b.打开Spring官网:https://spring.io,点击PROJECTS

c.点击SPRING FRAMEWORK

d.点击GitHub图标

e.找到Access to Binaries,点击Spring Framework Artifacts

f.点击Spring Artifactory

g.点击libs-release-local

h.点击org/,点击springframework,点击spring


i.就可以选择你想要的版本进行下载


j.解压下载好的压缩包,其中包含着Spring的依赖包


以下的我们用4.3.25版本的jar包为例子

Spring IOC

1.SpringIOC概述

SpringIOC也叫做控制反转技术,简单来说就是将对象创建和生命周期管理的过程交给Spring来进行 处理。
SpringIOC配合接口技术可以在软件分层时将一些无法去除的耦合交由Spring容器管理,从而实现彻 底的解耦。

2.Spring入门案例

a.创建一个java项目

b.导入Spring相关开发包

创建lib文件夹
向其中导入相应jar

第一个是外部引入的jar包,后六个是spring官方jar包
文件已上传至https://pan.baidu.com/s/1VQSalDJ3d6JVWqSc9vObPg提取码:d0zg

c.编写Spring的核心配置文件

在src目录下创建applicationContext.xml的配置文件,文件名其实可以任意,但约定俗成都叫这个名字。
不会写也没关系

IDEA创建文件里,默认就有spring的配置文件

d.开发Person类,并配置到配置文件中

e.开发测试类

//1.初始化Spring容器
ApplicationContextcontext = newClassPathXmlApplicationContext("applicationContext.xml");
//2. 从 Spring 容 器 中 获 取
bean Personp=(Person)context.getBean("person");
p.eat();
p.say();

3.SpringIOC的原理

初始化Spring容器,此时会加载Spring的核心配置文件,解析其中的信息,发现了其中配置 标签,利用反射技术创建该bean的对象,并将创建出来的对象存储到Spring内置的Map中,键就是 指定的id,值就是当前创建出来的对象。之后通过容器调用getBean方法获取bean时,本质上就是在 用传入的id在Spring内部的Map中寻找指定的键值对,找到就返回值,找不到就抛出异常。

由此原理可以推测得到如下的结论:

i.默认情况下多次获取同一个id的bean获取到的将是同一个对象
ii.不可以在同一个Spring容器中配置多个id相同的bean
iii.可以在同一个Spring容器中配置多个class相同但id不同的bean,这些bean将会是不同的对象。

4.SpringIOC获取对象的方式

a.通过id获取

获取到唯一的则返回
获取不到则抛出异常不会
获取到多个

b.通过class获取

获取到唯一的则返回
获取不到则抛出异常
有可能匹配到多个,则抛出异常

5.Spring创建对象的方式

a.Spring默认通过反射机制创建对象

这种方式创建对象要求目标类必须有公有无参构造器。
如果没有公有无参构造器则可以通过工厂来创建对象。

b.静态工厂创建对象

当Spring无法直接通过反射方式创建一些bean时,可以为Spring配置静态工厂,让其可以通过 静态工厂来创建出bean。

i.开发静态工厂
package cn.xxxx.factory;import cn.xxxx.domain.Person;/**
*静态工厂
*构造器私有化,保证工厂只有一个
*提供静态的创建目标对象的方法,使用者直接通过类名调用此静态方法获取对象
*/
public class PersonStaticFactory { private PersonStaticFactory() {}public static Person getInstance(){ return new Person("zs");
}
}
ii.配置配置文件,通过静态工厂配置bean

<!--静态工厂创建bean-->
<bean id="person" class="cn.xxxx.factory.PersonStaticFactory" factory-method="getInstance"></bean>

c.实例工厂创建bean

i.创建工厂类
package cn.xxxx.factory;import cn.xxxx.domain.Person;/**
*Person类的实例工厂
*构造器不可以私有化,提供共有无参构造器
*提供普通方法来创建目标对象
*/ public class Person InstanceFactory{ public Person getInstance(){return newPerson("ls");
}
}
ii.配置配置文件,通过实例工厂配置bean

<bean id="personInstanceFactory" class="cn.xxxx.factory.PersonInstanceFactory"></bean>
<bean id="person" factory-bean="personInstanceFactory" factory-method="getInstance"></bean>

d.spring工厂创建bean

i.开发工厂类
package cn.xxxx.factory;import cn.xxxx.domain.Person;
import org.springframework.beans.factory.FactoryBean;/**
*Spring工厂
*必须实现FactoryBean的接口,并通过泛型指定要创建的对象类型
*/
public class PersonSpringFactory implements FactoryBean<Person>{/**
*获取目标对象
*/
@Override
public Person getObject() throws Exception{ return newPerson("ww");
}/**
*获取目标对象类型
*/
@Overridepublic Class<?> getObjectType(){return Person.class;
}/**
*是否以单例模式创建对象
*/
@Overridepublic boolean isSingleton(){return true;
}
}
ii.配置配置文件
<bean id="person" class="cn.xxxx.factory.PersonSpringFactory"></bean>

6.单例和多例

SpringIOC创建对象默认采用单例模式。

单例模式有单例模式的优点,可以减少创建的对象,节省内存节省创建对象的时间。
但单例模式在容器环境下只有一个对象,在多线程并发场景下有线程安全问题。
例如taobao中的用户登录user bean、购物车 cart bean、账户余额 money bean,都必须保证每个人(线程)各自用各自的,此时单例模式无法支持。

Spring同时支持多例模式。

只要在的scope属性进行配置就可以控制bean是单利还是多例

<!--
单例多例singleton
单例模式:
容器初始化时创建,存入容器内部map
之后无论获取多少次得到的都是同一个对象prototype
多例模式
容器初始化时不创建
每次用到重新创建一个新的对象,此对象不会存入容器内map管理,其生命周期和普通的对象一样
每次获取拿到的都是一个全新的对象
-->
<beanid="user"class="cn.xxxx.domain.User"scope="prototype"></bean>
单例

容器初始化创建
容器销毁时销毁
存储在容器内部的map中
每次获取都是同一个对象

多例

容器初始化时不创建,每次使用重新创建
容器不管理多例对象的销毁,能存活多久取决于作用域
不会存储在容器内部map中
每次得到的都是一个新的对象

7.懒加载模式

单例模式对象在容器初始化时创建。
而在开发的过程中大部分对象都是单例的。
一旦项目中配置了大量单例的bean,会在Spring容器初始化时同时创建大量bean并存储到内部map 管理,造成程序启动变慢、大量消耗内存的问题。
此时可以为bean配置懒加载,将单例对象创建的时机延后到第一次使用该bean时,解决此问题。


<beanid="stu"class="cn.xxxx.domain.Stu"lazy-init="true"></bean>

懒加载只是延后了创建的时间,创建的bean仍然是单例模式,只会创建一次,多次获取得到的将是 痛一个bean。
多例模式配置懒加载没有意义。
如果Spring配置文件中大部分的bean都要配置懒加载,则可以在中修改默认的懒加载配 置为true,则其中的不配置就默认开启懒加载机制

8.配置初始化和销毁方法

在springioc中,我们将对象创建和销毁的权利让渡给了Spring容器,此时如果某些对象需要在创建和 销毁时执行一些额外的初始化操作或善后操作,可以通过在bean中配置init-method和destory- method属性。


<beanid="jdbcUtils" class="cn.xxxx.utils.JDBCUtils" init-method="jdbcinit" destroy-method="jdbcdestory"></bean>

今天先聊到这里,我们下期见

                                                                         ------在下亦从文,弃武从文

SSM三大框架从0到1,无障碍学习,萌新可入《一》相关推荐

  1. SSM三大框架从0到1,无障碍学习,萌新可入《二》

    DI(依赖注入) 1.DI概念 DI即依赖注入,就是将SpringIOC创建的对象进行属性的设置. DI有两种方式: 设置器注入 构造器注入 2.设置器注入 利用javabean的set方法进行属性注 ...

  2. (Spring+SpringMVC+MyBatis)SSM三大框架整合教程

    目录 一.基本概念 1.Spring 2.SpringMVC 3.MyBatis 二.开发环境搭建 三.Maven Web项目创建 四.SSM整合 1.Maven引入需要的JAR包 2.Spring与 ...

  3. SSM三大框架+SpringMVC的工作原理及其流程

    SSM三大框架+SpringMVC的工作原理及其流程 一.SSM中各层作用及关系 1.持久层:DAO层(mapper层)(属于mybatis模块)     DAO层(Mapper层):主要负责与数据库 ...

  4. JavaEE ssm三大框架黑马视频

    链接:https://pan.baidu.com/s/1JysWR5eZ49cDRtrDIJqcBQ 密码:diyr ** 里面包含 ** spring .mybatis .springmvc以及这三 ...

  5. SSM三大框架超详细总结(适合你重新回顾)

    目录 1.1 概念 1.2 Mybatis优点 1.3 Mybatis架构 1.4 底层原理 1.5 Mybatis缓存 1.6 常见面试题 2.1 概念 2.2 Spring优点 2.3 Sprin ...

  6. SSM三大框架整合(Spring+SpringMVC+MyBatis)

    文章目录 SSM整合 一.导入依赖 1.1 Spring依赖 1.2 SpringMVC依赖 1.3 MyBatis依赖 二.配置文件 2.0 Web.xml 配置文件 2.1 Spring的配置文件 ...

  7. 通俗易懂-SSM三大框架整合案例(SpringMVC+Spring+Mybatis)

    前言: 学习B站UP狂神说视频笔记整理视频链接 相关代码已经上传至码云:码云链接 前期准备 项目介绍 demo项目是一个简单的图书管理系统,主要功能为表单数据的增删改查 Web端使用JSP+Boots ...

  8. SSM三大框架的运行流程、原理、核心技术详解!

    一.Spring部分 1.Spring的运行流程 第一步:加载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext(" ...

  9. SSM三大框架整合Springfox(Swagger2)详细解决方案

    由于项目中使用的是前后端分离,所以,频繁的需要进行数据的交互和接口的调用,所以需要api文档的使用,这样就更加的方便,于是就找到了swagger这个东东,还是很好用.下面介绍一下如何整合到spring ...

最新文章

  1. Java项目:医院管理系统(java+javaweb+jdbc+Mysql+lw)
  2. 机器学习中特征选择怎么做?这篇文章告诉你
  3. [日推荐]『保养汽车』爱车的专职管家
  4. Git简单基本操作指令集合
  5. Python应用02 Python服务器进化
  6. 全国计算机考试光盘,全国计算机一级模拟考试题(光盘).doc
  7. 前端学习(1401):多人管理21新增用户
  8. cydia源_Cydia常见错误提示(红字/黄字)
  9. Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务
  10. MySQL 5.7 解压版 安装教程(图文详细)[Windows](转载)
  11. 《Java编程思想》学习笔记(一)——再度理解OOP
  12. 453.最小移动次数使数组元素相等
  13. android开发学习——day3
  14. 【IT之路】LoadRunner系列-Loadrunner 11破解汉化
  15. win10专业版没有触摸板选项_win10鼠标光标不见了触摸板没反应
  16. python编码无法使用turtle库_使用Turtle库教Python
  17. 使用GDAL实现DEM的地貌晕渲图(三)
  18. QQ.COM二级域名大全 腾讯旗下产品大全
  19. AR软件开发一个要多少钱?分享AR内容制作市价
  20. 小鸟云服务器如何进行远程桌面连接?

热门文章

  1. 小白相机的视频生成方案
  2. PHP酒店管理系统源码(多酒店)+数据库,酒店管理系统APP+H5+小程序预订
  3. 用FCN来分类皮肤病(应用类型的项目)
  4. java int长度_java 中int 的范围
  5. 剑指Offer专项突破版(58)—— 日程表
  6. Unity快捷键详解
  7. 详解CentOS 7中RAID 6与RAID 10配置(理论+实践)
  8. 输入一个自然数判断他是几位数,并逆序输出C语言详解
  9. 华为注册鸿蒙商标的故事,华为注册“鸿蒙”商标:意在把传说化为现实奇迹
  10. retinanet 部署_RetinaNet: Focal loss在目标检测网络中的应用