<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg>
讯享网
1.1 传统的项目的架构
在传统的项目中,一般遵循MVC开发模型。
(1) view层与用户进行交互,显示数据或者将数据传输给view层。
(2) 在controller层创建service层对象,调用service层中业务方法。
(3) 在service层创建dao层对象,调用dao层中操作数据的方法。
(4) dao层进行具体的数据库操作
1.2 传统的项目架构缺陷
程序在一定程度上存在耦合性,不利于程序的扩展。在controller中直接创建了service层类的对象。如果service的业务发生了变更,那么就需要修改controller层的代码。

在进行程序的扩展时,不建议在当前程序的基础上直接修改程序,为了保证之前程序的正常,一般遵循开闭原则进行维护性的修改,对扩展开放,对修改关闭。
例如:用户注册功能。用户注册,从账号、密码、手机号等信息即可。随着行业发展,目前要求进行实名认证。
1.已注册未认证用户登录时进行认证。
2.新用户注册后要求进行认证。
为避免对已有业务的改动,可以新建一个service类,重写注册方法。则在controller层需要创建新的service对象。每个相关的controller层的代码都需要改动,并且每个controller都需要创建对象,存在对象的浪费。
面向过程—>面向对象—->面向接口—->面向切面(组件)
ArrayList aList = new ArrayList();
List aList = new LinkedList()
1.3 解决方案
基于每个controller都要修改service的创建问题,可以为service定义一个统一的创建方式,例如对象工厂模式,使用工厂创建对象,这样以后使用工厂创建对象的对象需要维护时,只需要修改对象工厂即可,且可以结合单例模式,对象工厂返回单例,这样优化了对象重复的浪费问题。

虽然单例工厂能够解决对象的维护和重复问题。但是,随着service层的扩大,工厂也逐渐臃肿,基本每个service会对应一个factory。基于这种情况,则又需要解决工厂臃肿的问题,为此可以利用反射技术,反射可以创建任意类的对象。但是,工厂为保证单例,只能存储的对象只有一个,而controller层需要使用不同的service层对象,为保证对象的有效,且反射性能相对较低,基于这样的情况,则可以定义一个需要创建的对象的清单和一个存储对象的容器,根据清单创建对象,然后将所有创建service对象进行存储,每个controller只需要去容器中获取对象即可,这样既解决了单例问题,也提高了性能。

1.3.1 代码示例

1.3.2 对象清单


1.3.3 对象容器工厂
讯享网
2.1 简介
Spring框架是由于软件开发的复杂性而创建的,初衷是为了让软件开发更加简单。Spring使用的是简单的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
Web Service,有2个显著特点:
1.数据格式是xml格式。
2.配置繁琐,“笨重”,对象关联性大,需在配置文件中各种配置。
基于这些原因,Spring框架提出了:IOC/DI(控制反转/依赖注入),AOP(面向切面编程)。
Spring框架可在任何类型的部署平台上为基于Java的现代企业应用程序提供全面的编程和配置模型。Spring的关键元素是在应用程序级别的基础架构支持:Spring专注于企业应用程序的“管道”,以便团队可以专注于应用程序级别的业务逻辑,而不必与特定的部署环境建立不必要的联系。
2.2 Spring的核心组件

l spring-core 模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
l spring-beans 模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。
l context 模块建立在由 core和 beans 模块的基础上建立起来的,它以一种类似于 JNDI 注册的方式访问对象。Context 模块继承自 Bean 模块,并且添加了国际化(比如,使用资源束)、事件传播、资源加载和透明地创建上下文(比如,通过 Servelet 容器)等功能。Context 模块也支持 Java EE 的功能,比如 EJB、JMX 和远程调用等。ApplicationContext 接口是 Context 模块的焦点。spring-context-support 提供了对第三方库集成到 Spring 上下文的支持,比如缓存(EhCache, Guava, JCache)、邮件(JavaMail)、调度(CommonJ, Quartz)、模板引擎(FreeMarker, JasperReports, Velocity)等。
l spring-expression 模块提供了强大的表达式语言,用于在运行时查询和操作对象图。它是 JSP2.1 规范中定义的统一表达式语言的扩展,支持 set 和 get 属性值、属性赋值、方法调用、访问数组集合及索引的内容、逻辑算术运算、命名变量、通过名字从 Spring IoC 容器检索对象,还支持列表的投影、选择以及聚合等。
依赖关系图如下:

