初探Spring(一)

吃的苦中苦,方为人上人


文章目录

  • 初探Spring(一)
  • 前言
  • 一、spring入门?
  • 二、Spring只是这样吗?
    • 2.spring是如何创建对象的
    • 3.bean创建的过程
    • 3.bean创建的过程
  • 总结

前言

1.Bean的生命周期底层原理
2.依赖注入
3.初始化
4.推断构造方法
5.AOP
6.spring事务


以上6点我认为是spring框架的核心点

一、spring入门?

首先来看看spring入门使用的代码。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();

对于这三行代码其实大多数人都是比较熟悉的,这个其实就是spring的Hello Word 可是这三行都做了什么呢?一起来看一下

  • 一、第一行代码,构造了一个ClassPathXmlApplicationContext对象,ClassPathXmlApplicationContext该如何理解,调用该构造方法除了会实例化一个对象,还会做什么?

  • 二、第二行代码,调用了ClassPathXmlApplicationContext的getBean方法,会得到一个UserService对象,getBean()是如何实现的?返回的UserService对象和我们直接new出来的UserService对象又有什么区别?

  • 三、第三行代码就是调用了UserService的一个test方法,这个不难理解。

二、Spring只是这样吗?

光看这三行代码其实并不能体现出来Spring的强大之处,也不能理解为什么要使用ClassPathXmlApplicationContext和getBean方法,随着慢慢深入的了解将会消除你心中的疑问。
但是使用ClassPathXmlApplicationContext这种方式已经过时了,在新版的Spring Boot底层主要使用的是AnnotationConfigApplicationContext 比如

代码如下(示例):

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();

可以看到AnnotationConfigApplicationContext跟ClassPathXmlApplicationContext这种方式使用非常类似只不过前者使用的是class文件 后者使用的是xml这种方式。但其实这两者都是一样的都是表示的spring的配置只不过形式不同
(例如spring.xml):

<context:component-scan base-package="com.zhouyu"/>
<bean id="userService" class="com.zhouyu.service.UserService"/>

(例如AppConfig):

@ComponentScan("com.app")
public class AppConfig {@Beanpublic UserService userService(){return new UserService();}}

2.spring是如何创建对象的

其实不管是那种形式,目前我们都可以把他理解为都是用来创建java对象的,比如调用getBean()就是来创造对象的(不是很严谨闲这样理解)在java中肯定是根据一个类来创造对象的

代码如下(示例):

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) context.getBean("userService");
userService.test();

