![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
spring源码解析
文章平均质量分 69
你猜我猜不猜你猜不猜
java程序猿
展开
-
Spring消息(一)
Java消息服务(java Message Sevice,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间或分布式系统中发送消息,进行异步通信。Java消息服务时一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。java消息服务的规范包括两种消息模式,点对点和发布者/订阅者。许多提供商支持这一通用框架。因此,程序员可以在他们原创 2016-11-22 23:08:44 · 866 阅读 · 0 评论 -
Spring的事务控制
Spring的事务控制让我们从复杂的事务处理中得到解脱,是我们再也不需要去处理获得连接,关闭连接,事务提交和回滚等操作,再也不需要在事务相关的方法中处理大量的try..catch...finally代码。我们先看下Spring中的事务控制代码: <bean id="sqlsessionfactory" class=原创 2016-07-18 21:45:52 · 1093 阅读 · 0 评论 -
Spring整合MyBatis(二)源码分析
在Spring配置Mybatis的文件中我们可以看到如下代码: MapperScannerConfigurer,让它扫描特定的包,自动帮我们成批地创建映射器。这样就大大减少了配置的工作量。basePackage属性是让你为映射器接口文件设置基本的包路径。可以使用分号或逗号作为分隔符设置多于一个的包路径。每个映射器都会在指定的包路径中递归地被搜索到。被发现的映射器将会使用Spri原创 2016-07-18 20:05:40 · 4243 阅读 · 0 评论 -
bean的加载(五)获取单例
之前我们说过从缓存中获取单例的过程,但如果缓存中不存在已经加载的单例bean就需要从头开始bean的加载过程了,Spring中使用了getSingleton的重载方法实现bean的加载过程。上述代码中其实,使用了回掉方法,使得程序可以在单例创建的前后做一些准备及处理操作,而真正获取单例bean的方法其实并不是在此方法中实现的,器其实现逻辑是在ObjectFactory类型的实例single原创 2016-07-07 15:11:38 · 1671 阅读 · 0 评论 -
Spring整合MyBatis
MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由Apache Software Foundation迁移到了Google Code,并且改名为MyBatis(MyBatis源码下载地址为:http://code.google.com/p/mybatis/)MyBatis是支持普通的SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有JDBC原创 2016-07-18 10:23:03 · 1093 阅读 · 0 评论 -
Spring源码深度解析(三)Spring的结构组成
(1)beans包的层级结构阅读源码最好的方式是通过示例跟着操作走一遍,大多数时候可能会被复杂源码绕来绕去,绕到自己不知道身在何处,如果配合UML还是可以搞定的。我们先来spring-beans包的源码结构beans包中各个源码的功能如下。src/main/java用于展现Spring的主要逻辑src/mian/resources用于存放系统的配置文件src/test/ja原创 2016-06-21 20:40:24 · 8714 阅读 · 2 评论 -
bean的加载(四)从bean的实例中获取对象
在getBean方法中,getObjectForBeanInstance是个频繁使用的方法,无论是从缓存中获得bean还是根据不同的scope策略加载bean.总之,我们得到bean的实例后,要做的第一步就是调用这个方法来检测一下正确性,其实就是检测获得Bean是不是FactoryBean类型的bean,如果是,那么需要调用该bean对应的FactoryBean实例中的getObject()作为返原创 2016-07-07 11:52:09 · 2973 阅读 · 1 评论 -
bean的加载(三)缓存中获取单例bean
单例在Spring的容器中只会被创建一次,后续再获取bean直接从单例缓存中获取,这里是尝试加载,首先尝试从缓存中加载,然后再次尝试从singletonFactories中加载。因为在创建单例bean的时候会存在依赖注入的情况,而在创建依赖的时候为了避免循环依赖,Spring创建bean的原则是不等bean创建完成就会将创建bean的ObjectFactory提早曝光加入到缓存 中,一旦 下一个b原创 2016-07-05 13:10:43 · 1757 阅读 · 0 评论 -
SpringJDBC
JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯JavaAPI编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。JDBC原创 2016-07-15 18:24:49 · 3409 阅读 · 0 评论 -
SpringMVC(一)
Spring框架提供了构建Web应用程序的全功能MVC模块。通过策略接口Spring框架是高度可配置的,而且支持多种视图技术,例如JavaServerPages(JSP)技术,Velocity,Tiles(Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离),iText(一种生成PDF报表的Java组件)和POI.(POI提供API给Java程序对Microsoft转载 2016-07-19 12:33:01 · 1754 阅读 · 0 评论 -
bean的加载(六)准备创建bean
Spring源码中,我们不可能指望在一个函数中完成一个复杂的逻辑,而且我们跟踪了那么多Spring代码,经历了那么多函数,或多或少也发现了一些规律:一个真正干活的函数其实是以do开头的,比如doGetObjectFromFactoryBean;而给我们错觉的函数,比如getObjectFromFactoryBean,其实只是从全局角度去做一些统筹的工作。而这个规则对于createBean也不例外,原创 2016-07-08 14:50:16 · 1739 阅读 · 0 评论 -
SpringMVC(二)ContextLoaderListenner
对于SpringMVC功能实现的分析,我们首先从web.xml开始,在web.xml文件中我们首先配置的就是ContextLoaderListener,那么它所提供了功能有哪些又是如何实现的?当使用编程方式的时候我们可以将Spring配置传入到Spring容器中,如:ApplicationContext context = new ClassPathXmlApplicationContex转载 2016-07-19 20:41:52 · 1380 阅读 · 0 评论 -
AOP源码解析(四)寻找匹配的增强器
前面的函数中已经完成了所有增强器的解析,但是对于所有增强器来讲,并不一定都适用于当前的Bean,还要挑取除适合的增强器,也就是满足我们配置的通配符的增强器。具体的实现在findAdvisorsThatCanApply中。 public static List findAdvisorsThatCanApply(List candidateAdvisors, Class clazz) {转载 2016-11-01 23:12:32 · 813 阅读 · 0 评论 -
AOP源码解析(三)增强器的获取
普通增强器的获取逻辑通过getAdvisor方法实现,实现步骤包括对切点的注解的获取及根据注解信息生成增强。 public Advisor getAdvisor(Method candidateAdviceMethod, MetadataAwareAspectInstanceFactory aif, int declarationOrderInAspect, String aspectN转载 2016-10-31 23:17:49 · 972 阅读 · 0 评论 -
AOP源码解析(二)创建AOP代理
上文中讲解了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类到底做了什么工作来完成AOP的操作呢?首先我们看看AnnotationAwareAspectJAutoProxyCreator的层次结构public abstract class AbstractAdvisorAutoProxyCreator extends Ab转载 2016-10-31 22:09:31 · 843 阅读 · 0 评论 -
AOP源码解析(一)实现动态代理
动态AOP使用示例面向对象编程有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志,安全检测等,我们只有在每个对象里引入公共行为,这样程序中就产生了大量的重复代码,所以有了面向对象编程的补充,面向切面编程(AOP'),AOP所关注的方向是横向的,不同于OOP的纵向。下面是一个AOP的示例(1)创建用于拦截的bean。在实际工作中,此bean可能是满足业务需要的核心转载 2016-10-30 23:27:49 · 2147 阅读 · 0 评论 -
AOP源码解析(五)获取代理
确定了使用哪种代理方式后便可以进行代理的创建了(1)JDK代理使用示例。创建业务接口,业务对外提供的接口,包含着业务可以对外提供的功能。转载 2016-11-07 23:59:06 · 898 阅读 · 0 评论 -
SpringMVC(四) DispatcherServlet的逻辑处理
HttpServlet提供了不同的服务方法,它们是doDelete(),doGet(),doOptions(),doPost(),doPut(),和doTrace(),它会根据不同的请求形式将程序引导至对应的函数进行处理。这几个函数中最常用的函数无非就是doGet()和doPost(),我们看看DispatcherServlet对着两个函数的逻辑实现。 @Override protected f转载 2016-07-21 19:52:03 · 1790 阅读 · 0 评论 -
SpringMVC(三)DispatcherServlet
在Spring中,ContextLoaderListener只是辅助功能,用于创建WebApplicationContext类型实例,而真正的逻辑实现其实是在DispatcherServlet中进行的,DispatcherServlet是实现servlet接口的实现类。servlet是一个java编写的程序,此程序是基于HTTP协议的,在服务器端运行的(如Tomcat),是按照servlet规转载 2016-07-20 20:04:32 · 1839 阅读 · 0 评论 -
<mvc:default-servlet-handler />过滤器拦截静态资源
楼主曾经遇到过一个问题,就是根据需求,需要 拦截静态资源,进行过滤,过滤器配置如下 weChatFilter com.sinovatech.unicom.wechat.filter.WeChatFilter weChatFilter / 但是关于静态资源,比如.html页面.jsp页面等,怎么样都拦截不到,当时很不明白,楼主当时搞了一天还没搞定。后来在原创 2016-07-20 16:16:11 · 4129 阅读 · 0 评论 -
bean的加载(二) FactoryBean的使用
一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean.某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的的配置信息,配置方式的灵活性是受限的,这是采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.Springframework.bean.factory.FactoryBean的工厂类接口,用户通过实现该接口原创 2016-07-05 10:34:41 · 1785 阅读 · 2 评论 -
容器的功能扩展(三)finishRefresh
在Spring中还提供了Lifecycle接口,Lifecycle中包含start/stop方法,实现此接口后Spring会保证在启动的时候调用其start方法开始生命周期,并在Spring关闭的时候调用stop方法来结束生命周期,通常用来配置后台程序,在启动后一直运行.而ApplicationContext的初始化最后正是保证了这一功能的实现。 protected void finishRe转载 2016-07-15 10:59:49 · 1744 阅读 · 0 评论 -
Spring源码深度解析(七)获取Document
经过了验证模式准备的步骤就可以进行Document加载了,XmlBeanFactoryReader类对于文档读取并没有亲历亲为,而是委托给了DocumentLaoder去执行,DocumentLoader是个接口,真正调用的是DefaultDocumentLoader,解析代码如下:ddzaidf 在这里提及下EntityResolver,对于参数entityResolver,传入原创 2016-06-30 16:57:21 · 2990 阅读 · 2 评论 -
bean的加载(九)记录创建bean的ObjectFactory
在doCreateBean中有这样一段代码://是否需要提早曝光:单例&允许循环依赖&当前bean正在创建中,检测循环依赖 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));原创 2016-07-12 12:54:42 · 3066 阅读 · 1 评论 -
Spring源码深度解析(六)获取XML的验证模式
了解XML文件的都知道,XML文件的验证模式保证了XML文件的正确性,而比较常用的验证模式有两种:DTD和XSD.它们之间区别是:DTD与XSD验证模式的区别地方DTD(Document Type Definition)即文档类型定义,是一种XML约束模式语言,是XML文件的验证机制,属于XML文件组成的一部分。DTD是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文原创 2016-06-30 14:35:01 · 3847 阅读 · 0 评论 -
Srping源码深度解析(二)容器的基本用法
bean是spring中最核心的东西,我们看看bean的定义。public class MyTestBean{ private String testStr="testStr"; public String getTestStr(){ return testStr; } public void原创 2016-06-14 20:56:04 · 7977 阅读 · 0 评论 -
Spring源码深度解析(五)加载Bean
之前提到的在XmlBeanFactory构造函数中调用了XmlBeanDefinitionReader类型的reader属性提供的方法this.reader.loadBeanDefinitions(resource),而这句代码则是整个资源加载的切入点,我们先来看看这个方法的时序图,如图2-9所示:看到图2-9我们才知道,原来饶了这么久还没有切入正题,还一直在为加载XML文件和解析注册Be原创 2016-06-30 11:03:10 · 5988 阅读 · 3 评论 -
Spring源码深度解析(四)容器的基础XmlBeanFactory
现在我们已经对Srping的容器有了一个大概的了解,尽管很多地方还很迷糊,但是不要紧,下面我们开始探讨每个步骤的详细实现。接下来我们要深入分析以下代码的实现:BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));通过XmlBeanFactory初始化时序图,图2—7,我们看下上面代原创 2016-06-29 20:53:45 · 7248 阅读 · 3 评论 -
bean的加载(八)创建bean的实例
下面我们一步步分析doCreatBean方法,首先从createBeanInstance开始。protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) { // Make sure bean class is actually resolved at th原创 2016-07-11 20:17:00 · 3905 阅读 · 0 评论 -
SpringMVC(五)DispatcherServlet的逻辑处理
前面我们聊了关于Dispatcher逻辑处理大致步骤,下面我们进行详细的每个步骤分析MultipartContent类型的request处理对于请求的处理,Spring首先考虑的是对于Multipart的处理,如果是MultipartContent类型的request,则转换request为MultipartHttpServletRequest类型的request. protected H转载 2016-07-22 15:25:16 · 1531 阅读 · 0 评论 -
Spring源码深度解析(八)解析及注册BeanDefinitions
从下面开始说:这段代码还比较清晰,在Spirng的配置里面有两大类Bean声明,一个是默认的,如:另一类就是自定义的,如:两种方式解析差别还挺大的,如果采用Spring默认配置,Spring自然知道怎么做,而如果使用自定义的方式需要增加一些接口和配置了。原创 2016-06-30 19:46:58 · 2595 阅读 · 0 评论 -
bean的加载(十)属性注入
在了解循环依赖的时候,我们曾经反复提到了populateBean这个函数,也多少了解了这个函数的主要功能就是属性填充,那么如何实现填充呢?protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) { PropertyValues pvs = mbd.getPropertyValu原创 2016-07-12 18:03:25 · 5214 阅读 · 0 评论 -
bean标签的解析及注册(一)
Spring的标签中有默认标签和自定义标签,两者的解析有着很大的不同,这次重点说默认标签的解析过程。默认标签的解析是在parseDefaultElement函数中进行的,分别对4种不同的标签(import,alias,bean和beans)做了不同处理。在4中标签中对bean标签的解析最为复杂也最为重要,所以从此标签开始深入分析,如果能理解这个标签的解析过程,其他标签的解析就迎刃而解了。首原创 2016-07-01 16:04:34 · 2390 阅读 · 0 评论 -
bean的加载(一)
完成对xml配置文件的解析之后,接下来就是对bean的加载了,bean的加载功能远比bean的解析要复杂的多,关于bean的加载,我们都写过这样一段代码:MyTestBean bean = (MyTestBean)bf.getBean("MyTestBean");Spring 中是如何实现这句话的呢?从上面的代码就可以看出,bean的加载要远比bean的解析复杂,我们后原创 2016-07-04 20:50:11 · 1783 阅读 · 0 评论 -
bean标签的解析及注册(四)对alias,import,beans标签的处理
之前说过,对配置文件的解析包括对import,alias,bean,beans标签的处理现在已经完成了最核心的功能,其它三个的解析也是围绕着bean的解析来处理的。对alias标签的解析对bean进行定义时,除了用id来 指定名称外,为了提供多个名称,可以使用alias标签来指定。而所有这些名称都指向同一个bean。在XML配置文件中,可用单独的元素来完成bean别名的原创 2016-07-04 15:33:18 · 5045 阅读 · 0 评论 -
bean标签的解析及注册(四)注册解析的beanDefinition
对配置文件解析完成后,获取的beanDefiniton已经可以进行使用了,剩下的唯一工作就是注册了,也就是processBeanDefinition方法中的registerBeanDefinition中的代码如下:对于beanDefinition的注册,是将beanDefinition直接放入了map中,以beanName为key,但不仅仅如此,代码如下:2.通过别名注册B原创 2016-07-04 13:03:49 · 1896 阅读 · 0 评论 -
容器的功能扩展(二)功能扩展
进入函数prepareBeanFactory前,Spring已经完成了对配置的解析,而ApplicationContext在功能上的扩展也由此展开。 protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // Tell the internal bean factory to use原创 2016-07-14 16:41:55 · 4272 阅读 · 0 评论 -
容器的功能扩展(一)
我们前面一直以BeanFactory接口以及它的默认实现类XmlBeanFactory为例进行分析,但是Spring中还提供了另一个接口ApplicationContext,用于扩展BeanFactory中现有的功能。ApplicationContext和BeanFactory两者都是用于加载Bean的,但是相比之下,ApplicationContext提供了更多的扩展功能,简而言之:Appl转载 2016-07-13 20:55:05 · 1638 阅读 · 0 评论 -
bean标签的解析及注册(三)AbstractBeanDefinition属性
现在已经完成了XML文档到GenericBeanDefiniton的转化,也就是说,XML中所有的配置都在GenericBeanDefinition的实例类中找到了对应的位置。GenericBeanDefinition只是子类实现,大部分的属性都保存在了AbstractBeanDefinition中,下面我们看下这个类:解析完成后,BeanDefinition已经可原创 2016-07-01 19:34:46 · 2865 阅读 · 0 评论 -
bean标签的解析及注册(二)解析BeanDefinition
下面从元素解析及信息提取开始,也就是:1,2,3,我们进一步看步骤AbstractBeanDefinition beanDefinition=parseBeanDefinitionElement(ele,beanName,containingBean)中,对其他属性的解析过程,(我想再次重申一次,查看Spring源码是一个艰苦且枯燥的过程,如果能坚持下来,你原创 2016-07-01 18:46:23 · 3032 阅读 · 0 评论