(注:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service)
l JDBC 模块提供了 JDBC 抽象层,它消除了冗长的 JDBC 编码和对数据库供应商特定错误代码的解析。
l ORM 模块提供了对流行的对象关系映射 API 的集成,包括 JPA、JDO 和 Hibernate 等。通过此模块可以让这些 ORM 框架和 spring的其它功能整合,比如前面提及的事务管理。
l OXM 模块提供了对 OXM 实现的支持,比如 JAXB、Castor、XML Beans、JiBX、XStream 等。
l JMS 模块包含生产(produce)和消费(consume)消息的功能。从 Spring 4.1 开始,集成了 spring-messaging 模块。
l 事务模块为实现特殊接口类及所有的 POJO 支持编程式和声明式事务管理。(注:编程式事务需要自己写 beginTransaction()、commit()、rollback() 等事务管理方法,声明式事务是通过注解或配置由 spring 自动处理,编程式事务粒度更细)
l Web 模块提供面向 web 的基本功能和面向 web 的应用上下文,比如多部分(multipart)文件上传功能、使用 Servlet 监听器初始化 IoC 容器等。它还包括 HTTP 客户端以及 Spring 远程调用中与 web 相关的部分。
l Web-MVC 模块为 web 应用提供了模型视图控制(MVC)和 REST Web服务的实现。Spring 的 MVC 框架可以使领域模型代码和 web 表单完全地分离,且可以与 Spring 框架的其它所有功能进行集成。
l Web-Socket 模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。
l Web-Portlet 模块提供了用于 Portlet 环境的 MVC 实现,并反映了 spring-webmvc 模块的功能。
l AOP 模块提供了面向方面(切面)的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,从而使实现功能的代码彻底的解耦出来。使用源码级的元数据,可以用类似于.Net属性的方式合并行为信息到代码中。
l Aspects 模块提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。
l Instrumentation 模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现。
l Messaging 模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息。
l 测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。
IOC:控制反转。将对象的创建、初始化、销毁等一系列的生命周期过程交给spring管理。
结婚:
方式1: 自己找女生—————>吃饭、逛街、看电影、送回家等———>结婚
(同学、同事、公交地铁1个月-3个月) 半年-1年半 1天
方式2: 媒婆(1个月)————————>结婚(1天)
吃饭:
方式1: 买菜、买米(30min-1h)—->蒸饭、洗菜、切菜、炒菜(1个小时)—>吃(15-30min)
方式2: 定外卖—————–>吃(15-30min)
面向过程—–>面向对象—–>面向接口—–>面向组件(面向切面)–>面向服务—>面向百度
3.1 基本使用
3.1.1 创建项目并导入spring IoC相关jar包

在pom文件中,引入Spring的IoC核心jar包
讯享网
3.1.2 创建User类
3.1.3 创建Spring的核心配置文件spring-context.xml/applicationContext.xml
讯享网
3.1.4 编写测试程序
3.2 Bean标签属性介绍
prototype :非单例,每次获取都会创建一个新的bean对象。
singleton : 单例,多次获取永远同一个bean, 默认值。
request : 一次请求,基于web项目的bean的作用域。
session : 一次会话,基于web项目的bean的作用域。
byName 根据属性名称装配

byType 根据类型装配
true 作为自动装配的候选项
false 不作为自动装配的候选项
3.2.12 代码示例
讯享网
3.3 Bean对象创建的4种方式
3.3.2 静态工厂创建
讯享网
3.3.3 非静态工厂创建
3.3.4.1 组件注解:
3.3.4.1.1 @Component(“bs”)
表示该类为一个被Spring管理的组件。但是,由于在开发中为了让代码的可读性更高。
Spring基于分层思想,将需要创建的组件分为以下几类:
注意:
以上注解是Spring中定义的创建对象的注解,都可以创建对象,如果该类有明确的作用,有自己所属的层,则建议使用相应的注解,如果实在无法区分该类所属层,可以使用@Component注解。
3.3.4.2 注解使用步骤
3.3.4.2.1 开启组件扫描
在spring的核心配置文件中,开启注解扫描,让Spring将被注解修饰的类,创建对相关。
xml头部
xmlns:context=“http://www.springframework.org/schema/context”
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
讯享网
3.3.4.2.2 添加注解
3.4 IOC属性注入的3种方式
为对象属性设置值,就是属性注入。
3.4.1 构造方法属性注入:DI(依赖注入,给对象的属性赋值)
讯享网
3.4.2 set方法属性注入
- 开启包的注解扫描
<context:component-scan base-package=“com.*” /> - 使用注解
讯享网
注意:
在使用自动注入时,可以在bean标签上,配置autowire,但是此时必须有该属性的set方法,@Autowired注解,是不需要set方法的。
如果是在xml中注入对象,值使用ref属性。value属性,只支持boolean,数字,字符串等。
3.5 常见类型的属性注入
在Spring中,提供了丰富的标签,进行各种属性的注入。常见的类型:
数字、字符串、boolean、数组、set、list、map、properties。
3.6 使用IOC容器,改造传统项目
3.6.1 xml配置版
3.6.1.1 创建项目并加入依赖

