Spring核心组件知识梳理
Spring的一些概念和思想
Spring的核心:AOP、IOC。
简单点说,就是把对象交给Spring进行管理,通过面向切面编程来实现一些"模板式"的操作,使得程序员解放出来,可以更加关注业务实现。
Spring已经是一站式的开源框架解决方案,而且形成了Spring生态。
关于IOC
IOC,从操作上来看,要么通过XML配置实现,要么通过注解的方式实现。在实际开发中,越来越流行注解的方式。
需要根据你使用到的功能,来进行依赖的引入,以及XML的Schema约束引用。
Spring的核心配置文件,名称和位置不固定,不过在实际开发中,一般指定为applicationContext-xxx.xml的方式。这种方式,有2个好处:第一,可以对Spring的配置文件进行分模块管理;第二,由于统一的前缀,方便正则加载这些配置文件。

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即可!
参考:https://www.jianshu.com/p/e0bf42b6850b
Spring核心组件知识梳理的更多相关文章
- spring远程服务知识梳理
序:本文主要是总结和归纳spring的远程服务相关知识,可作为入门学习笔记.写博客目的也是为了进行知识梳理,便于以后查看.本文主要参考资料 spring 实战第三版 本文主要讨论内容如下: 远程调度概 ...
- Spring框架知识梳理(一) IOC
1 写在前面 Spring框架是在大一的时候学习的,但是经过几个项目下来发现自己只不过会用某些常用的东西,对于Spring家族,虽然现在大都使用Spring Boot开发,但是我发现Spring框架的 ...
- Spring MVC知识梳理
同上一篇博客,复习梳理SpringMVC知识点,这次的梳理比较快,很多细节没有顾虑到,后期可能会回来补充 1. 整体架构 1.1 在学习了SSM框架后我们来理清三者的应用层面 浏览器发送请求,请求到达 ...
- MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
随机推荐
- 小白自学机器学习----3.令人头秃的pytorch安装 (No module named 'tools.nnwrap' 错误)
tensorflow 刚刚会写基础的模块了,今天找到研究方向的代码是pytorch实现的 总是看到这句话,人生苦短,我用pytorch 看来pytorch应该比tensorflow好学,但是!! py ...
- ZipArchive(解压文件)
一.首先介绍minizip 的使用方法 ziparchive是基于开源代码”MiniZip”的zip压缩与解压的Objective-C 的Class,使用起来非常的简单方法:从http://code. ...
- Java基础面试系列(一)
Java基础面试总结(一) 1. 面向对象和面向过程的区别 面向过程 面向对象 性能 高于面向对象 类加载的时候需要实例化,比较消耗资源 三易(易维护,易复用,易扩展) 不如面向对象 具有封装,继承, ...
- 开放融合易用@门户移动开发新体验-逐浪CMS v8.0.1全面发布
北京时间2019年8月30日消息: 领先的web内核研发厂商--上海Zoomla!逐浪CMS团队发布最新CMS版本:Zoomla!逐浪CMS v8.0.1,这是继上个版本v8.0后功能最具完强大与精彩 ...
- Kaggle 题目 nu-cs6220-assignment-1
Kaggle题目 nu-cs6220-assignment-1 题目地址如下: https://www.kaggle.com/c/nu-cs6220-assignment-1/overview 这是个 ...
- ajax4
用jquery实现json jquery.ajax([settings]) type类型使用“POST”或者“GET”,默认使用get URL:发送请求地址 data:是一个对象,连同请求发送到服务器 ...
- react 给选中的li添加样式(转载)
路:使用事件委托,关键:获取到的index必须转为数字,因为它是字符串 handleClick = (e) => { const nodeName = e.target.nodeName.toU ...
- [前端开发]Vue父子组件的通信及访问
父传子 props 子传父 自定义事件emit props传数组 props:['cmovies','cmessage'] props传对象 props:{ //1.类型限制 cmovies:Arra ...
- JAVA EE,JAVA SE,JAVA ME,JDK,JRE,JVM之间的区别
JAVA EE是开发企业级应用,主要针对web开发有一套解决方案. JAVA SE是针对普通的桌面开发和小应用开发. JAVA ME是针对嵌入式设备开发,如手机. JRE是程序的运行环境 JDK是程序 ...
- 强智教务系统验证码识别 Tensorflow CNN
强智教务系统验证码识别 Tensorflow CNN 一直都是使用API取得数据,但是API提供的数据较少,且为了防止API关闭,先把验证码问题解决 使用Tensorflow训练模型,强智教务系统的验 ...