Spring IoC、AOP、Transaction、MVC 归纳小结
前言
如果说有什么框架是Java程序员必然会学习、使用到的,那么Spring肯定是其中之一。本篇博客,将根据博主在日常工作中对Spring的使用做一个系统的归纳小结。
Spring的一些概念和思想
Spring的核心:AOP、IOC。
简单点说,就是把对象交给Spring进行管理,通过面向切面编程来实现一些"模板式"的操作,使得程序员解放出来,可以更加关注业务实现。
Spring已经是一站式的开源框架解决方案,而且形成了Spring生态。
关于IOC
IOC,从操作上来看,要么通过XML配置实现,要么通过注解的方式实现。在实际开发中,越来越流行注解的方式。
需要根据你使用到的功能,来进行依赖的引入,以及XML的Schema约束引用。
Spring的核心配置文件,名称和位置不固定,不过在实际开发中,一般指定为applicationContext-xxx.xml的方式。这种方式,有2个好处:第一,可以对Spring的配置文件进行分模块管理;第二,由于统一的前缀,方便正则加载这些配置文件。
bean的XML配置创建
直接通过来进行,这样的前提是该类存在无参数的构造方法(背后的原理就是通过反射实例化的)。这种方式是实际中最常使用的,当然,除此之外还存在静态工厂、实例工厂的方式创建。
另外一点还需要注意的是:bean是单例的,还是多例的?
bean标签中存在scope属性用于说明:
singleton:单例,default
prototype:多例
request/session等。
bean的属性注入:XML方式
bean的XML创建是通过反射进行,那么bean的属性注入,是如何进行的呢?
可以在构造bean的时候,提供有参数的构造方法进行设置;
可以在提供setter方法,进行设置;(最常用)
什么接口注入,什么P名称空间注入,这些实际都不用……
或者
要么利用value直接给出属性值,要么通过ref引用另一个bean。
基于注解方式的bean创建以及注入
因为Spring注解的实现是需要AOP的支持,因此在依赖方面需要注意,其次,要在XML中开启注解扫描:
实际上这个配置,会让Spring在指定包下扫描,把带有注解标志的bean实例化,并且会进行属性注入。(你可以参考《写出我的第一个框架:迷你版Spring MVC》)
创建对象的4个注解:
@Component/@Controller/@Service/@Repository
在这4个注解上,通过value属性来指定bean的id,通过@scope配合来声明单例OR多例。(目前这4个注解功能是一样的,只是为了让标注类的用途更加清晰,而且Spring留了一手,以后说不定会增强功能呢?)
如何注入属性?
@Autowired/@Resource/@Qualifier
需要注意的是@Resource是javax包下的,说白了就是J2EE提供的;而@Autowired是Spring提供的。(不必提供setter方法)
@Resource默认按照名称注入,如果找不到才按照类型注入。
@Autowired默认按照类型注入,可以结合@Qualifier进行名称注入。
那么我们需要注意什么呢?
如果@Autowired进行类型注入,很可能类型会有多个满足(多态),那么到底注入哪个呢?所以说,如果按照@Autowired类型注入,一定注意这点,结合@Qualifier。实际开发中,显然,注入应该是确定的,那么按照名称注入,应该是首选!
IOC VS DI
IOC,控制反转;DI,依赖注入;
只有把对象交给Spring,才能由Spring帮助完成属性设置;因此,依赖注入不能单独存在,需要在IOC基础之上完成操作。
关于AOP
AOP的实现,一种横向抽取机制,依赖于动态代理模式。
关于AOP的几个重点概念:
JoinPoint:连接点,说白了,就是可以被增强的方法;
PointCut:切入点,对哪些JoinPoint进行拦截;
Advice:通知,就是拦截后的动作;
Aspect:切面,把增强应用到具体方法的过程;
Spring的AOP需要借助aspectj来实现,可以通过XML,也可以通过注解来完成。
比如,采用XML方式的话,需要指明用A类的哪个方法对B类的哪些方法上进行增强,这里就涉及到execution表达式了;
比如,采用注解方式的话,就更加简单了,先在XML中开启AOP(),然后在增强方法上直接使用类似@Before(value="execution(具体的表达式)")即可;
其实,在实际开发中,我们对于AOP最常用的就是事务了。
Spring的事务管理
Spring的声明式事务管理,用的最多的就是基于注解的方式。首先我们得配置一个事务管理器,而事务管理器需要我们注入DataSource(DBCP,c3p0等连接池),这一点好理解,因为是DB的事务。要知道,Spring对不同的DAO层框架(Spring JDBC/MyBatis/Hibernate…)提供了不同的事务实现类。
我们可以看个例子:
Spring注解事务配置
对于多个数据源,当然,我们需要定义多个事务管理器,同时也得开启事务注解。多个事务管理器,可以通过qualifier属性进行区分。
配置完毕后,直接在service层的类或者方法上,使用
@Transactional(value = "gcs", rollbackFor = Exception.class)
Spring与web整合的原理
从操作上来讲,就是在web.xml中去配置一个监听器,然后指定Spring的配置文件即可。
每一个WEB项目,都存在一个ServletContext对象,而我们配置的监听器就是对它进行监听,监听器会加载Spring的配置文件,把创建的对象放到ServletContext域(也就是setAttribute方法),获取对象的时候直接getAttribute即可!
好了,到这里,Spring的梳理就结束了!
Spring IoC、AOP、Transaction、MVC 归纳小结相关推荐
- Spring常用注解,注解 IOC ,AOP,MVC 的理解
文章目录 大佬总结 0.Spring常用注解 0.1.SpringBootController里面的用法 0.1.1.SpringBoot 中常用注解@Controller/@RestControll ...
- Spring IOC AOP详细笔记
spring 文章目录 spring 什么是spring spring框架作用: ioc aop spring基本配置 IOC掌握什么? IOC创建对象方式 Spring配置 别名配置 bean配置 ...
- 面试必会系列 - 1.8 Spring IOC / AOP原理
本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...
- springaop事务逻辑原理_太狠了!阿里大牛手写的Spring核心面试笔记:IOC+AOP+MVC+事务...
Spring作为现在最流行的java 开发技术,其内部源码设计非常优秀.如果你不会Spring,那么很可能面试官会让你回家等通知. Spring是什么? 有一个工地,几百号人在用铁锹铲子挖坑. 如果开 ...
- Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别
Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别 AOP:面向切面编程. 即在一个功能模块中新增其他功能,比方说你要下楼取个快递,你同事对你说 ...
- 自己动手实现的 Spring IOC 和 AOP - 下篇
1. 背景 本文承接上文,来继续说说 IOC 和 AOP 的仿写.在上文中,我实现了一个很简单的 IOC 和 AOP 容器.上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块 ...
- 自己动手实现的 Spring IOC 和 AOP - 上篇
1. 背景 我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了.不过之前没有仿写过 Spring IOC 和 AOP,只是宏观 ...
- Spring (Bean, IoC, AOP, SpringMVC)
Spring - Bean, IoC, AOP, SpringMVC Spring 1. 核心容器 1.1 Spring-beans 1.1.1 Bean 的配置 1.1.1.1 自动装配 1.1.1 ...
- Spring IoC 和 AOP
Spring IoC 和 AOP spring框架java开发的行业标准. spring全家桶. Web:Spring Web MVC/Spring MVC,Spring Web Flux 持久层:S ...
最新文章
- WCF访问iis元数据库失败--解决方法
- business man
- 再战FGM!Tensorflow2.0 自定义模型训练实现NLP中的FGM对抗训练 代码实现
- html高德地图api使用教程,高德地图API如何使用?
- 安卓怎么显示res文件夹中的html_android中自定义WebView显示网页或本地html文件 | 学步园...
- HIVE 一行转多行输出办法
- Codeforces Gym 101142C:CodeCoder vs TopForces(搜索)
- 成就架构师,到底是怎样的一种体验?
- ES6新特性_浏览器使用ES6模块化引入模块---JavaScript_ECMAScript_ES6-ES11新特性工作笔记042
- ubuntu 14 配置vsftp
- python 调用海康linux下psdatacall_demo,实现获视频取码流并返回到python,以及上传信息到人脸库的方法
- 测井储层参数预测+人工智能方法
- 2014年的暑假ACM之旅!
- 线程池ThreadPoolExecutor与ForkJoinPool
- elementui不生效
- 卡方独立性检验|卡方拟合性检验
- 三问中国电子云,此时入局的深意是什么?
- 一、数据仓库基础理论
- 聊聊职场 - 个人发展
- 秦纪一 昭襄王五十二年(丙午、前255)——摘要