
Spring学习点滴
把我的经验分享给你。让你用最少的时间掌握最有用的Spring应用开发知识点。
唐大麦
只要往前走,就不会迟。精疲力尽的时侯应该选择休息,切不可放弃。
展开
-
【Spring学习31】Spring事务(1):概述
本系列由以下文章组成: Spring事务(1):概述 Spring事务(2):事务管理器 Spring事务(3):事务属性之隔离级别(isolation level) Spring事务(4):事务属性之7种传播行为 Spring事务(5):编程式事务 Spring事务(6):声明式事务原创 2017-04-20 21:00:01 · 1799 阅读 · 0 评论 -
【Spring学习32】Spring事务(2):事务管理器
Spring只是个容器,因此它并不做任何事务的具体实现。他只是提供了事务管理的接口PlatformTransactionManager,具体内容由就由各个事务管理器来实现。 Spring提供了许多内置事务管理器实现:DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,数据源事务管理器,提供对单个javax.sq原创 2017-04-20 21:06:18 · 2098 阅读 · 1 评论 -
【Spring学习33】Spring事务(3):事务属性之隔离级别(isolation level)
事务属性上文的例子中,在声明事务时,用到了@Transactional(readOnly = false, propagation = Propagation.REQUIRED)。 中间的参数readOnly,propagation我们称为事务属性。它就是对事务的基本配置。事务属性有五个方面:传播行为,隔离级别,事务超时时间,回滚规则,是否只读。 由属性接口TransactionDefiniti原创 2017-04-20 21:26:55 · 25215 阅读 · 2 评论 -
【Spring学习34】Spring事务(4):事务属性之7种传播行为
事务传播行为什么叫事务传播行为?听起来挺高端的,其实很简单。 即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。 例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个原创 2017-04-20 21:35:42 · 19239 阅读 · 23 评论 -
【Spring学习35】Spring事务(5):编程式事务
Spring提供了对编程式事务和声明式事务的支持,编程式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦。简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。 Spring提供两种方式的编程式事务管理,分别是:使用TransactionTe原创 2017-04-20 21:38:34 · 1427 阅读 · 0 评论 -
【Spring学习36】Spring事务(6):声明式事务(集合Mybatis)
Spring声明 式事务实现过程中,在配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化。 比如使用Hibernate进行数据访问时,DataSource实际为SessionFac原创 2017-04-20 21:39:59 · 1294 阅读 · 0 评论 -
【Spring学习30】Spring AOP:基于XML配置和注解实现
我们知道Spring以IoC(Inverse of Control 反转控制)和AOP(Aspect Oriented Programming 面向切面编程)为内核。 AOP(Aspect Oriented Programming),即面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善。 举个栗子(用的伪代码),假设我们要在系统的每个方法被原创 2017-04-13 21:42:59 · 1375 阅读 · 4 评论 -
【Spring学习28】JavaConfig配置bean
从Spring3开始,加入了JavaConfig特性,JavaConfig特性允许开发者不必在Spring的xml配置文件中定义bean,可以在Java Class中通过注解配置bean。当然,JavaConfig只是个替代方案,不建议使用。第一步、bean定义 以前用xml注册bean:<bean id="messi" class="twm.spring.LifecycleTest.footba原创 2017-04-12 19:54:47 · 4049 阅读 · 0 评论 -
【Spring学习29】cglib的Lookup方法
在长生命周期的bean引用短生命周期bean时,会有一个问题。 比如singleton 类依赖了prototype类,容器会在singleton 类初始化时,就根据依赖关系将prototype类注入。以后的每一次调用singleton bean都是同一个对象,里面的prototype bean也是最初注入的那个,容器再也不会为singleton bean产生新的prototype bean。 在《原创 2017-04-12 20:01:13 · 1006 阅读 · 0 评论 -
【Spring学习25】容器级启动和关闭回调
之前我们谈了bean的生命周期中利用容器扩展点回调,来实现后置处理器以及bean的初始和销毁回调。但这些事件都是建立在容器已经成功启动的基础上,如果我们想在容器本身的生命周期(比如容器启动、停止)事件上做一些工作怎么办呢?Spring提供了以下接口:Lifecycle接口任何Spring管理的对象都可以实现此接口。当ApplicationContext接口启动和关闭时,它会调用本容器内所有的Life原创 2017-04-09 20:22:20 · 3678 阅读 · 0 评论 -
【Spring学习26】Aware相关接口
Aware,是感应和感知的意思。当bean实现了对应的Aware接口时,BeanFactory会在生产bean时根据它所实现的Aware接口,给bean注入对应的属性,从而让bean获取外界的信息。Spring提供了一堆Aware接口:下面列出几个主要Aware接口作用:org.springframework.context.ApplicationContextAware接口:实现类的实例将会获取A原创 2017-04-10 19:51:10 · 3049 阅读 · 0 评论 -
【Spring学习27】回顾总结Spring常用注解
前面已经多次用到了注解,如自动装配、扫描,bean初始化及销毁回调等 现在汇总并回顾一下:1、 @Autowired 注解要让@Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。<!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -原创 2017-04-10 20:06:00 · 2003 阅读 · 0 评论 -
【Spring学习21】Bean生命周期回调:初始化回调和销毁回调
实现Bean初始化回调和销毁回调各有三种方法,一是实现接口方法,二是在XML配置,三是使用注解初始化回调1、使用接口org.springframework.beans.factory.InitializingBean接口类的作用是:在容器设置bean必须的属性之后执行初始化工作。 InitializingBean接口中只有一个方法:void afterPropertiesSet() throws原创 2017-04-06 21:03:54 · 2707 阅读 · 0 评论 -
【Spring学习22】容器扩展点:FactoryBean
FactoryBean接口是Spring IoC容器实例化逻辑的扩展点。什么叫扩展点?还记得前面说的bean生命周期(点击回顾)吗,Spring处理Bean生命周期的回调的事件就是扩展点。往下看例子就会明白。一、区别FactoryBean和BeanFactory首先不要混淆FactoryBean和BeanFactory。 BeanFactory直译是生产Bean的工厂,在Srping中就是容器,常原创 2017-04-06 21:11:41 · 1544 阅读 · 1 评论 -
【Spring学习23】容器扩展点:后置处理器BeanPostProcessor
综述先回顾bean生命周期的这张图,看看BeanPostProcessor调用位置 通过上图看到BeanPostProcessor(Bean后置处理器)两个方法在bean生命周期的位置,即:在Spring容器完成Bean实例化和属性设置后,并且在bean调用初始化方法之前或之后。因此BeanPostProcessor(Bean后置处理器)常用在:对bean内部的值进行修改;实现Bean的动态代理等原创 2017-04-06 21:24:09 · 1356 阅读 · 0 评论 -
【Spring学习24】容器扩展点:后置处理器BeanFactoryPostProcessor
上篇说到的BeanPostProcessor(Bean后置处理器)常用在对bean内部的值进行修改;实现Bean的动态代理等。 BeanFactoryPostProcessor和BeanPostProcessor都是spring初始化bean时对外暴露的扩展点。但它们有什么区别呢? 由《理解Bean生命周期》的图可知:BeanFactoryPostProcessor是生命周期中最早被调用的,远远原创 2017-04-06 21:34:39 · 4822 阅读 · 0 评论 -
【Spring学习01】Spring简介
一、Spring介绍spring直译是春天,所以以前开发时经常叫它春哥。实际上应该取弹性、跳跃的意思,指让代码更加灵活解耦,易于扩展。 百度百科上解释: Spring是分层的JavaSE/EE full-stack轻量级开源框架,以IoC(Inverse of Control 反转控制)和AOP(Aspect Oriented Programming 面向切面编程为内核)。这里涉及到两原创 2017-03-30 20:37:13 · 2231 阅读 · 0 评论 -
【Spring学习02】从官网下载Spring
一、获取Maven配置Spring的官网地址是:http://spring.io/。 需要Maven配置信息,可以到http://projects.spring.io/spring-framework/页面自动生成。 二、下载链接官方推荐的是通过Maven和Gradle配置远程获取组件的,所以很难直接在官网找到直接能下载组件的链接。 但可以直接打开地址http://repo.springsou原创 2017-03-30 20:44:51 · 1690 阅读 · 0 评论 -
【Spring学习03】Spring简单入门实例
国际惯例,从一个简单的例子入门,轻松了解依赖注入。 拿之前提到的场景: 假设我们开发了一套管理系统,每收到一笔订单后,系统调用notifyservice.sendMessage给客户发送订单成功邮件。有天老板(也有可能是产品)突然要改个需求:将原来的给客户发送邮件功能改为发手机短信。你无需改动任何代码,只是在配置中将“发送器”配置成“手机发送器”,就能完成工作。一、创建工程这里我们选择Dynam原创 2017-03-30 20:51:49 · 14389 阅读 · 7 评论 -
【Spring学习04】实例化上下文对象及加载多个配置文件
一、实例化上下文对象从前面的例子可以看到,在代码中实例化上下文对象非常简单,如下面的例子:ApplicationContext ctx = new ClassPathXmlApplicationContext( "spring-beans.xml"); FooService foo = (FooService) ctx.getBean("FooService");几个常用的类: ClassPat原创 2017-03-30 20:58:39 · 2931 阅读 · 0 评论 -
【Spring学习05】四种xml配置注入方式
平常应用Spring开发中,用得最多的是容器。spring容器帮我们实例化对象并且注入到需要该对象的类中。 spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:一、Setter注入set注入是最简单常用的注入方式,《【Spring学习03】Spring简单入门实例 》中就是用的set注入。 Order类中需要用到NotifyService对象,于是定义了一个p原创 2017-03-30 21:22:45 · 16904 阅读 · 2 评论 -
【Spring学习06】依赖配置:元素idref
首先区分 idref 和 ref 的区别:前面我们在setter注入中,多采用通过ref指向要注入的对象id:<bean id="notify" class="twm.spring.start.NotifyServiceByCellPhoneImpl" /><bean id="order" class="twm.spring.start.Order" > <!-- 配置要注入的对象 -->原创 2017-03-31 19:04:55 · 1374 阅读 · 0 评论 -
【Spring学习07】依赖配置:内部对象
内部对象就是对象的里面还有对象。。。。。好象是废话。 比如订单Order中,包含一个消费者Customer。那么Customer就是Order对象的内部对象。(有人叫内部类,我觉得不妥。内部类是指一个类的定义放在另一个类的内部,而这里是一个对象使用了另一个对象作为成员属性)Customer类:public class Customer {private String name; priv原创 2017-03-31 19:10:45 · 1220 阅读 · 2 评论 -
【Spring学习08】依赖配置:复合属性
本文博客地址:http://blog.youkuaiyun.com/soonfly/article/details/68928534(转载请注明出处) 接着上篇《【Spring学习07】依赖配置:内部对象 》的例子来。其实order的实例化还可以用复合属性来表示:<bean id="order" class="twm.spring.start.Order"> <property name="custom原创 2017-03-31 19:13:58 · 1424 阅读 · 3 评论 -
【Spring学习09】依赖配置:配置集合
Spring中通过<list>,<set>,<map>,<props>元素,来设置集合类型的属性或参数。 它们分别对应java类型的List,Set,Map,Properties。首先定义OrderCollect类:public class OrderCollect { Properties Emailconfig; List<String> Productnames; M原创 2017-03-31 19:20:46 · 1042 阅读 · 1 评论 -
【Spring学习10】依赖配置:bean的父子继承
Spring Bean的父子继承主要是为了统一定义Spring Bean的公共属性、作业范围scope,并避免了冗余和修改的繁琐。<beans><bean id="notify" class="twm.spring.start.NotifyServiceByCellPhoneImpl" /> <bean id="parent" abstract="true" class="example.原创 2017-03-31 19:23:47 · 2014 阅读 · 0 评论 -
【Spring学习11】PropertyPlaceholderConfigurer应用
PropertyPlaceholderConfigurer类的作用是加载外部的java Properties文件属性。 然后在XML文件中用${key}替换指定的properties文件中的值。这样的话,只需要对properties文件进 行修改,而不用对xml配置文件进行修改。 假设在外部添加了jdbc.properties,内容为:jdbc.driverClassName=com.mysql原创 2017-03-31 19:28:32 · 1419 阅读 · 4 评论 -
【Spring学习12】XML简写p-namespace及c-namespace
p-命名空间使用bean元素属性替代内嵌<property>元素,用来描述属性值或者协作类。 p命名空间并不是在XSD文件中,而是存在于Spring核心中。下面XML片段解释了:1使用了标准XML,第2个使用p-命名空间<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.or原创 2017-03-31 19:30:14 · 2338 阅读 · 0 评论 -
【Spring学习13】表达式语言(Spring EL)
p-namespace配合set注入,简写<property>元素的。 同样,配合构造注入,spring推出了c-namespace,允许行内配置构造参数,而不需使用内嵌的<constructor-arg/>元素beans加入 xmlns:c="http://www.springframework.org/schema/c"用c:namespace重构构造注入<beans xmlns="http:原创 2017-03-31 19:33:15 · 1208 阅读 · 0 评论 -
【Spring学习14】延迟初始化lazy-init与depends-on
一、lazy-initlazy-init是延迟初始化的意思。 spring中容器都是尽早的创建和配置所有的单例bean,因此当容器在启动时,就会去配置和创建单例bean。 这样做的好处是在程序刚运行时就可以将配置的错误或者环境问题立刻暴露出来。当然,坏处就是启动时,因为要初始化所有的单例bean,系统开销会很大,启动过程比较慢。如果不想单例bean提前实例化,可以设置lazy-initializ原创 2017-03-31 19:38:59 · 2869 阅读 · 0 评论 -
【Spring学习15】自动装配Bean
在Spring使用中,我们在xml配置文件通过<property>元素或<constructor-arg>元素的ref属性向bean注入另外的依赖bean。 如果使用自动装配(autowiring) ,就可以减少甚至消除配置<property>元素和<constructor-arg>元素。设置<bean>元素的autowire属性就可以设定bean的自动装配模式。自动装配有5种模式。 注意:自动原创 2017-04-05 21:18:48 · 2129 阅读 · 1 评论 -
【Spring学习16】自动检测Bean
一、自动检测自动检测(autodiscovery) 让Spring能够自动识别哪些类需要被装配成SpringBean 从而减少在xml配置文件对<bean> 元素的使用。 注:自动检测和是否使用注解无关,它并不局限应用于注解方式的编程(包括注解自动装配bean以及注解注册bean)第一步、标识用于装配的bean要想把类标识成可用于@Autowired自动装配的bean的类,采用以下注解可实现:原创 2017-04-05 21:34:42 · 1338 阅读 · 0 评论 -
【Spring学习17】bean作用域:单例和多例
Spring的 bean有5种作用域分别是:singleton、prototype、request、session和globalSession。 其中后三种request、session、global session专用于Web应用程序。这篇先谈单例和多例。1、singleton 单例在Spring里,通过容器创建的对象默认是singleton单例(这里要注意的是singleton作用域和GOF设原创 2017-04-05 21:41:44 · 5672 阅读 · 0 评论 -
【Spring学习18】bean作用域:Web作用域及配置
上篇提到常用的Web作用域有:Request, session, globalSession(portlet容器上使用) Web作用域介绍一、Request对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,每个HTTP request中的实例都是独立互不影响的的。 比如下面bean定义:<bean id="userrole" class="twm.demo.UserRole原创 2017-04-05 21:49:28 · 1965 阅读 · 0 评论 -
【Spring学习19】作用域:使用代理<aop:scoped-proxy/>
接上篇请这样做如果想把一个web作用域的Bean注入到另一个周期长的作用域的Bean中(比如单例的bean),就需要选择注入一个AOP代理来替换这个web作用域Bean。在定义时,web作用域的Bean都需要声明使用代理模式:配置中加上<aop:scoped-proxy/>元素官方文档的例子:<!-- 一个HTTP session作用域的Bean 作为代理暴露出去 --> <bean id=原创 2017-04-05 21:51:09 · 5065 阅读 · 0 评论 -
【Spring学习20】bean作用域:理解Bean生命周期
这篇主要用来理解Bean的生命周期。 在bean准备就绪给我们使用之前,容器默默的执行了很多启动步骤。Spring提供了BeanFactory作为Spring容器,平常开发中我们常用其派生类ApplicationContext。 尽管BeanFactory和ApplicationContext容器的注册方式不大一样(使用BeanFactory要显示的调用其addBeanPostProcessor原创 2017-04-06 20:53:56 · 4143 阅读 · 3 评论