第七天:Spring(基础)

一:概念

        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.作用域:

  1. 单例模式(Spring默认机制)

<bean id="user" class="nuc.ss.pojo.User" scope="singleton"/>

  1. 原型模式:每次从容器中get的时候,都会产生一个现对象!

<bean id="user" class="nuc.ss.pojo.User" scope="prototype"/>

  1. 其余的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.容器事务

猜你喜欢

转载自blog.csdn.net/qq_35056891/article/details/126652511