Spring框架基础知识
官网 : https://docs.spring.io/spring/docs/4.3.25.RELEASE/spring-framework-reference/htmlsingle
Spring框架介绍:
简介:
Spring是一个简单、开源的开源框架,可以简化企业级开发!
Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小。
Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来6创建性能好、易于测试、可重用的代码。
目的:半成品,简化开发。
补充:OOP和AOP概念
OOP:面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。
模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它
所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。
AOP:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一、
维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种 衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
1、Spring在软件三层架构中的位置
1.软件的三层架构目的:是为了解耦合。
2.三层架构:web层(控制层)--->Service层(业务逻辑)--->dao层(持久化层)
3.各层功能:
web层(Servlet):1.接收浏览器端的请求。
2.处理请求
3.响应数据
Service层:主要进行业务逻辑处理
如:事务、分页、
dao层:和数据库打交道
Spring框架不属于三层中的任意一层。它是一栈式的软件开发框架,是跨三层。
2、Spring重要知识点梳理
3、spring的使用步骤
-
3.1、导入jar包
3.2、在src目录下创建spring的配置文件【beans.xml 或者 applicationContext.xml】
3.3、创建一个类
注意:要提供setter、getter方法
3.4、在spring的配置文件中配置该类对象
3. 5、写测试代码
3.6、从spring的容器中【配置文件】获取这个类对象
4、Spring的IOC:
IOC: Inverse Of Controller:、反转控制
指的是:将bean对象的创建和bean对象关联关系的维护给反转了,由原来我们自己new一个对象,自己维护bean对象之间的关联关系,反转给spring框架 来帮我们创建对象,以及维护对象之间的关联关系。
IOC解决的问题:上层建筑严重依赖下层建筑的问题
5、获取容器的三种方式:
![在这里插入片描述](https://img-blog.csdnimg.cn/20190920171526228.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk2OTY3OQ==,size_16,color_FFFFFF,t_70
6、从容器中获取bean对象的两种方式及其区别:
* 1.通过字节码方式
* 2.通过id或name值的方式
区别:
1.传递的参数不同,一个是传递字节码,另一个是传递的字符串类型的id或者name值
2.返回值不同, 一个是:字节码类型的对象,另一个是:Object
3.如果需要传递字节码,要求容器中必须有该字节码类型的唯一bean对象
7、bean标签: 每一个bean标签都对应一个类对象
class属性:指定是哪个类的对象,class属性指定类的全类名
id属性: 表示该bean对象在容器中的唯一标识符[identifier],该值必须是唯一的
name属性:表示该bean对象在容器中的名字,该值也是唯一的
内部bean和外部bean
外部bean:值在beans标签内的bean对象都称为外部bean。外部bean可以被任意bean对象引用
外部bean代码:
结果:
内部bean::值在bean标签的某个属性内部定义的bean对象,称之为内部bean。内部bean只能被对象的某个属性引用。
错误代码演示
8、scope属性:作用范围
scope可以指定当前类对象是单例的还是多例的
prototype:多例的,对象是在我们从容器中获取对象的时候才被创建
singleton:单例,默认值,在加载容器对象的时候创建的对象
request:每一次请求,都会创建一个bean对象
session:每一次会话,都会创建一个bean对象
9、bean的生命周期
指对象从创建到销毁执行过程,Bean标签的init-method、destroy-method属性来指定
init-method:配置一个方法作为生命周期初始化方法,Spring会在对象创建之后立即调用
destroy-method:配置一个方法作为生命周期的销毁方法,Spring 容器在关闭 并销毁所有容器中的对象之前调用
10、Spring IOC 图解
代码展示
11、Bean对象的创建时机、单例、无参构造器
创建时机:默认是在加载spring容器的时候就会创建容器中的bean对象
1.bean对象的创建时机:在容器加载时,按照xml中bean从上到下的顺序创建的
2.底层原理:反射+xml文件的解析
3.容器中对象默认的是单例模式
单例:spring容器中的对象默认都是单例的
无参构造器:spring容器是通过调用反射机制来创建bean对象的
12、IoC是什么
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
用图例说明一下,传统程序设计如图,都是主动去创建相关对象然后再组合起来:
当有了IOC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图
13、IoC和DI
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:
●谁依赖于谁:当然是应用程序依赖于IoC容器;
●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
14、分模块配置
通过import标签导入其它配置文件信息
15、如何在单例bean中注入一个多例bean
如果我们需要给一个单例beanA注入一个多例beanB时 (**多例注入单例是没有问题的**),
仅仅通过配置Spring是无法帮我们的单例beanA注入一个多例beanB的,即无法让我们每次使
用beanB时都使用的是一个全新的beanB。因为beanA只初始化一次,相对应的Spring只会给
beanA注入一个beanB。解决办法是给beanA注入一个BeanFactory,这样我们就可以在每次需
要使用beanB时都从BeanFactory中获取一个新的beanB。
16、实现自定义的IOC容器:
参考网址:https://www.cnblogs.com/yueyingdiaoling/p/6651416.html
或者参考如下代码:
public class ClassPathXmlApplicationContext implements ApplicationContext {
Map<String,Object> map = new HashMap<String,Object>();
public ClassPathXmlApplicationContext(String filename){
// xml解析器
SAXReader sr = new SAXReader();
try {
//构建一个直接通向配置文件的输入流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filename);
//将输入流转换为文档对象模型
Document doc = sr.read(inputStream);
//获取根元素
Element root = doc.getRootElement();
//遍历子元素
List<Element> beans = root.elements("bean");
for(Element bean:beans){
String key = bean.attributeValue("name");
String value = bean.attributeValue("class");
Class<?> myclass = Class.forName(value);
//当前对象
Object obj = myclass.newInstance();
map.put(key, obj);
List<Element> elements = bean.elements("property");
if(elements.size()>0){
for(Element pro: elements){
String av = pro.attributeValue("name");//dao--->setDao
//方法名
String methodName="set"+(av.charAt(0)+"").toUpperCase()+av.substring(1,av.length());
//方法参数
String refvalue = pro.attributeValue("ref");
Object refobj = map.get(refvalue);
//根据方法名获取方法对象
Method method = myclass.getMethod(methodName,refobj.getClass().getInterfaces()[0]);
method.invoke(obj, refobj);
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Object getBean(String beanName){
return map.get(beanName);
}
}
17、value与< value >注入方式的区别
xml的预定义实体引用
例:
三种依赖注入赋值方式
3. p命名空间注入
引入p命名空间
xmlns:p=" http://www. spr ingframework. org/ schema/p'”中
<bean id=" course'
class=" org. lanqiao. entity. Course"”p: courseHour=" 300”p: courseName=" hadoop" p:teacher="teacher "></bean>
简单类型:
p:属性名="属性值”
引用类型(除了String外) :
p:属性名-ref="引用的id”
注意多个p赋值的时候要有空格。