Spring

Spring

在这里插入图片描述

  • Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理
    bean 的方式,组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是
    BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转
    (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如
    JNDI、EJB、电子邮件、国际化、校验和调度功能。

  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring
    框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring
    的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

  • Spring DAO:JDBC DAO
    抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring
    DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括
    JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring
    框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC
    框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

  • Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定
    J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或
    EJB)、独立应用程序、测试环境之间重用。

Ioc: 控制反转,把创建对象的过程交给Spring进行管理 :底层原理:xml 解析、工厂模式、 反射(Class.forName)
Aop: 面向切面,不修改源代码进行功能的增强

1、向Spring容器提供元数据的三种方式:

1)XML配置文件 2)基于注解配置 3) 基于java的配置

2、用构造函数依赖注入时,Spring保证一个对象所有的依赖的对象先实例化后,才实例化这个对象。

使用 set 方法依赖注入时,Spring 首先实例化对象,然后才实例化所有依赖的对象,
当设值注入与构造注入同时存在时,先执行设值注入,在执行构造注入。
设值注入
不需要显示地调用set方法,会根据xml的相关配置自动进行调用,利用属性或成员变量的set方法进行注入。

<bean id="beanA" class="com.daley.serviceImple">
			<property name="B" ref="beanB"/>
		</bean>
		<bean id="beanB" class="com.daley.service"/>

其中property里面的name 是需要注入参数的成员变量的名称,ref 是注入参数引入bean 的名称
如上例: beanA中有一个成员变量名为B,参数类型为beanB,spring的IoC容器会自动的调用beanA 中的set 方法赋值。
构造注入
在spring的Ioc 容器调用接口的构造方法去创建实例的时候,构造器会自动给成员变量赋值,构造方法中的参数名和成员变量名必须一致。

<bean id="beanA" class="com.daley.serviceImple">
	<constructor-arg name="B" ref="beanB"/>
</bean>
<bean id="beanB" class="com.daley.service"/>

