Spring套餐——Spring框架

Spring框架

一、spring框架核心概念:
优点:
1)轻量级的IOC容器
IOC又叫控制反转,后来因为spring官方说IOC概念不好理解,所以改名为DI,也叫依赖注入
实现方式:
【1】、set方式注入
【2】、构造器注入(构造方法)
【3】、注解注入
当编写一个复杂的Java应用程序时,应用程序类应该尽量可能地独立于其他Java类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。依赖注入(或者有时被称为配线)有助于将这些类沾合在一起,并在同一时间让它保持独立,依赖注入实现的3种方式,(set方式注入、构造器注入、注解注入)

2)一至的事务管理
例子:在银行里取钱和存钱,要么两个都执行要么两个都不执行。
3)面向切面编程(AOP)

一个程序中跨越多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑,有各种各样常见的很好的关于方面的例子,比如日志记录、声明事物、安全性和缓存等等。
在OOP中模块化的关键单元是类,而在AOP中模块化的关键单元是方面。AOP帮助你将横切关注点从他们所影响的对象中分离出来,然而依赖注入帮助你的应用程序对象从彼此中分离出来spring框架的AOP模块提供了面向对象的程序设计实现,允许你定义拦截器方法和切入点,可以实现将应该被分开的代码干净的分开功能

ORM:
Jms:消息通知
Transactions:事物
websocket:套件字

容器:beans core context spel

Test:测试

Spring的体系结构:

1、核心容器:核心容器由核心,Bean上下文和表达式语言模块组成,
他们包括:
1、核心模块提供了框架的基本组成部分,包括IOC和依赖注入功能
2、Bean模块提供BeanFactory,他是一个工厂模式的复杂实现
3、上下文模块建立在由核心和Bean模块提供的坚实基础上,他是访问定义和配置的任何对象的媒介。ApplicationContext接口是上下文模块的重点
4、表达式语言模块在运行时提供了查询和操作一个对象图的强大的表达式语言
核心容器=核心+Bean+上下文+表达式语言
Container容器有两种方式:
BeanFactory(Bean工厂)、ApplicationContext(上下文应用)
2、数据库集成
1)JDBC:提供了数据库连接操作
2)ORM:提供了对象关系映射处理
3)事务:提供了编程式和声明式事务的管理
3、WEB
4)WEB模块提供了基本的面向web的集成功能,例如:多个文件上传的功能和使用servler监听器和面向wbe应用程序的上下文来初始化IOC容器
5)Web-MVC模型包含了spring的模型、视图控制器,实现了web应用。

Spring容器
基本介绍:spring容器是spring框架的核心,容器将创建对象,把它们连接在一起,配置它们,并管理它们的整个生命周期从创建到销毁。Spring容器使用依赖注入来管理组成一个应用程序的组件。通过阅读配置元数据提供的指令,容器知道对那个对象进行实例化,配置和组装。配置元数据可以通过xml,Java注解或Java代码来表示

类型:
SpringBeanFactory:

ApplicationContext context=new ClassPathXmlApplicationContext(“路径”);
ApplicationContext context=new FileSystemXmlApplicationContext(“详细路径”);
XmlBeanFactory bean=new XmlBeanFactory(new ClassPathResource(“路径”));

定义bean的属性以及作用域

1、定义bean的属性:
Class:这个属性是强制性的,并且制定用来创造bean的bean类
Name:这个属性指定唯一的bean标识符。在基于xml的配置元数据中,你可以使用ID或name属性来指定bean标识符。
Scope:这个属性指定由特定的bean定义创建的对象的作用域
Constructor-arg:注入依赖关系
Properties:

2、定义bean的作用域:
Singleton:该作用域将bean的定义的限制在每一个Spring IOC 容器中的一个单一实例(默认),单例只会产生同一个对象。
Prototype:该作用域将单一bean的定义限制在任意数量的对象实例。多例会给每个拿对象的类分配一个单独的对象,不管谁来拿都拿的对象不一样。
Session:
Request:

