① 如何利用Eclipse 查看Spring jar 包的源代码
在Eclipse查看开发包jar源码的方法如下:
1.选择项目,右键中单击【Properties】
2.【java Build Path】-【Libraries】,在下面找到如:org.springframework.core-3.1.0.M1.jar包,展开它,选择【Source attachment】,单击右边的【Edit…】按钮。
3.在打开的窗口中,可选择文件(jar\zip),目录或工作空间中的jar文件,在这里我选择External Folder…,选择如F:\Development Kit\spring-framework-3.1.0.M1-with-docs\spring-framework-3.1.0.M1\projects即可。
4.连续单击【OK】两次回到Eclipse工作平台即可。
我的为什么不行啊
我【Java Build Path】-【Libraries】找到spring.jar,展开,选择【Source attachment】,单击右边的【Edit…】按钮,选择workspace,输入:/autojboa/WebContent/WEB-INF/lib/spring.jar,最后运行到saveOrUpdate还是进不去,我的/autojboa/WebContent/WEB-INF/lib/spring.jar目录下有spring.jar
② spring源码分析
从切入分析源码,
的类图,其中继承了GenericApplicationContext,也继承了BeanDefinitionRegistry
分析这三个重要的方法
this.scanner = new (this);
实例化了扫面类,但是不是用这个类去扫面要加载的类,那这个类的作用是什么,是我们手动的扫面,看下面的例子
spring源码中会自动的扫描包下的类,比如标注了@Component @Configuration等注解的类,自动扫描的时候,会重新有从新new了一个(this);后续的文章会分析,那我们想手动的扫描呢,用的就是这个scanner
主要是读取配置类这里就是MyConfiguration.class,要注意的是只是将配置类加载到beanDefinitionMap中,不会去解析,通过refresh()方法解析的 ,并注入了很多的BeanFacrotyPostProcessor
this.reader = new AnnotatedBeanDefinitionReader(this);
AnnotationConfigUtils.(this.registry);
最终调用AnnotatedBeanDefinitionReader的有参构造器
方法
构造函数的register(componentClasses);
-->AnnotatedBeanDefinitionReader#register的this.reader.register(componentClasses);
-->AnnotatedBeanDefinitionReader#doRegisterBean
就是最重要的refresh();方法,再后续的文章分析
③ 如何查看spring源码
1.准备工作:在官网上下载了Spring源代码之后,导入Eclipse,以方便查询。
2.打开我们使用Spring的项目工程,找到Web.xml这个网站系统配置文件,在其中找到Spring的初始化信息:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
由配置信息可知,我们开始的入口就这里ContextLoaderListener这个监听器。
在源代码中我们找到了这个类,它的定义是:
public class ContextLoaderListener extends ContextLoader
implements ServletContextListener {
…
/**
* Initialize the root web application context.
*/
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
if (this.contextLoader == null) {
this.contextLoader = this;
}
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
...
}
该类继续了ContextLoader并实现了监听器,关于Spring的信息载入配置、初始化便是从这里开始了,具体其他阅读另外写文章来深入了解。
二、关于IOC和AOP
关于Spring IOC 网上很多相关的文章可以阅读,那么我们从中了解到的知识点是什么?
1)IOC容器和AOP切面依赖注入是Spring是核心。
IOC容器为开发者管理对象之间的依赖关系提供了便利和基础服务,其中Bean工厂(BeanFactory)和上下文(ApplicationContext)就是IOC的表现形式。BeanFactory是个接口类,只是对容器提供的最基本服务提供了定义,而DefaultListTableBeanFactory、XmlBeanFactory、ApplicationContext等都是具体的实现。
接口:
public interface BeanFactory {
//这里是对工厂Bean的转义定义,因为如果使用bean的名字检索IOC容器得到的对象是工厂Bean生成的对象,
//如果需要得到工厂Bean本身,需要使用转义的名字来向IOC容器检索
String FACTORY_BEAN_PREFIX = "&";
//这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就象一个大的抽象工厂,用户可以根据名字得到需要的bean
//在Spring中,Bean和普通的JAVA对象不同在于:
//Bean已经包含了我们在Bean定义信息中的依赖关系的处理,同时Bean是已经被放到IOC容器中进行管理了,有它自己的生命周期
Object getBean(String name) throws BeansException;
//这里根据bean的名字和Class类型来得到bean实例,和上面的方法不同在于它会抛出异常:如果根名字取得的bean实例的Class类型和需要的不同的话。
Object getBean(String name, Class requiredType) throws BeansException;
//这里提供对bean的检索,看看是否在IOC容器有这个名字的bean
boolean containsBean(String name);
//这里根据bean名字得到bean实例,并同时判断这个bean是不是单件,在配置的时候,默认的Bean被配置成单件形式,如果不需要单件形式,需要用户在Bean定义信息中标注出来,这样IOC容器在每次接受到用户的getBean要求的时候,会生成一个新的Bean返回给客户使用 - 这就是Prototype形式
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//这里对得到bean实例的Class类型
Class getType(String name) throws NoSuchBeanDefinitionException;
//这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
实现:
XmlBeanFactory的实现是这样的:
public class XmlBeanFactory extends DefaultListableBeanFactory {
//这里为容器定义了一个默认使用的bean定义读取器,在Spring的使用中,Bean定义信息的读取是容器初始化的一部分,但是在实现上是和容器的注册以及依赖的注入是分开的,这样可以使用灵活的 bean定义读取机制。
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
//这里需要一个Resource类型的Bean定义信息,实际上的定位过程是由Resource的构建过程来完成的。
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
//在初始化函数中使用读取器来对资源进行读取,得到bean定义信息。这里完成整个IOC容器对Bean定义信息的载入和注册过程
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws
BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
④ 想看spring源码 该怎么看
1、在你的MyEclipse上安装一个反编译插件,这样,所有的class文件都能看到它的源代码 2、建议你用jad MyEclipse反编译插件。 3、要相应jar包,我上传给你了。
⑤ 如何评价spring源码深度解析
您好,希望以下回答能帮助您 《SPRING技术内幕——深入解析SPRING架构与设计原理》 该书讲了spring的ioc容器原理,在xml的spring配置文件中,对象是如何解析并生成的。 spring的aop,面向切面编程。这两块是比较重要的,属于核心部分。 其他的如spring mvc ,spring jdbc与hibernate,ibatise集成,spring事务,spring security, spring 任务调度都有介绍。 大体来说,属于跟着代码走向,一个类一个类介绍了一下。其实代码都是有英文注释的。 跟着作都的思路看过来也还是可以的,最好是对照类图分析。 如您还有疑问可继续追问。
⑥ 怎么阅读Spring源码
准备工作
1. 安装github:现在spring源代码都在github管理,所以首先需要下载githup,下;
2. 安装gradle构建工具: 下载完后进行解压到任意盘符,然后增加环境变量GRADLE_HOME,并在环境变量bin中增加%GRADLE_HOME%/bin,打开DOS窗口,运行gradle -v,出现版本号等信息,表示安装成功;
3. 下载Spring源码:首先打开git shell,切换到你的工作目录,然后输入以下命令:git clone git://github.com/SpringSource/Spring-framework.git,后面一串是源码下载地址。大概半小时的样子,就可以下载完成,这时候在你的工作目录中就会出现Spring-framework的目录,里面有Spring各组件的源码包;
4. 构建导入:下载下来的代码不能直接导入Eclipse,要先转换成Eclipse能读取的形式。因为所有组件都会依赖spring-core,所有我们首先要转换Spring-core工程,在命令窗口切换到Spring-core工程,运行gradle cleanidea eclipse命令,我们会看到开始下载工程所依赖的jar包,几分钟后执行完毕,再来看Spring-core文件夹,多了.classpath、.project等文件,这是Eclipse工程所必须的,然后可以把他导入到eclipse。因为大部分Spring组件都会用到 spring-beans、spring-context、spring-aop,而他们又依赖spring-expression、spring-instrument,所以我们干脆先把这些工程都进行转换并导入eclipse。
我初次导入过程并不顺利,拿spring-core为例,其中以来的一个jar包是Spring-framework/spring-core/build/libs/spring-asm-repack-4.0.jar,但我工程里面并没有他,只好在网上下载了一个,并加入构建路径,其次我还发现少commons-pool-1.5.3.jar、spring-cglib-repack-3.0.jar,都一一下载,最后还是报错没有java.util.concurrent.ForkJoinPool类,发现这个版本必须使用jdk1.7以上,1.6没有这个包。折腾半天,终于几个工程没变异错误了,向前迈进了一步。
⑦ 如何阅读Spring源码
如果你是一名JAVA开发人员,你一定用过Spring Framework。 作为一款非常经典的开源框架,从2004年发布的1.0版本到现在的5.0版本,已经经历了16年的洗礼。可以说这是一款老框架了(当然这里的老仅仅指的是时间).
在这16年中,涌现了很多技术,大多昙花一现,但Spring经久不衰。随着技术的演进与版本的更迭,Spring框架总能不落后于技术的潮流,总能紧跟时代的步伐。
究竟是什么样的设计可以让它经久不衰?究竟它体现了一种什么样的设计哲学?
阅读Spring源码之前的准备:
熟练使用Spring框架:只有当你熟练了,阅读其源码水到渠成
扎实的JAVA基础:如果你不具备扎实的JAVA基础,那么请不要轻易尝试,否则只是浪费宝贵的时间。那么怎么样才算是基础扎实呢?此处暂列出一些基本精通的东西,如集合框架(数据结构的实现),多线程技术(线程池、线程安全、并发容器等),反射与注解(Spring中大量的使用到了反射),面向对象(面向对象不仅仅指的是对象抽象,还包括对象集成、多态等各种机制)以及JAVA的一些其他高级特性(如基于java接口的动态代理等)
设计模式:Spring中大量的使用了各种设计模式已提高其健壮性,因此对于设计模式需要一些深刻的理解.
绘制UML能力:在阅读的时候,肯定是要探究其核心对象之间的关系,而UML类图不失为一种非常直观的方式.
激情与毅力:学习一件事物的时候激情是非常重要的,但毅力才是体现成败的关键.
如何开始阅读:
了解其整体架构与核心概念以便建立Spring的模型
从框架入口开始抽丝剥茧,理解其每一个核心概念以及作用,并将这些核心技术点融汇起来
探究每一个核心的实现细节(UML图、跑单元测试用例、DEBUG,体悟)
以上,仅为我自己阅读源码的方式。
工作中一直得益于Spring带来的便利,对于Spring的使用应该很是熟练了,但对于它的设计理念与整体架构却没有一个非常清晰明了的认知。
很久之前就想过要阅读Spring的源码了,但一直是无从下手的状态。也曾尝试着debug去强行阅读, 但不了解的地方甚多。 于是反省自己java的基础,反省自己阅读的方式。
经过一段很长时间的查缺补漏, 终于可以顺利的去阅读Spring的源码了,所以在此处加以记录。
⑧ 阿里内部都在用的Spring源码手册,学会也是阿里人
最近在使用Spring MVC过程中遇到了一些问题,网上搜索不少帖子后虽然找到了答案和解决方法,但这些答案大部分都只是给了结论,并没有说明具体原因,感觉总是有点不太满意。
更重要的是这些所谓的结论大多是抄来抄去,基本源自一家,真实性也有待考证。
那作为程序员怎么能知其所以然呢?
此处请大家内心默读三遍。
阅读源码的魅力在于:
分享一本阿里内部人都在使用的Spring源码手册分享给读者朋友们,学会掌握了本手册内容,距离成为阿里人也是成功的跨了一大步子。
第一部分:核心实现原理
第二部分:企业应用
⑨ JAVA架构师没看过spring源码正常吗
不正常,
Spring在国内已经是一个庞大的生产级开发框架,作为架构师,特别是Java架构师,一定得了解其相关源码