当我们去context.getBean(“userService”);时,就回去创建一个对象,但是getBean方法内部是怎么知道“userService”对应的是UserService这个类呢?
所以我们就可以分析出来,在调用AnnotationConfigApplicationContext这个的时候也就是第一行代码可能要做一些事情。

  • 解析AppConfig.class方法,得到扫描的路径

  • 遍历所有的java类,如果发现某些方法上面有@Component、@Service等注解,那么spring就把这些类记录下来存到一个map中去,比如Map<String,
    Class>。(实际上,Spring源码中确实存在类似的这么一个Map,叫做BeanDefinitionMap

  • spring会根据某个规则生成当前类对应的beanName,作为Key存到map中去,当前类做为这个key的value.

这样,但调用context.getBean(“userService”)时,就可以根据"userService"找到UserService类,从而就可以去创建对象了。​

3.bean创建的过程

spring到底是如何创建bean的呢?这个其实就是bean的生命周期的过程

  • 利用该类的构造方法去实例化一个对象,但是其实一个类中会有多个构造方法,(这个其实就是推断构造方法,spring会选择)
  • 得到一个对象之后,spring会判断该对象中是否存在被@Autowired注解的属性把这些属性进行赋值(依赖注入)
  • 依赖注入后,Spring会判断该对象是否实现了BeanNameAware接口、
    BeanClassLoaderAware接口、BeanFactoryAware接口,如果实现了,就表示当前对象必须要实现该接口中所定义的setBeanName()、setBeanClassLoader()、setBeanFactory().那么spring就会调用这些方法(Aware回调)
  • Aware回调后,spring会判断该对象中的是否存在某个方法被@PostConstruct注解了,如果存在,spring会调用当前对象的此方法(初始化前)
  • 紧接着,Spring会判断该对象中的某个方法被@PostConstruct 注解了,如果存在,spring会调用当前对象的此方法(初始化前)
    -紧接着,spring会判断该对象是否实现了InitializingBean接口,如果实现了,就表示当前对象必须实现 该接口中的afterPropertiesSet()方法,那么spring就会调用当前对象中的afterPropertiesSet()方法(初始化)
    -最后,如果spring会判断当前对象需不需要进行AOP,如果不需要那么bean就创建完了,如果需要进行aop,则会进行动态代理创建一个代理对像作为Bean(初始化后)
  • 通过最后一步我们可以发现,当spring根据UserService类来创建一个bean的时候:
  • 1.如果不用进行AOP那么Bea就是UserService类构造方法所得到的对像。
  • 2.如果需要进行AOP,那么bean就是UserService的代理类所实例化的对象,而不是UserService本身所得到的对像。
  • bean创建出来对象后:
  • 1.如果当前bean是单例的那么会给他存到一个map<String,Object>中,map对应的是beanName,value为bean的对象,这样下次获取bean的时候就直接可以直接从map中获取到bean的对象了,
  • 2.如果bean是多例的,那么就不会存到这个map中,每次拿的时候就会创建一个新的bean。(重新执行上述创建的过程)

3.bean创建的过程

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

初探Spring(一)相关推荐

  1. SSM框架笔记09:初探Spring——采用Java配置方式

    初探Spring--采用Java配置方式   在上一讲的项目基础上继续.   1.在javaconfig包里创建杀龙任务类SlayDragonQuest package net.hw.spring.c ...

  2. SSM框架笔记08:初探Spring——采用配置类与注解方式

      初探Spring--采用配置类与注解方式   在上一讲的项目基础上继续.   不仅采用注解方式,而且用配置类替换Spring配置文件.   1.将xml_annotation包里的两个接口和四个类 ...

  3. SSM框架笔记07:初探Spring——采用XML配置文件与注解方式

    初探Spring--采用XML配置文件与注解方式   在上一讲的项目基础上继续.   1.将xmlconfig包里的两个骑士类和两个任务类拷贝到xml_annotation包 2.修改SlayDrag ...

  4. SSM框架笔记06:初探Spring——采用XML配置方式

    初探Spring--采用XML配置方式   Spring框架是一个轻量级的企业级开发的一站式解决方案.所谓解决方案就是可以基于Spring解决Java EE开发的所有问题.Spring框架主要提供了I ...

  5. 初探Spring MVC 请求处理流程

    Spring MVC 相对于前面的章节算是比较简单的,我们首先引用<Spring in Action>上的一张图来了解Spring MVC 的核心组件和大致处理流程: 从上图中看到 ①.D ...

  6. Spring框架学习笔记04:初探Spring——采用Java配置类管理Bean

    文章目录 一.课程引入 二.采用Java配置类管理Bean (一)打开项目[SpringDemo2021] (二)创建net.hw.spring.lesson04包 (三)创建杀龙任务类 (四)创建勇 ...

  7. Spring框架学习笔记03:初探Spring——利用注解配置类取代Spring配置文件

    文章目录 一.课程引入 二.利用注解配置类取代Spring配置文件 (一)打开项目[SpringDemo2021] (二)创建net.hw.spring.lesson03包 (三)移植上一讲的接口和类 ...

  8. Spring框架学习笔记02:初探Spring——利用组件注解符精简Spring配置文件

    文章目录 一.课程引入 二.打开项目[SpringDemo2021] 三.利用组件注解符精简Spring配置文件 1.创建net.hw.spring.lesson02包 2.将lesson01子包的四 ...

  9. Spring框架学习笔记01:初探Spring——采用Spring配置文件管理Bean

    文章目录 一.Spring概述 二.入门案例演示 (一)创建Maven项目[SpringDemo2021] (二)在pom.xml文件里添加依赖 场景:勇敢的骑士去完成杀龙的任务. (三)创建杀龙任务 ...

最新文章

  1. 带你和Python与R一起玩转数据科学: 探索性数据分析(附代码)
  2. java好还是python好-Python和Java哪个薪资更高、远景更好?
  3. Java自带的多线程监控分析工具(VisualVM)
  4. JavaScript基础学习之数据类型(一)
  5. 回旋矩形C语言,C语言程序设计100例之(27):回旋方阵
  6. Y/C分离/2/3D滤波器
  7. cms安装教程Linux,DoraCMS安装教程(linux)
  8. Linux 安装Eclipse
  9. InfoWorld 公布开源软件( 2019 年)
  10. 安卓pdf取词翻译软件_写论文,你应该知道这些好用的论文翻译软件!
  11. 第1章 信息化和信息系统
  12. php spider视频教程,phpspider的简单使用
  13. VS 下环境覆盖率测试
  14. 线性回归及RANSAC异常值清除算法案例
  15. 基于Jquery和xml文件来实现省市区3级联查
  16. 数据仓库实践-拉链表设计
  17. 智能管家项目总结(2)
  18. ODrive配置云台电机GIMBLE_TYPE
  19. 安卓 手柄 linux,Linux joystick 游戏手柄编程 (获取输入数据)
  20. 将SSH多次登录失败的IP加入黑名单

热门文章

  1. ACM模式输入输出攻略 | C++篇
  2. 基于图像的三维重建——捆绑调整(6)
  3. 名企过来人畅谈IT求职两注意
  4. 和差化积公式 与 积化和差公式的推导
  5. 解决65535的方法
  6. 联想笔记本e480恢复出厂设置_联想ThinkPad E480笔记本win10怎么改win7
  7. Linux 系统安全与优化配置
  8. UGC网站的内容审核管理是怎么做的?
  9. java中从1到101的素数_「1是不是质数」在c#中完成1到10的素数(1不是素数) - seo实验室...
  10. 【如何制作电子书】云展网教程 | 默认显示模式:翻页、单页、滑页