Bean的生命周期与继承

1、生命周期的概念:
当一个bean被实例化时,它可能需要执行一些初始化使他转换成可用状态,同样,当bean不在需要,并且从容器中移除时,可能需要做一些清除工作,这样状态转换的过程就是bean的生命周期,生命周期用代码体现的两种方式分别为代码方法实现和xml配置文件实现,由于配置文件实现方式更加灵活,所以我们更加采取配置文件

2、补充说明
定义一个bean时,如果用abstract=“true”属性的话则表明该bean自身不能实例化,仅仅只是作为一个纯粹的模板bean定义来使用的,充当子定义的父定义使用。

集合实现依赖注入


Spring自动装配
基本介绍:前面我们已经学习了通过元素来声明bean和xml配置文件中的和元素来注入bean,其实spring容器可以在不使用注入和元素的情况下自动配置协调的bean之间的关系,这有助于减少编写一个基于大的spring的应用程序的xml配置的数量。

模式:用于指定spring容器为来使用自动装配进行依赖注入,使用元素的autowirt属性为一个bean定义指定自动装配模式。
No:默认的设置,他意味着没有自动装配
Byname:由属性名自动装配,Spring容器看到在XML配置文件中bean的自动装配的属性设置为byName,然后尝试匹配,并且将他的属性与在配置文件中被定义为相同名称的beans的属性进行连接
Bytype:由属性数据类型自动装配。Spring容器看到在XML配置文件中bean的自动配置的属性设置为byType,然后如果他的类型匹配配置文件中的一个确切的bean名称,他将尝试匹配和连接属性的类型,如果存在不止一个这样的bean,则一个致命的异常将会被抛出
局限性:
1、重写的可能性:可以使用总是重写自动装配的和设置来指定依赖注入关系。
2、原始的数据类型:不能自动装配所谓的简单类型包括基本类型。
3、混乱的本质:自动装配不如显式装配精准,所以如果可能的话尽量使用显式装配

注解注入
概念:
@Required:
@Required()注解应用于bean属性的setter方法,它表明受影响的bean属性在配置时必须放在xml配置文件中,否则容器就会抛出一个BeanInitializationExceprion(bean初始化异常)异常

@Autowired:
@Autowired(自动装配)注解可以应用到bean属性的setter方法,非setter方法,构造函数和属性。
@Autowired注解可以在setter方法中被用于自动连接bean,就象@Autowired注解,容器,一个属性或任命名的可能带有多个参数的方法,当spring遇到一个在spring方法中使用的@Autowired注解,它会在方法中试图执行byType自动连接。

@Qualifier(限定):通过指定确切的将被连接的bean,@Autowired和@Qualifier注解可以用来删除混乱
可能会有这样一种情况,当你创建多个具有相同类型的bean时,并且想用一个属性只为它一个执行装配,在这种情况下,使用@Qualifier注解和@Autowired注解通过指定哪一个真正的bean将会被装配来消除混乱。

@Autowired和@Qualifier:

@Resource:
格式:在属性上@Resource(name=”a”)
这个解决写和不写没有很明显的区别,但是写了就更明显知道是怎么指定的在字段中或setter方法中使用@Resource注解,@Resource注解使用一个“name”属性,该属性以一个bean名称的形式被注入。

@Configuration和@Bean:
带有@Configuration的注解类表示这个类可以使用Spring IOC容器作为bean定义的来源,带有一个@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中bean。当@bean依赖对方式,只要有一个bean方法。

JSR-250Annotations:spring支持JSR-250的基础注解,其中包括@Resource,@PastConstruct和@PreDestroy注解

Spring事件

概念:
在我们之前的例子中,我们都是使用ApplicationContext,该容器负责管理bean的生命周期,其实,当容器加载管理的bean时会伴随着一系列的事件发生和处理,例如:启动,停止,监听等。