讯享网
3.6.1.2 项目结构

3.6.1.3 配置文件
3.6.1.4 controller
讯享网
3.6.1.5 dao
3.6.1.6 service
讯享网
3.6.1.7 test
讯享网
3.6.2.2 controller
3.6.2.3 dao
讯享网
3.6.2.4 service
3.6.2.5 test
讯享网
com.powernode.aadenglu
Login: login():登录方法
com.powernode.anquan
Security: isSecurity():检测操作环境是否安全
com.powernode.bmapper
CBCBankMapper(核心类): selectMoney() updateMoney() updateInvest() update2Tel()
com.powernode.crizhi
Logger: log():记录用户操作细节
com.powernode.dqinli
Clean :cleanResource():清理缓存
Expt: handExpt()
4.1 AOP简介:面向切面(面向组件)
DefaultAopProxyFactory
代理
静态代理
静态代理,每个被代理类都需要创建对应的代理类。随着程序的扩展,代理类也会增多,臃肿,维护量变多,为了解决这个问题,Java中,提供了动态代理技术,开发者不需要自己定义代理类,代理类由JDK动态的创建,开发只需要指定被代理的类即可。
切面(aspect):除了核心类以外的其他类称之为切面
通知(advisor):切面中的方法称之为通知
核心类:一个项目中不能省略的模块类
核心方法:核心类中的方法称之为核心方法
连接点:核心类中的某一个方法
切入点(pointcut):某个包下的某个类下的某一批方法
代理(proxy):将多个切面与核心类组合在一起,形成一个新的类,这个类称之为代理类
织入(weaver):书写代理类的过程称之为织入
4.2 动态代理
4.2.1 JDK动态代理
4.2.1.1 Proxy
该类提供了方法创建代理类和代理类的对象的方法
创建一个代理类并返回代理类对象
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
loader : 类加载器,指定类加载器,是为了精确的定位类
interfaces : 接口Class类,使用JDK的反射,必须要有接口
h :InvocationHandler ,代理的处理器,每个代理类都有一个关联的处理器
Object 方法调用的返回值,可以作为被代理的方法调用的返回值
proxy : 代理类对象
method : 目标类中被代理的方法
args : 目标类中被代理的方法的运行参数

Object invoke(Object proxy,Method method,Object[] args)
4.2.1.3.2 目标类
讯享网
4.2.1.3.3 代理类处理器
4.2.1.3.4 测试类
讯享网
4.2.1.3.5 生成代理类源码
4.2.1.3.6 JDK动态代理的不足
在JDK中使用动态代理,必须有类的接口。因为生成的代理需要实现这个接口,这样我们生成的代理类对象,才能转化为代理目标的接口对象,然后根据接口中的方法,调用处理器中invoke方法。

