Spring归纳小结

2018 年 11 月 7 日 程序猿

作者:张丰哲

链接:https://www.jianshu.com/p/e0bf42b6850b

前言

如果说有什么框架是Java程序员必然会学习、使用到的,那么Spring肯定是其中之一。本篇博客,将根据博主在日常工作中对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名称空间注入,这些实际都不用……


<bean id="" class="">
    <property name="" value=""> 或者<property name="" ref="">
</bean>


要么利用value直接给出属性值,要么通过ref引用另一个bean。

基于注解方式的bean创建以及注入

因为Spring注解的实现是需要AOP的支持,因此在依赖方面需要注意,其次,要在XML中开启注解扫描:


<context:component-scan base-package="" />


实际上这个配置,会让Spring在指定包下扫描,把带有注解标志的bean实例化,并且会进行属性注入。(你可以参考《写出我的第一个框架:迷你版Spring MVC》https://www.jianshu.com/p/f454662f497e


创建对象的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的梳理就结束了!

2017-10-06 by zhangfengzhe


编号3406,输入编号直达本文

●输入m获取文章目录

推荐↓↓↓

Java编程

更多推荐25个技术类微信公众号

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

登录查看更多
0

相关内容

深度学习目标检测方法及其主流框架综述
专知会员服务
146+阅读 · 2020年6月26日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
【文献综述】深度学习目标检测方法及其主流框架综述
专知会员服务
117+阅读 · 2020年6月26日
【硬核书】不完全信息决策理论,467页pdf
专知会员服务
348+阅读 · 2020年6月24日
必读的7篇 IJCAI 2019【图神经网络(GNN)】相关论文
专知会员服务
91+阅读 · 2020年1月10日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
86+阅读 · 2019年11月25日
听说你还没读过 Bert 源码?
AINLP
7+阅读 · 2019年8月7日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
推荐系统概述
Python开发者
11+阅读 · 2018年9月27日
推荐一些适合小白练手的Python项目
数据挖掘入门与实战
6+阅读 · 2018年5月17日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
消息队列技术点梳理(思维导图版)
架构文摘
3+阅读 · 2018年4月3日
深度学习知识总结(一)
深度学习探索
8+阅读 · 2017年7月18日
Learning Dynamic Routing for Semantic Segmentation
Arxiv
8+阅读 · 2020年3月23日
Clustered Object Detection in Aerial Images
Arxiv
5+阅读 · 2019年8月27日
Conditional BERT Contextual Augmentation
Arxiv
8+阅读 · 2018年12月17日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Relational Deep Reinforcement Learning
Arxiv
10+阅读 · 2018年6月28日
Arxiv
5+阅读 · 2016年10月24日
VIP会员
相关VIP内容
深度学习目标检测方法及其主流框架综述
专知会员服务
146+阅读 · 2020年6月26日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
【文献综述】深度学习目标检测方法及其主流框架综述
专知会员服务
117+阅读 · 2020年6月26日
【硬核书】不完全信息决策理论,467页pdf
专知会员服务
348+阅读 · 2020年6月24日
必读的7篇 IJCAI 2019【图神经网络(GNN)】相关论文
专知会员服务
91+阅读 · 2020年1月10日
【模型泛化教程】标签平滑与Keras, TensorFlow,和深度学习
专知会员服务
20+阅读 · 2019年12月31日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
86+阅读 · 2019年11月25日
相关资讯
听说你还没读过 Bert 源码?
AINLP
7+阅读 · 2019年8月7日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
推荐系统概述
Python开发者
11+阅读 · 2018年9月27日
推荐一些适合小白练手的Python项目
数据挖掘入门与实战
6+阅读 · 2018年5月17日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
消息队列技术点梳理(思维导图版)
架构文摘
3+阅读 · 2018年4月3日
深度学习知识总结(一)
深度学习探索
8+阅读 · 2017年7月18日
相关论文
Learning Dynamic Routing for Semantic Segmentation
Arxiv
8+阅读 · 2020年3月23日
Clustered Object Detection in Aerial Images
Arxiv
5+阅读 · 2019年8月27日
Conditional BERT Contextual Augmentation
Arxiv
8+阅读 · 2018年12月17日
Relational recurrent neural networks
Arxiv
8+阅读 · 2018年6月28日
Relational Deep Reinforcement Learning
Arxiv
10+阅读 · 2018年6月28日
Arxiv
5+阅读 · 2016年10月24日
Top
微信扫码咨询专知VIP会员