专业词汇:
contextStartedEvent:容器启动
conttextStoppedEvent:容器停止
ApplicationEvent:容器事件
ApplicationListener:容器事件监听

事件:

ContextRefreshedEvent:ApplixationContext被初始化或刷新时,该事件被发布,这也可以在ConfigurableApplicationContext接口这使用refresh()方法来发生。
ContextStartedEvent:当使用ConfigurableApplicationContext接口中的start()方法启动ApplicationContext时,该事件被发布,你可以调查你的数据库,或你可以在接受到这个事件后重启任何停止的应用程序。
ContextStoppdeEvent:当使用ConfigurableApplicationContext接口中的start()方法启动ApplicationContext时,发布这个事件。你可以在接受到这个事件后做必要的清除工作。
ContextClosedEvent:当使用ConfigurableApplicationContext接口中的close()方法关闭ApplicationContext时,该事件被发布,一个已关闭的上下文到生命周期末端,它不能被刷新或重启。
RequestHandledEvent:这是一个wed-specific事件,告诉所有bean HTTP请求已经被服务。

注意:spring的事件是单线程的,所以如果一个事件被发布直至所有接收者得到该消息,或者该进程被阻塞否则程序将不会停止

实现接口就要实现里的方法

Spring中的beanA

面向对象:是一种思想,直达编程。可以把一切看做对象。

面向切面(IOP)

概念:spring框架的一个关键组件是面向切面的编程框架。面向切面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。夸一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序业务逻辑。有各种各样的常见的很好的切面的例子,如日志记录、审计。声明式事务。安全性和缓存等。在OOP中,关键单元模块度是类,而在AOP中单元模块度是切面。依赖注入帮助你对应用

关键词汇
Aspect:一个模块具有一组提供横切需要的APIS。应用程序可以拥有任意数量的方面,这取决于需求。
Join point:在应用程序中它代表一个切入点。
Aduice:这是实际行动之前或之后执行的方法。
Pointcut:这是一组或多个连接点,通知该被执行。你可以使用表达式或模式指定切入点。
Target object:被一个或多个方面所通知的对象。这个对象永远是一个被代理对象,也称为通知对象。
Weaving:把方面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象。

通知类型:
前置通知:在一个方法执行之前,执行通知。
后置通知:在一个方法执行之后,不考虑其结果,执行通知。
返回后通知:在一个方法执行之后,只有方法成功完成时,才能执行通知。
抛出异常后通知:在一个方法执行之后,只有方法退出抛出异常时,才能执行通知。
环绕通知:在建议方法调用之前和之后,执行通知。

配置:

aop:config

<aop:aspect id=“aop1” ref=“b” >
<aop:pointcut expression=“execution(* com.zy.san.fs..(…))” id=“aa”/>
<aop:before method=“qianzhi” pointcut-ref=“aa”/>
</aop:aspect>
</aop:config>

注解:

aop:aspectj-autoproxy

@Aspect

@Pointcut(“execution(* com.zy.san.fs..(…))”)

@Before(“切入点方法()”)

@After(“切入点方法()”)

@AfterRerurning(pointcut=”切入点方法()” ,returning=”值”)

@AfterThrowing(pointcut=”切入点方法()”,throwing=”值”)

Spring是代理
设计模式:上下文、生产、MVC、工厂、适配器模式(可以选择实现方法)。
接口:
JVM:Java虚拟机
ASM:

概念:代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理访问目标对象。这样好处是可以在目标对象实现的基础上,增强额外的功能操作,(扩展目标对象的功能)。代理模式的关键点:代理对象与目标对象。
代理类型:
静态代理:是指程序运行前就已经存在了代理类的字节码文件,代理类和被代理类的关系在运行前就已经确定。
特点:
1、可以在不修改目标对象的功能前提下,对目标对象功能扩展。
2、因为代理对象需要与目标对象实现一样的接口。所以会有很多代理类(类太多)。
3、一旦接口增加方法,目标对象与代理对象都要维护(维护麻烦)。
4、一个静态代理类只能代理一个具体类。如果需要对实现了同一个接口的不同具体类作代理静态代理需要为每一个具体类创建相对应的代理类。