早期,Cglib动态代理,性能相于JDK的动态代理高一些。JDK进行一些列优化,目前Spring默认使用的动态代理JDK,也支持Cglib。
4.2.2.1 Cglib动态代理的使用
4.2.2.1.1 MethodInterceptor
cglib中,提供的对方法执行拦截的接口。其中intercept是对具体方法进行拦截处理的方法。
public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,
讯享网
Object : 方法执行返回的结果
obj :增强类的对象
method :目标方法
proxy :用于回调的方法的对象
4.2.2.1.2.2 创建被代理目标类
讯享网
4.2.2.1.2.3 方法拦截器
4.2.2.1.2.4 测试类
讯享网
4.3 Spring的AOP配置
在Spring中,AOP的配置主要分为2类:xml配置和注解配置
XML配置也分为两种,一种Spring的原生支持,一种是Spring的aspects这个相关的框架。
切入点(PointCut):所谓切入点就是指我们要对那些JoinPoint进行拦截的定义,指的是具体的拦截的位置
增强/通知(Advice) : 增强就是对具体的连接点进行扩展的功能。由于一般对方法进行增强,分为在方法前执行或者方法后,或者发生异常执行等等,所以增强被分为:前置增强(前置通知)、后置增强(后置通知)、环绕通知(环绕增强)、异常增强(异常通知)
引介(Introduction):引介是一种特殊的Advice,在不修改代码的前提下,引介可以在运行期为类动态的添加一些方法或Field.
目标(Target) :被代理的类(需要增强类)
织入(Weaving) :把Advice应用到Target的过程
代理(Proxy):使用AOP配置后产生的代理类
切面(Aspect):切点和增强整合形成了切面

讯享网
4.3.2.2.2 后置增强-AfterReturningAdvice
4.3.2.2.3 环绕增强-MethodInterceptor
讯享网
4.3.2.3 目标类
讯享网
4.3.2.4 aop配置
4.3.2.5 测试类
讯享网
在AspectJ中,只需要定义一个增强类即可,并且方法的名称可以任意定义。
4.3.3.1 引入相关jar
4.3.3.2 编写增强类
讯享网
4.3.3.3 编写目标类
4.3.3.4 配置AspectJ的增强配置
讯享网
4.3.3.5 进行测试
讯享网
4.3.4.2 定义增强类
4.3.4.3 目标类
讯享网
4.3.4.4 开启相关注解
4.3.4.5 测试类
讯享网
Spring整合Mybatis就是将Mybatis交给Spring进行管理,将Mybatis的SqlSession对象,放入IOC容器中,并且可以利用自动装配功能,为每个数据库操作层,注入SqlSession。并且Spring内置可以有代理的,可以根据SqlSession对象及数据操作接口,创建Mapper接口的代理对象,此时Mapper的代理在IOC容器中,那么可以将Mapper接口的对象注入到Service中。
5.1 多XML版
使用配置文件版本,Mybatis配置文件和Spring配置文件是单独的。
5.1.1.2 mybatis相关jar包
讯享网
5.1.1.3 数据库相关jar包
5.1.1.4 日志相关jar包
讯享网
5.1.1.5 spring和mybatis整合包
5.1.1.6 mybatis分页插件包
讯享网
5.1.2 相关类
5.1.2.1 domain
5.1.2.2 mapper
讯享网
5.1.2.3 service
5.1.2.4 测试类
讯享网
5.1.3 相关配置文件
5.1.3.1 jdbc配置文件
#数据库连接信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=UTF8&serverTimezone=UTC
jdbc.username=root
jdbc.password=
5.1.3.2 日志配置文件
5.1.3.3 mybatis核心配置文件
讯享网
5.1.3.4 mybatis映射文件
5.1.3.5 spring核心配置文件
讯享网
5.2 Spring配置文件版
使用Spring的配置文件,取代mybatis的核心配置文件。
导入的jar包和相关类完全一致,jdbc配置文件和日志配置文件也相同。只是将mybatis的核心配置文件中的配置,移入到spring的核心配置文件中。
5.2.1 Spring核心配置文件
5.2.2 配置日志
讯享网
在spring中,spring可以管理数据源,管理连接,spring也可以管理事务,并且spring单独对事务分了一个模块进行管理。并且,Spring简化了事务开发,只需要通过配置的方式,Spring即可对事务进行统一完善的管理,Spring的事务管理基于Spring的AOP技术。
Spring的声明式事务,有两种方式:xml配置、注解
6.1 XML配置方式
6.2 注解版声明式事务
在Spring中,为简化事务开发,提供了注解:@Transactional,该注解可以指定在类上,在类上,该类中的所有方法都会使用事务,该注解也可以指定方法上,该方法会使用事务。使用非常简单,只需:
- 配置事务管理器
- 开启注解事务
- 在需要使用事务的地方使用@Transactional
6.2.1 配置类
讯享网
6.2.2 service代码
7

注意:
事务的传播行为,是指事务会发生传递。例如:A方法存在事务,A调用B方法,那么B方法也会在事务中执行,这种就是事务的传播行为。
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/156022.html