spring是个顶级的框架,这话没毛病。很多人想把它征服,想去阅读它的源码,弄懂它的设计思想,从中学到精粹。

但是很多次打开后,看到庞大的体系结构,就懵逼了,不知从何入手。

我在这里总结下学习spring的切入点:

  • IOC
    控制反转,是spring的核心吧,对于bean的生面周期的管理。

  • AOP
    面向切面编程,基于JDK动态代理和cglib字节码实现。

首先从IOC开始吧,控制反转,就是将对象的创建转移给框架,不需要你去new,你只需要通过配置或者注解来让它知道从哪入手。这样做有什么好处?

  1. 不用再编写创建对象的代码和维持其复杂的依赖关系。
  2. 定义一个接口,可以方便更改其实现类,或者注入需要的属性。

然后就是自己写个简单的接口和实现,开始debug,通过xml配置的方式来注入bean:

<bean id="test" class="com.fcs.xmls.TestBean"><!-- 配置属性phone --><property name="phone" value="15507516532"></property><!-- 配置属性age,虽然此处是字符串“25”,但是Spring会识别age的类型,然后把字符串“14”转变后赋值给age --><property name="age" value="25"></property>
</bean>

用下面的方式获取bean:

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
TestBean t = (TestBean) ac.getBean("test");

用idea弄个类继承关系图:

可以看到BeanFactory,从命名可以看出来这是个工厂模式,所以从这里你需要了解工厂模式(工厂方法模式)。

在跟踪的过程中,很容易就跳到了AbstractApplicationContext 中的refresh 方法,在这个方法做了一系列操作:

    public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}}

同样,用注解来一波:

@Component
public class MessagePrinter {final private MessageService service;@Autowiredpublic MessagePrinter(MessageService service) {this.service = service;}public void printMessage() {System.out.println(this.service.getMessage());}}
ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
MessagePrinter printer = context.getBean(MessagePrinter.class);

也可得到下图:

两者的上层结构基本相同,分离点也在AbstractApplicationContext ,各自有了不同的扩展。所以重点还是在AbstractApplicationContext 的refresh 方法。

这里可以看到第二个模式:模板方法模式。在AbstractApplicationContext 中定义算法簇,子类做不同的具体实现。

这就是切入点了。只是简单的分析下,细节还得去看,如果看不下去,还得学习设计模式。此外思想可以参考spring-tiny,一个简单的ioc容器实现。

转载于:https://www.cnblogs.com/lucare/p/9312655.html

Spring学习的切入点相关推荐

  1. Spring学习笔记(三) AOP_annotation,AOP_XML

    在学习课程以前,听说AOP有种很神秘的感觉,好像很好深的技术.其实原理很简单,使用动态代理的方式给程序增加逻辑.与此相似的有struts2中的filter拦截器. 再讲AOP之前先把需求说一下: 同S ...

  2. Spring学习总结三

    Spring框架JdbcTemplate与事务 Spring学习总结三 0.需要的jar包 1.JdbcTemplate模板 1.1.JdbcTemplateAPI的操作 1.1.1.User类 1. ...

  3. Spring学习总结二

    Spring框架的代理与AOP.AspectJ Spring学习总结二 0.在理解什么是AOP之前的一些话 1.什么是AOP 2.AOP的重要概念 3.代理模式 3.1.静态代理 3.2.动态代理 3 ...

  4. Spring学习(三)Spring AOP 简介

    本文借鉴:Spring学习(特此感谢!) 一.简介 定义 aop就是面向切面编程,在数据库事务中切面编程被广泛使用. 在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 核心业务:比如登陆 ...

  5. 【Spring学习笔记 九】Spring声明式事务管理实现机制

    什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...

  6. Spring 学习笔记----->AOP

    Spring 学习笔记----->AOP 代理模式 为什么学代理模式? 因为这就是Spring Aop的底层 代理模式的分类: 静态代理 动态代理 静态代理 生活用的例子: 房东 public ...

  7. Spring——Spring学习教程(详细)(上篇)——IOC、AOP

    本文是Spring的学习上篇,主要讲IOC和AOP. Spring的JDBCTemplete以及事务的知识,请见下篇. Spring--Spring学习教程(详细)(下篇)--JDBCTemplete ...

  8. 我的Spring学习记录(二)

    本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...

  9. 第四阶段--Spring学习-03

    第四阶段--Spring学习 13.AOP简介 13.1 什么是AOP? 13.2 AOP作用 13.3 AOP核心概念 14.AOP入门案例 14.1 AOP入门案例思路分析 14.2 环境准备 1 ...

最新文章

  1. [JVM-翻译]揭开java.lang.OutOfMemoryError面纱之一
  2. Android 之 Shape (圆角输入框)
  3. 兼容IE各版本的纯CSS二级下拉菜单
  4. 什么事计算机事实性知识,《人工智能》复习要点
  5. FreeRTOS任务挂起和恢复
  6. 双11特刊|购物车实时显示到手价,看云原生内存数据库Tair如何提升用户体验?
  7. Linux 下 Mysql 区分大小写
  8. html定义盒子距离顶底端像素,css - 盒子内外边距
  9. 虚拟机中利用qemu调试跟踪linux内核
  10. 微信公众平台开发网页开发
  11. 开源视频服务器软件MJPG-streamer研究
  12. word有空白段删不掉 解决办法
  13. VBScript脚本运用(脚本程序与宿主程序的交互)
  14. 风暴孵化:手游代理加盟水很深,如何避免入坑?
  15. react分页组件实现:DiReactPagination
  16. java为属性提供访问器方法_关于继承:Java不继承访问器方法吗?
  17. 购买企业邮箱,哪个邮箱最好用?邮件撤回怎么操作?
  18. 初学平面设计如何制作出有创意的作品
  19. 【码云周刊第 7 期】拥抱 HTTPS,首个完整版开源机器人项目亮相
  20. Premiere Pro CC 2019报错,安装失败:需要升级版本1703

热门文章

  1. python中的二进制、八进制、十六进制的相互转换
  2. linux下使用ffmpeg命令录屏桌面
  3. Intel深度摄像头RealSense D345(实感双目摄像头)和目标检测结合使用
  4. numpy中线性代数库的使用Linear Algebra
  5. windows命令行帮助文档如何使用
  6. lua学习笔记之元表和元方法
  7. jsoncpp的输出顺序
  8. Makefile中常用的函数
  9. sql 脚本编写之路 常用语句(一) 1.用一个表中的某一列更新另外一个表的某些列:...
  10. 爬虫--用python中requests和urllib模块爬取图片