`

3、在Spring 提供Ioc容器实现的两种方式

BeanFactory 、 ApplicationContext
BeanFactory 和 ApplicationContext 的区别 : BeanFactory 采用了工厂设计模式, 负责读取bean 配合文档, 管理bean的加载, 实例化, 维护bean 之间的依赖关系 ,负责bean 的声明周期。 || Ioc容器基本实现,是Spring 内部的使用接口,不提供开发人员进行使用(加载配置时候不会创建对象,在获取对象(使用)才去创建对象
ApplicationContext 除了提供上述BeanFactory 所提供的功能之外,还提供了更完整的框架功能 : 国际化支持aop、事务等。|| BeanFactory 接口的子接口,提供更多更强大的功能, 一般由开发人员使用(加载配置文件时候就会把配置文件对象进行创建
BeanFactory 在解析配置文件时并不会初始化对象,只有在使用对象getBean () 才会对该对象进行初始化, 而ApplicationContext 在解析配置文件时对配置文件中的所有对象都初始化了,getBean()方法只是获取对象的过程(prototype)

3.1 FactoryBean

Bean作用域
  • 在 Spring 里面,默认情况下, bean 是单实例对象
  • 如何设置单实例还是多实例
    (1)在 spring 配置文件 bean 标签里面有属性( scope)用于设置单实例还是多实例
    (2) scope 属性值:第一个值 默认值, singleton,表示是单实例对象;第二个值 prototype,表示是多实例对象
  • singleton 单实例 和 prototype 区别
    (1) singleton 单实例, prototype 多实例
    (2)设置scope 值是 singleton 时候, 加载spring 配置文件时就会创建单实例对象,设置scope值是prototype时,不是在加载spring配置文件时候创建对象,在调用getBean 方法的时候创建多实例对象。
bean生命周期

1、 通过构造器创建bean 实例(无参数构造)
2、 为bean 的属性设置值和对其他bean 引用(调用set 方法)
3、调用bean 的初始化的方法(需要进行配置初始化的方法)
4、bean 可以使用了(对象获取到了)
5、当容器关闭时候,调用bean 的 销毁方法(需要进行配置销毁的方法)

3.1、常用的ApplicationContext 容器

1、 ClassPathXmlApplicationContext:从ClassPath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得
2、FileSystemXmlApplicationContext:由文件系统中的XML配置文件读取上下文
3、XmlWebApplicationContext: 由Web应用的XML文件读取上下文。

4、SpringMvc 配置文件一般都是在web.xml 里面指定位置的。

springmvc的配置文件有默认位置。因此存在两种配置文件:1) 采用指定文件配置方式,即在web.xml 配置文件中指定springmvc 配置文件的位置 2) 采用默认位置配置方式。系统默认名字springDispatcherServlet-servlet.xml 在默认路径WEB-INF 下。
spring-servlet.xml 的配置 :设置自动注入bean 的扫描范围(mvc 只扫描controller)、 文件上传功能、实现用户所选主体、请求拦截、异常映射、默认异常处理、视图解析器

https://www.cnblogs.com/alice-cj/p/10424049.html

5、 Spring 模块依赖关系

请添加图片描述
Spring 的核心模块功能。基本的学习顺序为: spring-core 入手 、 其次是 spring-beans(ioc) 和 spring-aop ,随后是spring- context, 在其次的spring-tx(事务) 和 spring-orm(整合第三方)

https://blog.csdn.net/BushQiang/article/details/79858010

6、Mybatis 的工作原理

  1. 读取MyBatis 配置文件: mybatis-config.xml 为Mybatis 的全局配置文件,配置了Mybatis 的运行环境等信息, 例如数据库的连接
  2. 加载映射文件。映射文件即SQL 映射文件,该文件配置了操作数据库的SQL语句,需要在Mybatis 配置文件mybatis-config,xml 中加载。mybatis-config,xml文件可以加载多个映射文件,每个文件对应数据库中的一张表
  3. 构建会话工厂:通过mybatis的环境等配置信息构建会话工厂SqlSessionFactory
  4. 创建会话对象:由会话对象创建SqlSession 对象,该对象中包含了执行SQL 语句的所有方法
  5. Executor执行器: Mybatis 底层定义了一个Executor 接口来操作数据库,它将根据SqlSession 传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
  6. MappedStatement 对象:将Executor接口执行方法中有一个MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL 语句的id、 参数信息。
  7. 输入参数映射: 输入参数类型可以是Map、List 等集合类型,也可以是基本数据类型和POJO 类型。输入参数映射过程类似于JDBC 对 preparedStatement 对象设置参数的过程。
  8. 输出结果映射:输出结果可以是Map、List 等集合类型,也可以是基本数据类型和POKO类型。输出结果映射过程类似于JDBC 对结果集的解析过程
    请添加图片描述
    Executor

7、springmvc 页面跳转默认使用的是转发

1)转发使用的是getRequestDispatcher方式;重定向使用的是sendRedirect
2) 转发:浏览器URL的地址不变。 重定向: 浏览器URL的地址栏改变
3) 转发是服务器行为, 重定向是客户端行为
4) 转发是浏览器只做了依次访问请求。重定向是浏览器至少做了两次的访问请求
5) 转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间的传输的信息会丢失(request范围)

**转发和重定向的选择**

1、重定向的速度比较慢,因为浏览器还得发出一个新的请求,如果在使用转发和重定向都无所谓的时候建议使用转发
2、 因为转发只能访问当前WEB应用程序,所以在不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的信息,这个时候就只能使用重定向

8、Spring Aop

8.1代理模式

代理模式是经典的设计模式之一。 java中静态代理、JDK动态代理、CGLib 动态代理的方式。静态代理是指代理类在编译期就存在的,相反动态代理则是在程序的运行器动态生成的。

https://www.cnblogs.com/teach/p/10763845.html

静态代理: 自定义一个公共的接口
JDK 动态代理: 接口 InvocationHandler
实现其中的invoke 方法,此方法通过反射的方式调用被代理类的方法,可以在方法执行前或后进行别的处理。
CDLib 动态代理: 一个第三方实现的动态代理类库,不要求被代理类必须实现接口,它采用的是继承被代理类,使用其子类的方法,弥补了被代理类没有接口的不足。‘ 使用CGLib 代理需要实现其MethodInterceptor 接口
cglib库的Enhancer在Spring AOP中作为一种生成代理的方式被广泛使用

8.2 Aspect

Aspect 由pointCut 和 Advice 组成

8.3 Advice

  • Before: Advice 在 JoinPoint 方法之前执行,并使用 @Before 注解标记进行配置。
  • After Returning: Advice 在连接点方法正常执行后执行,并使用 @AfterReturning 注解标记进行配置
  • After Throwing: Advice 仅在 JoinPoint 方法通过抛出异常退出并使用 @AfterThrowing 注解标记配置时执行
  • After Finally: Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用 @After 注解标记进行配置。
  • Around:Advice 在连接点之前和之后执行,并使用 @Around 注解标记进行配置。

9、Mybatis 中 #{} 与 ${} 有什么区别?

1)#{} 有预编译效果,而${}则没有
2 ) #{} 会自动为值加上单引号, ${} 保持原值状态。
#{ } 动态解析的时候,会解析成一个参数标记符 , ${ } 在动态解析的时候,会将我们传入的参数填充到我们的语句中。 ${ } 变量的替换阶段是在动态SQL 解析阶段, 而 #{ }变量的替换是在DBMS(数据库管理系统) ,同时可以很大程度上防止sql 注入。

10、 Spring中Ioc

控制反转是指在应用程序中对象的创建、销毁等不再由程序本身的编码实现,而是由外部的Spring容器在程序运行时,根据需要注入到程序中,也就是对象的生命周期不是由程序本身来决定的,而是由容器来控制。 这种控制权转移所带来的好处就是降低对象之间的依赖关系,即解耦。

11、 Spring 注解

	https://blog.csdn.net/weixin_39805338/article/details/80770472

12、 Spring Transaction

12.1 事务

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。

12.2 事务的ACID

1、原子性
2、一致性
3、隔离性
4、持久性

12、反射

什么是类的反射
通过类说明可以得到类的父类、实现的接口、内部类、构造函数、方法、属性并可以根据构造器实例化一个对象,唤起一个方法,取属性值,改属性值。

					Class cls=类.class;

                    Class cls=对象.getClass();

                    Class.forName("类路径");

如何得到一个方法并唤起它?

					Class cls=类.class;

                    Constructor cons=cls.getConstructor(new Class[]{String.class});

                    Object obj=cons.newInstance(new Object[]{"aaa"});

                    Method method=cls.getMethod("方法名",new Class[]{String.class,Integer.class});

                    method.invoke(obj,new Object[]{"aa",new Integer(1)}); 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值