动态代理:动态代理类的字节码是在程序运行期间动态生成,所以不存在代理类的字节码文件。代理类和被代理类的关系是程序运行时确定的。
JDK从1.3开始引入动态代理。可通过java.lang.reflect.Proxy类的静态方法Proxy.newProxylnstance动态创建代理类和实例。并且由它动态创建出来的代理类都是Proxy类的子类。

JDK:
Cglib:

代理行为:代理类往往会代理对象业务逻辑前后增加一些功能性的行为,如使用事务或打印日志。把这些行为称之为代理行为。
Spring AOP底层实现原理-代理模式:
Spring的AOP有JDK动态代理和cglib两种实现方式。JDK动态代理要求被实现接口;cglib通过动态继承实现,因此不能代理被final修饰的类;JDK动态代理生成代理对象速度比cglib快;cglib生成的代理对象比JDK动态代理生成的代理对象执行效率高。

JDK动态代理与cglib对比:
1、字节码创建方式:JDK动态代理通过JVM实现代理类字节码的创建,cglib通过ASM创建字节码
2、对被代理对象的要求:JDK动态代理要求被代理对象实现接口,cglib要求被代理对象未被final修饰
3、代理对象创建速度:JDK动态代理创建代理对象速度比cglib快
4、代理对象执行速度:cglib代理对象执行速度比JDK动态代理快

一致事务(数据库)
Manager

概念:事务(Transaction)是访问并可能更新数据库中各种数据的一个程序执行单元(unit)。这些操作应该要么完整地执行,要么完全不执行。以确定数据完整性和一致性。
事务管理的特点:
1、原子性(atom):事务应该当作一个单独单元的操作,这意味着整个序列操作要么成功要么失败。
2、一致性(consistency):这表示数据库的引用完整性的一致性,如表中唯一的主键等。
3、隔离性(isolation):可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。
4、持久性(durable):一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。
ACID

使用SQL发布事务到数据库系统的过程:
1、使用begin transaction命令开始事务。
2、使用SQL查询语句执行各种删除、更新或插入操作。
3、如果所有的操作都成功,则执行提交操作,否则回滚所有操作。

Spring事务管理类型:
1、按作用范围分为局部事务和全局事务
①局部事务
1)局部事务是特定于一个单一的事务资源,如一个JDBC连接
2)局部事务管理在一个集中的计算机环境中是有用的,该计算环境中应用程序组件和资源位于一个单位点,而事务管理只涉及到一个运行在一个单一机器中的本地数据管理器。局部事务跟容易实现。
②全局事务
1)全局事务可以跨多个事务资源,如在一个分布式系统中的事务。
2)全局事务管理需要在分布式计算环境中,所有的资源都分布在多个系统中。在这种情况下事务管理需要同时在局部和全局范围内进行。
3)分布式或全局事务跨多个系统执行,它的执行需要全局事务管理系统和所有相关系统的局部数据管理人员之间的协调。
2、按实现方式分为声明式事务和编程式事务
①编程式事务
1)灵活但难维护
②声明式事务
1)从业务代码中分离出事务,仅仅关注xml配置来管理事务
③补充
1)声明式事务管理比编程式事务管理更可取,尽管它不如编程式事务管理灵活,声明式事务管理可以使用
2)AOP方法进行模块化。Spring支持使用SpringAOP框架的声明式事务管理。

