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