框架概述
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");
}
/**
*获取目标对象类型
*/
@Override
public Class<?> getObjectType(){
return Person.class;
}
/**
*是否以单例模式创建对象
*/
@Override
public 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>
今天先聊到这里,我们下期见
------在下亦从文,弃武从文