并发下事务可能会产生的问题:
1、脏读
①所谓脏读,就是指事务A读到了事务B还没有提交的数据,比如银行取钱,事务A开启事务,此时切换到事务B,事务B开启事务–》去走100元,此时切换到事务A,事务A读取的肯定是数据库里面的原始数据,因为事务B取走了100块钱,并没有提交,数据库里面的账务余额肯定还是原始余额,这就是脏读。
2、不可重复读
①是指在一个事务里面读取了两次某个数据,读出来的数据不一致。还是以银行取钱为例,事务A开启事务–》查出银行卡余额为1000元,此时切换到事务B事务B开启事务—>事务B取走100元–提交,数据库里面余额变为900元,此时切换回事务A,事务A再查一次出账户余额为900元,这样对事务A而言,在同一个事务内两次读取账户余额数据不一致,这就是不可重复读。
3、幻读
①是指一个事务里面的操作中发现了未被操作的数据。比如:学生信息,事务A开启事务–》修改所有学生当天签到情况为false,此时切换到事务B,事务B开启事务–》事务B插入了一条学生数据,此时切换回事务A,事务A提交的时候发现了一条自己没有修改过的数据,这就是幻读,就好像发生了幻觉一样。幻读出现的前提是并发的事务中有事务发生了插入、删除操作。

事务的隔离级别:
1、概念
①事务隔离级别,就是为了解决并发情况下产生的脏读、幻读、不可重复读的问题而诞生的。为什么要有事务隔离级别?因为事务隔离级别越高,在并发下会产生的问题越少,但是同时付出的性能消耗也越大,因此很多时候必须在并发和性能之间做一个权衡。所以设立了几种事务隔离级别,以便让不同的项目可以可以根据自己项目的并发情况选择合适的事务隔离级别,对于在事务隔离级别之外会产生的并的问题,在代码中做补偿。
2、5级
①TransactionDefinition.ISOLATION_DEFAULT:这是默认的隔离级别
②TransactionDefinition.ISOLATION_READ_COMMITTED:表明能够阻止误读;可以发生不可重复读和虚读。
③TransactionDefinition.ISOLATION_READ_UNCOMMTTED:表明可以发生误读、不可重复读和虚读。
④TransactionDefinition.ISOLATION_REPEATABLE_READ:表明能够阻止误读和不可重复读;可以发生虚读。
⑤TransactionDefinition.ISOLATION_SERIALIZABLE:表明能够阻止误读、不可重复读和虚读。
3、补充
①不是事务隔离级别设置得越高越好,事务隔离级别设置得越高,意味着势必要花手段去加锁用以保证事务的正确性,那么效率就要降低,因此实际开发中往往要在效率和并发正确性之间一个取舍,一般情况下会设置为READ_COMMITTED,此时避免了脏读,并发性也还不错。

事务的传播行为
1、事务的传播行为规定了事务方法和事务方法发生嵌套调用时事务如何进行传播
2、8种类型
①TransactionDefinition.PROPAGATION_MANDATORY:支撑当前事务;如果不存在当前事务,则抛出一个异常。
②TransactionDefinition.PROPAGATION_NESTED:如果存在当前事务,则在一个嵌套的事务中执行。
③TransactionDefinition.PROPAGATION_NEVER:不支持当前事务;如果存在当前事务,则抛出一个异常。
④TransactionDefinition.PROPAGATION_NOT_SUPPORTED:不支持当前事务;而总是执行非事务性。
⑤TransactionDefinition.PROPAGATION_REQUIRED:支持当前事务;如果不存在事务则创建一个新的事务。
⑥TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新事务,如果存在一个事务,则把当前事务挂起。
⑦TransactionDefinition.PROPAGATION_SUPPORTS:支持当前事务;如果不存在,则执行非事务性。
⑧TransactionDefinition.TIMEOUT_DEFAULT:使用默认超时的底层事务系统,或者如果不支持超时则没有。

复习:

一、Spring
①Spring框架核心概念
②spring容器
③定义bean的属性以及作用域
④Spring的自动装配
⑤Bean的生命周期依赖注入和继承
⑥注解注入
⑦Spring事件处理
⑧面向切面
⑨一致事务
⑩代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值