初探Spring(一)
初探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(一)相关推荐
- SSM框架笔记09:初探Spring——采用Java配置方式
初探Spring--采用Java配置方式 在上一讲的项目基础上继续. 1.在javaconfig包里创建杀龙任务类SlayDragonQuest package net.hw.spring.c ...
- SSM框架笔记08:初探Spring——采用配置类与注解方式
初探Spring--采用配置类与注解方式 在上一讲的项目基础上继续. 不仅采用注解方式,而且用配置类替换Spring配置文件. 1.将xml_annotation包里的两个接口和四个类 ...
- SSM框架笔记07:初探Spring——采用XML配置文件与注解方式
初探Spring--采用XML配置文件与注解方式 在上一讲的项目基础上继续. 1.将xmlconfig包里的两个骑士类和两个任务类拷贝到xml_annotation包 2.修改SlayDrag ...
- SSM框架笔记06:初探Spring——采用XML配置方式
初探Spring--采用XML配置方式 Spring框架是一个轻量级的企业级开发的一站式解决方案.所谓解决方案就是可以基于Spring解决Java EE开发的所有问题.Spring框架主要提供了I ...
- 初探Spring MVC 请求处理流程
Spring MVC 相对于前面的章节算是比较简单的,我们首先引用<Spring in Action>上的一张图来了解Spring MVC 的核心组件和大致处理流程: 从上图中看到 ①.D ...
- Spring框架学习笔记04:初探Spring——采用Java配置类管理Bean
文章目录 一.课程引入 二.采用Java配置类管理Bean (一)打开项目[SpringDemo2021] (二)创建net.hw.spring.lesson04包 (三)创建杀龙任务类 (四)创建勇 ...
- Spring框架学习笔记03:初探Spring——利用注解配置类取代Spring配置文件
文章目录 一.课程引入 二.利用注解配置类取代Spring配置文件 (一)打开项目[SpringDemo2021] (二)创建net.hw.spring.lesson03包 (三)移植上一讲的接口和类 ...
- Spring框架学习笔记02:初探Spring——利用组件注解符精简Spring配置文件
文章目录 一.课程引入 二.打开项目[SpringDemo2021] 三.利用组件注解符精简Spring配置文件 1.创建net.hw.spring.lesson02包 2.将lesson01子包的四 ...
- Spring框架学习笔记01:初探Spring——采用Spring配置文件管理Bean
文章目录 一.Spring概述 二.入门案例演示 (一)创建Maven项目[SpringDemo2021] (二)在pom.xml文件里添加依赖 场景:勇敢的骑士去完成杀龙的任务. (三)创建杀龙任务 ...
最新文章
- 带你和Python与R一起玩转数据科学: 探索性数据分析(附代码)
- java好还是python好-Python和Java哪个薪资更高、远景更好?
- Java自带的多线程监控分析工具(VisualVM)
- JavaScript基础学习之数据类型(一)
- 回旋矩形C语言,C语言程序设计100例之(27):回旋方阵
- Y/C分离/2/3D滤波器
- cms安装教程Linux,DoraCMS安装教程(linux)
- Linux 安装Eclipse
- InfoWorld 公布开源软件( 2019 年)
- 安卓pdf取词翻译软件_写论文,你应该知道这些好用的论文翻译软件!
- 第1章 信息化和信息系统
- php spider视频教程,phpspider的简单使用
- VS 下环境覆盖率测试
- 线性回归及RANSAC异常值清除算法案例
- 基于Jquery和xml文件来实现省市区3级联查
- 数据仓库实践-拉链表设计
- 智能管家项目总结(2)
- ODrive配置云台电机GIMBLE_TYPE
- 安卓 手柄 linux,Linux joystick 游戏手柄编程 (获取输入数据)
- 将SSH多次登录失败的IP加入黑名单
热门文章
- ACM模式输入输出攻略 | C++篇
- 基于图像的三维重建——捆绑调整(6)
- 名企过来人畅谈IT求职两注意
- 和差化积公式 与 积化和差公式的推导
- 解决65535的方法
- 联想笔记本e480恢复出厂设置_联想ThinkPad E480笔记本win10怎么改win7
- Linux 系统安全与优化配置
- UGC网站的内容审核管理是怎么做的?
- java中从1到101的素数_「1是不是质数」在c#中完成1到10的素数(1不是素数) - seo实验室...
- 【如何制作电子书】云展网教程 | 默认显示模式:翻页、单页、滑页