目录
Spring概念
理念
使现有技术更加实用 , 是一个基石可以和其他的框架无缝整合
优点
1.Spring是一个开源免费的框架 , 容器
2.Spring是一个轻量级的框架 , 非侵入式的 .
3.控制反转 IoC , 面向切面 Aop
4.对事物的支持 , 对框架的支持
总结一句话:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
七大模块
1.Core:核心容器(基本功能)
2.Context:上下文
3.AOP:面向切面
4.DAO:数据库操作
5.ORM:数据库集成模块
6.Web
7.MVC
IOC
控制反转,是一种设计思想.控制反转是一种通过描述并通过第三方去生产或获取特定对象的方式。传统的开发方式,通过new关键字来初始化一个对象进来;ioc思想是通过容器来实例化对象。我们需要哪个对象,直接从ioc容器里面取出;把对象创建的权利交给了ioc容器
好处
1.资源集中管理,实现资源的可配置和易管理
2.降低了资源双方的依赖程度(耦合度)
DI
依赖注入,由容器动态的将某个依赖关系注入到组件之中,是实现IOC的一种方式
实现方式
1.构造方法注入:
1.使用无参构造创建对象
<bean id="user" class="nuc.ss.pojo.User">
<property name="name" value="狂神"/>
</bean>
2.使用有参构造创建对象
1.下标赋值
<bean id="user" class="nuc.ss.pojo.User">
<constructor-arg index="0" value="狂神说Java"/>
</bean>
2.类型
<!--有参构造器2,类型,但同类型只能一个,不建议使用-->
<bean id="user" class="nuc.ss.pojo.User">
<constructor-arg type="java.lang.String" value="狂神"/>
</bean>
3.参数名
<!--有参构造器3,参数名-->
<bean id="user" class="nuc.ss.pojo.User">
<constructor-arg name="name" value="狂神"/>
</bean>
总结:在配置文件加载的时候。其中管理的对象都已经初始化了!
2.setter注入(重点):
依赖注入:
依赖:指Bean对象的创建依赖于容器
注入:指Bean对象由容器来设置和装配
复杂类型 Address.java
真实测试对象 Student.java
beans.xml
测试类
3.注解注入
我们可以使用p命令空间和c命令空间进行注入
P(属性: properties)命名空间注入即类似于set注入
C(构造: Constructor)命名空间注入即类似于有参构造器注入
使用
注意点:
1.p命名和c命名空间不能直接使用,需要引入xml约束!
xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"
2.有参构造器注入与set注入不能同时用于同一个实体类。因为实体类中有有参构造器后只能使用有参构造器注入,不能使用set注入
Bean
在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean
作用域
- 单例模式(Spring默认机制)
<bean id="user" class="nuc.ss.pojo.User" scope="singleton"/>
2.原型模式:每次从容器中get的时候,都会产生一个现对象!
<bean id="user" class="nuc.ss.pojo.User" scope="prototype"/>
3.其余的request、session、application这些个只能在web开发中使用到
自动装配
自动装配是Spring满足bean依赖的一种方式
Spring会在上下文自动寻找,并自动给bean装配属性!
使用 元素的 autowire 属性为一个 bean 定义指定自动装配模式
好处:
自动装配有助于减少甚至消除配置<property>元素和<constructor-arg>,减少XML的配置数量,当然不用写XML文件,我们自然要轻松地多。
自动装配模式
使用:
根据id/name自动装配
byName:会自动在容器上下文中套接,和自己对象的set方法后面的值相对应的bean id
测试:
根据type自动装配
与id/name自动装配相比,只是autowire参数不同
byType:会自动在容器上下文中套接,和自己对象属性类型相同的bean id
根据构造参数自动装配
测试:
人工指定
测试:
代理模式
代理模式(Proxy)是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,,即扩展目标对象的功能.
静态代理
接口
真实角色
代理角色
静态代理模式的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
缺点:
- 一个真实角色就会产生一个代理角色;
- 代码量会翻倍-开发效率会变低
jdk动态代理
特点:
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理
接口
真实角色
代理角色(代理类)与客户端
动态代理的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就交给代理角色!实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理类可以代理多个类,只要是实现了同一个接口即可【核心】
Cglib动态代理
Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。
代理角色(代理类)与客户端
三者特点
1.静态代理,要把被代理的对象写在类里面,只能处理一个类,执行效率高,代码的耦合度很高,复用性很差。
2.JDK 动态代理,是代理类要实现 InvocationHandler 接口,接口里面有个(method.invoke(对象,参数) 方法,它是利用反射执行被代理对象的方法;Java 动态代理通过 Proxy.newProxyInstance() 方法动态的获得代理对象,这个方法有三个参数:(类加载器、接口,InvocationHandler 接口的子类实例);其中有个参数是接口,也就是说,Java 动态代理只能代理实现了接口的类,被代理的类如果没有实现任何接口,则不能实现 JDK 动态代理。
3.Cglib 动态代理,和 JDK 动态代理通过接口实现不同, Cglib 动态代理通过继承实现,通过生成子类字节码,重写被代理类的方法,在重写的方法中增强功能;因为 Cglib 动态代理要继承被代理的类,所以,被 final 修饰的类或方法不能实现 Cglib 动态代理。
AOP
AOP:面向切面编程,是一种编程思想
概述
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
实现方式
方式一:使用Spring的API接口【主要SpringAPI接口实现】
首先编写我们的业务接口和实现类
写我们的增强类 , 我们编写两个 , 一个前置增强 一个后置增强
在spring的文件中注册 , 并实现aop切入实现 , 注意导入约束 .
测试
方式二:自定义实现
目标业务类不变依旧是userServiceImpl
写我们自己的一个切入类
去spring中配置
测试
方式三:使用注解实现!
编写一个注解实现的增强类
在Spring配置文件中,注册bean,并增加支持注解的配置
好处
解耦:实现低耦合,高内聚
实现代码复用,提高使用效率
事务
概念
事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
特性(ACID)
原子性:事物的最小单位,不允许分割
一致性:执行事务前后,数据保存一致
隔离性:并发访问数据库时,用户的事务不受其它事物的干扰,并发的数据库之间是独立的
持久性:事务被提交后,再也不受任何影响
事务类型
1.JDBC事务
2.JTA事务
3.容器事务