SpringMVC---依赖注入与面向切面
1、依赖注入与面向切面
1.1、出现背景
——如何简化java开发?
其中很重要的一点是“组件化”。
——如何更好的“组件化”?
松耦合,以及尽可能的让组件专注于本身。
——Spring框架的目的也只有一个,就是简化java开发
1.2、耦合
很多框架通过强迫应用继承它们的类或实现它们的接口,从而让应用和框架绑死。而耦合又是必须的,有协作关系的类之间必定存在耦合,所以重要的是保持松散耦合。
1.3、依赖注入DI(Dependency Injection)
即利用第三方容器来管理类之间的耦合。在Spring中,对应的概念是Spring容器。它的设计思想主要是是反转资源获取的方向。
传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。而应用了 IoC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源。总结来说,Spring 就是一个实现了IoC的容器。
1.4、面向切面AOP(Aspect Oriented Programming)
(1)横切关注点:多个组件可能都需要用到的系统服务,如日志、事务管理(与组件核心业务逻辑无关)。
(2)双重复杂性:
a. 横切关注点重复出现在多个组件中,修改和维护须修改各个模块相关实现。
b. 组件因为这些与自身核心业务无关的代码而变得混乱。
(3)切点:定义了何处(在程序执行过程中的某个事件/方法)
(4)通知:定义了切面的事务,以及何时执行(相对于切点前后/环绕)
(5)切面:切面由通知和切点组成,它在何时何处完成什么功能
(6)连接点:连接点是一个应用执行过程中能够插入一个切面的点。
(7)织入: 织入是将切面应用到目标对象来创建的代理对象过程。
仔细地观察上图,在程序执行过程中,可以有多个的连接点,在这些连接点上,我们便可以向其中插入切面(即你所想要插入的某个逻辑,这个逻辑,就是上面所说的横切关注点),这样我们就可以更好地理解下,什么是AOP?在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
这样的思想有什么好处呢?试想一下,程序写好了之后,你想要针对所有业务操作添加一个日志,传统的做法是,改造每个业务方法,这样势必把代码弄得一团糟,而且以后再扩展还是更乱。而AOP的思想则是引导你从另一个切面来看待和插入这个日志,不管加在哪,它其实都是属于日志系统这个角度的。
举个例子:
那么,这样说来,我们也就懂得为什么会有AOP的思想,殊途同归,就是为了降低我们维护和开发程序的开销,就是为了简化Java开发。
在这里,我们主要讲的是Spring的编程思想,理解这种思想后,再进行实际操作也会得心应手。
2、Bean的相关介绍
2.1、Bean的原理
Bean就相当于定义一个组件,这个组件是用于具体实现某个功能的,可以重复使用。Bean的好处是:
(1)可以不必再次编译,就可以工作在任何支持Java的平台上。
(2)可以以其他组件模式工作。
(3)可以在内部、网间和网内传输。
2.2、什么是配置bean?
Spring帮我们做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法来完成“依赖注入”,可以把Spring容器理解成一个大型工厂,Bean就是该工厂的产品,工厂(Spirng容器)里能生产出来什么样的产品(Bean),完全取决于我们在配置文件中的配置。
2.3、那么我们该如何配置Bean呢?
Bean的配置形式,主要有以下2种:
(1)基于 XML文件的方式
(2)基于注解的方式(这点在下文会有详细说明)
Bean的依赖注入方式,主要有以下3种:
(1)属性注入方法
(2)构造函数注入方法
(3)工厂方法注入方法
属性注入方法:属性注入即通过setXXX()方法注入Bean的属性值或者依赖对象
构造函数注入方法:构造函数注入方法保证一些必要的属性在Bean实例化时就得到了设置,并在实例化后就可以使用。
【如果有多个构造器,可以通过index和value进行更加精确的定位】
工厂方法注入方法(静态工厂&实例工厂):即工厂类创建一个或多个工厂类实例,工厂类方法一般以接口或抽象类变量的形式返回目标类实例。不推荐使用。
2.4、 Bean的实例化
在Spring IoC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化。Spring 提供了两种类型的 IoC 容器实现:
(1)Bean工厂 BeanFactory: IoC 容器的基本实现。
(2)应用上下文 ApplicationContext:提供了更多的高级特性,是BeanFactory 的子接口。
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身。而ApplicationContext面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用ApplicationContext,而非底层的 BeanFactory。无论使用何种方式, 配置文件是相同的。
我们看看下面的例子
而Bean的实例化还有一种形式,即基于注解的形式,这在下文会提及,也是一种较为常用的方法。
2.5、Bean的自动装配
自动装配(常用)定义是只声明Bean, 而把Bean之间的关系交给 IoC 容器来完成。Spring IoC 容器可以自动装配Bean,我们需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式。
(1)byType(根据类型自动装配): 若IoC容器中有多个与目标Bean类型一致的 bean,在这种情况下,Spring 将无法判定哪个 bean 最合适该属性,所以不能执行自动装配。
(2)byName(根据名称自动装配): 必须将目标Bean的名称和属性名设置的完全相同。
(3)constructor(通过构造器自动装配): 当Bean中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用。
(4)autodetect(自动检测):如果constructor装配失败,则采用byType。
2.6、基于注解配置bean
组件扫描(component scanning): Spring 能够从 classpath 下自动扫描,侦测和实例化具有特定注解的组件。特定组件包括:
@Component: 基本注解, 标识了一个受 Spring 管理的组件
@Respository: 标识持久层组件
@Service: 标识服务层(业务层)组件
@Controller: 标识表现层组件
对于扫描到的组件, Spring 有默认的命名策略:使用非限定类名, 第一个字母小写,也可以在注解中通过 value 属性值标识组件的名称。
当在组件类上使用了特定的注解之后,还需要在 Spring 的配置文件中声明<context:component-scan>,其中base-package 属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类。就像这样:
Spring 还支持 @Resource 和 @Inject 注解,这两个注解和 @Autowired 注解的功用类似。@Resource 注解要求提供一个 bean 名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为 bean 的名称。@Inject 和 @Autowired 注解一样也是按类型匹配注入的 bean, 但没有 reqired 属性。建议读者使用@Autowired 注解。
当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有@Autowired 注释时就找到和其匹配(默认按byType匹配)的 Bean,并注入到对应的地方中去。
当然,该实例也可以自动装配具有@Resource 、@Inject注解的属性。它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。我们可以通过@Autowired的使用来消除 set ,get方法,如下图的例子:
2.7、Spring表达式语言:SpEL
Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL,SpEL 为bean 的属性进行动态赋值提供了便利。
通过 SpEL 可以实现:
(1)通过bean 的 id 对 bean 进行引用
(2)调用方法以及引用对象中的属性
(3)计算表达式的值
(4)正则表达式的匹配
2.8、Bean在Spring中的地位
其实 Spring 就是面向 Bean 的编程(BOP,Bean Oriented Programming),Bean 在 Spring 中才是真正的主角。
Bean 在 Spring 中作用就像 Object 对 OOP(Object OrientedProgramming) 的意义一样,没有对象的概念就像没有面向对象编程,Spring 中没有 Bean 也就没有 Spring 存在的意义。
Bean的生命周期:
(1)调用 Bean 的初始化方法,Bean 可以使用了
(2)当容器关闭时, 会调用 Bean 的销毁方法
3、SpringMVC调研流程
3.1、什么是Spring MVC
MVC实际上是一种设计模式
M代表model(模型)。模型表示企业数据和业务规则。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
V代表View(视图)。视图是用户看到并与之交互的界面。如html,jsp等。
C代表Controller(控制器)。控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。
3.2、跟踪Spring MVC的请求
首先控制器接收到用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
3.3、搭建Spring MVC
通过配置xml的形式
3.4、Spring MVC与数据库的结合
(1)DAO(数据访问对象)
DAO提供了数据读取和写入到数据库中的一种方式,它们应该是以接口的方式发布功能。
可以通过Mybatis封装数据操作,如下面的例子,实现了IUserDao中的insert接口,参数类型为User,将User插入数据库User表中
(2)Service(服务对象)
调用Dao的方法,实现我们所需要的操作,供Controller使用。
一个经验:设计良好的控制器本身只处理很少甚至不处理工作,而是将业务逻辑委托给一个或多个服务对象。
SpringMVC---依赖注入与面向切面的更多相关文章
- Spring.Net控制翻转、依赖注入、面向切面编程
Spring.Net快速入门:控制翻转.依赖注入.面向切面编程 Spring.Net主要功能: 1.IoC:控制翻转(Inversion of Control) 理解成抽象工厂翻转控制:就是创建对象 ...
- 如何通俗的理解spring的控制反转、依赖注入、面向切面编程等等
之前一直不理解spring的一些基础特性是什么意思,虽然网上的解释也很多,但是由于我比较笨,就是看不懂,知道最近才稍微了解,下面就以通俗讲解的方式记录下来. 前言 假设我是一个没有开店经验的小老板,准 ...
- Spring.Net快速入门:控制翻转、依赖注入、面向切面编程
Spring.Net主要功能: 1.IoC:控制翻转(Inversion of Control) 理解成抽象工厂翻转控制:就是创建对象的权利由开发人员自己控制New,转到了由容器来控制. 2.DI: ...
- Lind.DDD.IoC依赖注入与面向方面的实现
回到目录 IoC是解耦的灵魂,很难想像一个框架中没有IoC会变成什么样子,Lind.DDD里的IoC是通过Unity实现的,由依赖注入(unity)和方法拦截组成(Interception),依赖注入 ...
- Spring核心思想:IOC(控制反转)、DI(依赖注入)和AOP(面向切面编程)
Spring有三大核心思想,分别是控制反转(IOC,Inversion Of Controller),依赖注入(DI,Dependency Injection)和面向切面编程(AOP,Aspect O ...
- 再学习之Spring(依赖注入)
一.概述 Spring框架是以 简化Java EE应用程序的开发 为目标而创建的.Spring可以实现很多功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入和面向切面编程.几乎Sprin ...
- 类比Spring框架来实现OC中的依赖注入
如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生.依赖注入(DI: Dependency Injection)是控制反转(IoC: Inversion of Co ...
- Spring.NET依赖注入框架学习--简介
Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...
- Spring框架(依赖注入)
特点 1轻量级和侵入性低 2依赖注入和面向接口实现松耦合 3面向切面编程 减少样式代码 专有名词: 1依赖注入:对象无需自行管理依赖关系.通过系统负责协调在创建对象的第三方组件的设定,实现依赖关系自动 ...
随机推荐
- Luogu-2495 [SDOI2011]消耗战
虚树第一题 对于每次询问的点建立一棵虚树,然后在树上DP,一个点的答案就是这个点的父边切断的代价与所有儿子切断的代价去最小值,当然如果这个节点是资源点则必须切父边 注意在虚树上一条边的代价应该是中间所 ...
- 【codevs1993】草地排水(最大流)
最近学了最大流,于是去codevs找了几道最大流裸题(这是我第一次写网络流). 题目大意:求一个图的最大流(就是这样的裸题) 第一次A网络流的题,发个博客纪念一下. var n,m,i,j,k,h,t ...
- springboot+mybatis+springSecurity+thymeleaf
配置步骤: .pom <dependencies> <dependency> <groupId>org.springframework.security</g ...
- UVA 11731 Ex-circles (外切圆)
题意:给你三角形的三条边,求图中DEF的面积和阴影部分的面积. 题解:一些模板,三角形的旁切圆半径:.与 三旁心为 #include<set> #include<map> #i ...
- Virtio SCSI设备介绍
Qemu的存储栈 在KVM虚拟化环境中,当客户机的内核存储系统像在物理机上一样通过页缓存.文件系统.通用块设备层运行到实际设备驱动时,这时驱动对设备寄存器的访问会触发CPU从客户机代码切换到物理机内的 ...
- nova cell配置
Configuration option = Default value Description [cells] call_timeout = 60 (IntOpt) Seconds to wait ...
- Advanced SQL: Relational division in jOOQ
i Rate This Relational algebra has its treats. One of the most academic features is the ...
- .net mvc超过了最大请求长度
项目中遇到"超过了最大请求长度"如下图所示,是因为IIS默认请求长度4M,当请求长度大于这个值的时候报错. 修改maxRequestLength:在web.config中我们修改& ...
- thinkphp框架的优缺点
ThinkPHP的优缺点如下: 1.高级模型:可以轻松支持序列化字段.文本字段.只读字段.延迟写入.乐观锁.数据分表等高级特性. 2.视图模型:轻松动态地创建数据库视图,多表查询相对简单. 3.关联模 ...
- sgu176 有源汇上下界最小流
题意:有一堆点和边,1起点,n终点,某些边有可能必须满流,要求满足条件的最小流 解法:按原图建边,满流的即上下界都是容量,但是这样按有源汇上下界可行流求出来的可能不是最小流,那么我们需要开始建边的时候 ...