对Spring容器框架的全面认识

Spring的简单介绍

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

所谓容器框架: JavaBean、IOC、AOP 三个重要概念

Spring的优点和缺点

优点:
1.解耦,简化开发
2.AOP编程的支持
3.声明式事务的支持
4.程序的测试(Spring对Junit4支持)
5.集成各种优秀框架
缺点: Spring依赖反射,反射影响性能

Spring的组成模块

Spring 框架至今已集成了 20 多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。
在这里插入图片描述

Spring Core核心类库,提供IOC服务
Spring Context提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等)
Spring AOPAOP服务
Spring DAO对JDBC的抽象,简化了数据访问异常的处理
Spring ORM对现有的ORM框架的支持
Spring Web提供了基本的面向Web的综合特性,例如多方文件上传
Spring MVC提供面向Web应用的Model-View-Controller实现

认识IOC

控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。
这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中
案例:实现Spring的IoC
IOC/DI
将以前由程序员实例化对象/赋值的工作交给了spring处理

认识IOP

面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。
AOP带来的好处:让我们可以 “专心做事!”
AOP中关键性概念:

  • 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出.

  • 目标(Target):被通知(被代理)的对象

  • 通知(Advice):在某个特定的连接点上执行的动作,同时Advice也是程序代码的具体实现,例如一个实现日志记录的代码(通知有些书上也称为处理)

  • 代理(Proxy):将通知应用到目标对象后创建的对象(代理=目标+通知),请注意:只有代理对象才有AOP功能,而AOP的代码是写在通知的方法里面的

  • 切入点(Pointcut):多个连接点的集合,定义了通知应该应用到那些连接点。
    (也将Pointcut理解成一个条件 ,此条件决定了容器在什么情况下将通知和目标组合成代理返回给外部程序)

  • 适配器(Advisor):适配器=通知(Advice)+切入点(Pointcut)

认识Bean

我个人的理解,觉得bean就相当于定义一个组件,这个组件是用于具体实现某个功能的。这里的所定义的bean就相当于给了你一个简洁方便的方法来调用这个组件实现你要完成的功能。
1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);
2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;
3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;(@Component , @Repository , @ Controller , @Service , @Configration)
4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了
5、我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean(注册)或者给出一个Bean(使用)

bean的生命周期

实例化 -> 属性赋值 -> 初始化 -> 销毁
在这里插入图片描述
详细请看:https://www.jianshu.com/p/1dec08d290c1.

bean的四种作用域

在这里插入图片描述
注意1:
singleton(单例模式)是系统默认值,使用 prototype(多例模式) 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。
注意2:
1、凡是子类及带属性、方法的类都注册Bean到Spring中,交给它管理;
2、@Bean 用在方法上,告诉Spring容器,你可以从下面这个方法中拿到一个Bean

bean的注入方式

(1)构造器注入:①通过index设置参数的位置;②通过type设置参数类型;

spring 自动装配 bean 有哪些方式?
(1)no:默认值,表示没有自动装配,应使用显式 bean 引用进行装配。
(2)byName:它根据 bean 的名称注入对象依赖项。
(3)byType:它根据类型注入对象依赖项。
(4)构造函数:通过构造函数来注入依赖项,需要设置大量的参数。
(5)autodetect:容器首先通过构造函数使用 autowired 装配,如果不能,则通过 byType 自动装配。

(2)注解方式注入
@Autowried:默认基于类型查找容器的的Bean进行注入(注入的Bean的实现类是唯一的)。可以标注在构造方法、set方法(属性)、字段
@Resource:默认是基于Bean的名称进行注入,如果查找的name不存在,则会根据类型进行查找

@Autowired和@Resource之间的区别:
@Autowired可用于:构造函数、成员变量、Setter方法
@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。

(3)Set方法注入
(4)静态工厂注入
(5)实例工厂

bean的使用方式

1、一类是使用Bean: 即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;
2、一类是注册Bean:@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

Spring的注解

这些注解都是将一个类生成Spring的Bean对象
@Respository :对应的是持久层即Dao层;其作用是直接和数据库交互,通常来说一个方法对应一条具体的Sql语句

@Service:对应的是服务层即Service层;其作用是对单条/多条Sql语句进行组合处理,当然如果简单的话就直接调用Dao层的某个方法了

@Controller:标注 web 控制器,接收用户请求,根据请求调用不同的Service取数据,并根据需求对数据进行组合、包装返回给前端

@Component:是通用标注(@Service和@Controller 与它相同),一般用于bean不知道拿哪个层的时候,更多对应的是一个组件的概念

Spring的设计模式

(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。(保证被创建一次,节省系统开销)
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被自动更新,如Spring中listener的实现–ApplicationListener。

Spring的事务实现方式

(1)声明式事务:声明式事务也有两种实现方式,基于 xml 配置文件的方式和注解方式(在类上添加 @Transaction 注解)。
(2)编码方式:提供编码的形式管理和维护事务。

Spring的事务隔离

spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:
(1)ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么;
(2)ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);
(3)ISOLATIONREADCOMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;
(4)ISOLATIONREPEATABLEREAD:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;
(5)ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
附:
脏读 : 表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
不可重复读 :是指在一个事务内,多次读同一数据。
幻读 : 指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。
发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

其他问题

如何在spring当中定义和配置一个JavaBean?

使用无参构造方法+set方法创建一个JavaBean

1、id:在容器中查找Bean的id(唯一、且不能以/开头)
2class:bean的完整类名
3、name:在容器中查找Bean的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格隔开)
	3.1 scope:(singleton|prototype)默认是singleton
	3.2 singleton(单例模式):在每个Spring IoC容器中一个bean定义对应一个对象实例
	3.3 prototype(多例模式):一个bean定义对应多个对象实例
4abstract:将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽象bean,非抽象类也可以定义成抽象bean
5、parent:指定一个父bean(必须要有继承关系才行)
6、init-method:指定bean的初始化方法
7、使用有参数构造方法创建javaBean:constructor-arg

spring 中的 bean 是线程安全的吗?

不是,spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。
实际上大部分时候 spring bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 bean 有状态的话(比如 view model 对象),
那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
有状态就是有数据存储功能
无状态就是不会保存数据

hibernate和Spring如何集成?

就是把hibernate的session工厂交给Spring去处理

struts2和Spring如何集成?

1.struts2-spring-plugin: 导入Spring和Struts2集成的插件
(目的:使Struts2在创建action的时候不会根据完整类名去反射,将action上面的class属性改为 Spring配置中的名字会让action到Spring的上下文去找,action然后交给Spring去创建,就完成了集成)
2.修改Struts2的配置文件,将action上面的class属性改为 Spring配置中的名字
3.配置web.xml
1


  1. 编写不易,如果有帮助到的话,可以关注,点赞和收藏哦~ ↩︎

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值