admin管理员组

文章数量:815885

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

框架概述

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官网:,点击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包
文件已上传至: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,无障碍学习,萌新可入《一》