前言

如果说有什么框架是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 id=""  class=""></bean>来进行,这样的前提是该类存在无参数的构造方法(背后的原理就是通过反射实例化的)。这种方式是实际中最常使用的,当然,除此之外还存在静态工厂、实例工厂的方式创建。

另外一点还需要注意的是: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》

创建对象的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(<aop:aspectj-autoproxy />),然后在增强方法上直接使用类似@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的梳理就结束了!

作者:张丰哲
链接:https://www.jianshu.com/p/e0bf42b6850b
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Spring归纳小结(山东数漫江湖)的更多相关文章

  1. 深入理解Spring MVC(山东数漫江湖)

    初始工程 使用Spring Boot和web,thymeleaf的starter来设置初始工程.xml配置如下: <parent>   <groupId>org.springf ...

  2. springcloud(一):大话Spring Cloud(山东数漫江湖)

    研究了一段时间spring boot了准备向spirng cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...

  3. Spring 框架的设计理念与设计模式分析(山东数漫江湖)

    Spring 的骨骼架构 Spring 总共有十几个组件,但是真正核心的组件只有几个,下面是 Spring 框架的总体架构图: 图 1 .Spring 框架的总体架构图 从上图中可以看出 Spring ...

  4. SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)(山东数漫江湖)

    使用 SSM ( Spring . SpringMVC 和 Mybatis )已经很久了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录 ...

  5. Spring中获取request的几种方法,及其线程安全性分析(山东数漫江湖)

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  6. Spring总结以及在面试中的一些问题(山东数漫江湖)

    1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控制权,交由Spri ...

  7. Spring Data JPA 的使用(山东数漫江湖)

    pring data jpa介绍 什么是JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应 ...

  8. Spring与MyBatis的整合(山东数漫江湖)

    首先看一下项目结构图: 具体步骤如下: 1.建立JDBC属性文件 jdbc.properties (文件编码修改为 utf-8 ) driver=com.mysql.jdbc.Driver url=j ...

  9. springboot:Spring boot中mongodb的使用(山东数漫江湖)

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

随机推荐

  1. 关于JS里面写JAVA代码的问题

    最近做项目需要在JS脚本里面调用一个JAVA的函数得到数据,在网上查了很久,发现JS脚本里面不能写JAVA函数.只能把JS脚本里面的代码写进JSP文件里面的<script>标签内,然后写J ...

  2. 3dContactPointAnnotationTool开发日志(五)

      今天要做的第一件事就是把obj文件里不同的对象分割开来.   通过仔细观察发现obj文件中以"o "开头的行会跟着一个对象的名字.g代表对象所属组名,我这里只要用到对象名就行了 ...

  3. Python运算符与编码

    阅读目录 while 循环 运算符 编码的问题 单位转换 整数 布尔值 while 循环 在生活中,我们遇到过循环的事情吧?比如循环听歌.在程序中,也是存才的,这就是流程控制语句 while 1.基本 ...

  4. 【bzoj1775】[Usaco2009 Dec]Vidgame 电视游戏问题 dp

    题目描述 输入 * 第1行: 两个由空格隔开的整数: N和V * 第2到第N+1行: 第i+1行表示第i种游戏平台的价格和可以在这种游戏平台上面运行的游 戏.包含: P_i, G_i还有G_i对由空格 ...

  5. BZOJ4813 CQOI2017小Q的棋盘(树形dp)

    设f[i][j]为由i号点开始在子树内走j步最多能经过多少格点,g[i][j]为由i号点开始在子树内走j步且回到i最多能经过多少格点,转移显然. #include<iostream> #i ...

  6. html的head内标签

    ctrl+?:自动注释 ctrl+/:  注释多行,再按一次,取消注释的多行. 一,*********本地测试的方法:1-找到文件路径,直接浏览器打开:2-pycharm打开测试. 二,模板的解释: ...

  7. Unable to open connection to "Microsoft SQL Server, provider V1.0.5000.0 in framework

    解决办法:1 以管理员身份登陆2 找到ORACLE_HOME文件夹(D:\oracle\ora92),点右键,选属性——安全,在组或用户栏中选"Authenticated Users&quo ...

  8. HDOJ.1228 A + B (map)

    A + B 点我挑战题目 点我一起学习STL-MAP 题意分析 讲字符串和数字用map对应即可 代码总览 /* Title:HDOJ.1228 Author:pengwill Date:2016-11 ...

  9. HTML5 canvas 创意:飞翔的凤凰

    当我看到这件作品的时候,我表示非常喜欢.这个作品的产生不仅仅需要编程和算法,作者肯定是个充满了艺术细胞的人.倘若有什么canvas艺术作品比赛的话,我想它就是获奖的那个. 先观赏下演示吧.注意,要看到 ...

  10. linux上修改系统默认语言设置

    locale命令设置语言环境(临时修改) [keysystem@localhost ~]$ date Fri Feb :: CST [keysystem@localhost ~]$ locale LA ...