- spring源码解析流程,一步一步在源码加注释带你了解bean的加载过程
笨蛋CXJ
springspringjava
spring前述:spring源码环境搭建以及源码下载在文章后方有链接,可自行参考搭建,这里只是对加载过程做一个解析,spring全家桶远不止这些东东,感兴趣的小伙伴可以去官网看一下,本文将以源码加注释的方式进行过程解析,带你了解spring中bean到底是如何一步步加载完成了解重点:bean的生命周期、加载过程最终目的:学习spring源码短期内不对对你的技术有太大提升,可能只是了解到漂亮的代码
- 专治不会看源码的毛病--spring源码解析AOP篇
八年码农
公众号编程一生昨天有个大牛说我啰嗦,眼光比较细碎,看不到重点。太他爷爷的有道理了!要说看人品,还是女孩子强一些。原来记得看到一个男孩子的抱怨,说怎么两人刚刚开始在一起,女孩子在心里就已经和他过完了一辈子。哥哥们,不想这么远行吗?看看何洁,看看带着俩娃跳楼的妈妈。所以现在的女孩子是很明白的,有些男孩子个子不高,其貌不扬,但是一看那人品气质就知道能找个不错的女盆友。不过要说看人的技术能力,男孩子确实更
- 不懂源码?来看看阿里P8亲自手码的Spring源码解析整套笔记,高薪offer唾手可得!
码农小芷
正文开发人员面对突如其来的变化,无论在架构选型,还是在日常开发中,总会面临各种挑战和考验。唯有系统性地掌握SpringFramework编程思想、设计理念,以及具体的实现方式,方可游刃有余,以免进退失据。作为Spring技术生态的基石,SpringFramework无论在设计,还是在实现上,都是一个优秀的框架,许多细节方面是非常值得我们学习的,包括:Java语言特性的运用,如反射、动态代理、枚举、
- Spring 源码解析 —— 配置类处理流程(@Configuration)
想54256
title:Spring源码解析——配置类处理流程(@Configuration)date:2021/01/1413:36remark:Spring版本为5.2.5简介@Configuration注解的主要作用就是向容器中注入一些bean,所以很容易想到Spring是通过BeanFactoryPostProcessor来实现对配置类进行处理的,处理类为ConfigurationClassPostP
- spring源码解析(六)
w_l666
spring源码解析springjava后端
bean对象的初始化及销毁时,执行相关操作的几种方式。packagecom.test;importorg.springframework.beans.factory.DisposableBean;importorg.springframework.beans.factory.InitializingBean;importorg.springframework.context.annotation.
- Spring源码解析之DefaultListableBeanFactory
久梦歌行
源码学习spring
DefaultListableBeanFactory是bean加载的核心部分,是Spring注册及加载的默认实现。它的层次关系如下图BeanFactory它是Spring中Bean容器的顶级接口。里面有获取bean,判断是否包含bean,是否单例,获取别名等基本方法ListableBeanFactory根据条件获取Bean的配置清单。如String[]getBeanDefinitionNames(
- Spring源码解析-DefaultListableBeanFactory
阿呆中二
Springspringjava
DefaultListableBeanFactorySpring基本流程DefaultListableBeanFactoryDefaultListableBeanFactory类图Spring基本流程使用Resource对象加载spring的xml配置文件创建DefaultListableBeanFactory对象,是spring加载bean的核心组件XmlBeanDefinitionReader
- Spring源码解析之一---将Dom实例解析成BeanDefinition对象
一个不知名的程序员小白
IOCspringjava
XmlBeanFactory的uml图首先了解下几个类的职能BeanDefinitionRegistry:定义Bean的常规操作,来注册BeanDefinition,内部就是用一个Map实现.SimpleBeanDefinitionRegistry是BeanDefinitionRegistry一个简单的实现。只提供注册表的功能,不提供工厂其他功能。DefaultListableBeanFactor
- Spring源码解析之MVC篇
风动草
什么是MVC?MVC(Model-View-Controller):它是一种软件架构设计模式,分为三个部分:Model(模型):业务的数据模型;View(视图):数据模型的可视化;Controller(控制器):模式和视图的连接控制器。它的主要目的就是将代码分层模块化,降低各层之间的耦合性,每个模块符合单一职责原则。很多应用的Web框架都是基于MVC模式去设计的,这里Spring也不例外,同样提供
- Spring源码解析之-TypeConverter、TypeConverterDelegate分析
一直打铁
springTypeConverterDeTypeConverterspringjava
目录一、介绍二、源码分析2.1convertIfNecessary方法解析2.2findDefaultEditor方法解析2.3doConvertValue方法解析2.3convertToTypedArray方法解析2.3convertToTypedCollection方法解析三、小结一、介绍TypeConverter类主要是负责类型转换,其实现类是TypeConverterSupport,但是所
- 《B站-Spring源码解析》学习笔记(六)——AOP原理
faith瑞诚
学习笔记springaop原理
视频地址:https://www.bilibili.com/video/BV1oW41167AV对应代码Git库地址:https://github.com/whh306318848/spring-annotation.git@EnableAspectJAutoProxy注解分析1.1.@EnableAspectJAutoProxy是什么?使用@Import(AspectJAutoProxyRegi
- 《B站-Spring源码解析》学习笔记(一)——组件管理
faith瑞诚
学习笔记springjava
视频地址:https://www.bilibili.com/video/BV1oW41167AV对应代码Git库地址:https://github.com/whh306318848/spring-annotation.gitSpring中所有的组件都放在IOC容器中,组件之间的关系通过容器进行自动装配(DI)即依赖注入;以前是通过xml方式配置bean标签的方式注册对象在代码中通过new一个Cla
- Spring源码解析系列五:Spring的AOP之动态代理源码详解
技术爱好者666
springjava后端
文章目录Spring的AOP之动态代理源码详解使用工厂方法来创建动态代理器小结JDK动态代理创建类并执行对应方法获取代理类调用动态代理类里面的方法小结cglib动态代理创建类并执行对应方法获取代理类调用动态代理类里面的方法小结Spring的AOP之动态代理源码详解使用工厂方法来创建动态代理器选出来advisor之后,使用选出的advisor来动态代理增强初始化完毕的Bean//getAdvices
- Spring源码解析系列六:Spring的事务结合Mybatis源码详解
技术爱好者666
springmybatisjava
文章目录Spring事务源码详解简单使用@EnableTransactionManagement解析小结使用Advisor进行动态代理增强增强的时机真正的执行逻辑小结总结Spring事务源码详解简单使用@Configuration@EnableTransactionManagementpublicclassSpringConfig{}@EnableTransactionManagement解析@T
- Spring源码解析系列四:Spring的AOP源码详解
技术爱好者666
springpythonjava
文章目录Spring的AOP源码详解简单使用@EnableAspectJAutoProxy解析小结@Aspect的解析解析的时机真正解析步骤小结使用Advisor进行动态代理增强增强的时机真正的处理逻辑小结使用动态代理进行增强Spring的AOP源码详解本文主要介绍SpringAOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应的增强Advice,并将Advice连同切入点匹
- 7.Spring源码解析-parseBeanDefinitions解析beanDefinitions
一杯可乐、
springIOCspringjava前端
默认解析的命名空间由parseDefaultElement方法去处理,即import,alias,bean,嵌套的beans四种元素import写法示例:importBeanDefinitionResource套路和之前的配置文件加载完全一样,不过注意被import进来的文件是先于当前文件被解析的。alias加入有一个bean名为componentA-dataSource,但是另一个组件想以com
- Spring源码解析-applicationContext.xml加载和bean的注册
weixin_34067102
面试web.xmljava
applicationContext文件加载和bean注册流程Spring对于从事Java开发的boy来说,再熟悉不过了,对于我们这个牛逼的框架的介绍就不在这里复述了,Spring这个大杂烩,怎么去使用怎么去配置,各种百度谷歌都能查到很多大牛教程,但是,当我们按着教程一步步的把spring的开发框架搭建起来的时候,有没有一种想搞明白spring的冲动,万事开头难,就要从开头开始,而我认为sprin
- spring源码解析-3
dameo
spring源码解析springspring源码解析
继续上篇内容,loadDocument(InputSourceinputSource,EntityResolverentityResolver,ErrorHandlererrorHandler,intvalidationMode,booleannamespaceAware)的具体实现/***Loadthe{@linkDocument}atthesupplied{@linkInputSource}u
- 1. Spring源码解析之IOC(上篇)
郭美冉
Spring专题spring
1.Spring源码解析之IOC(上篇)1.Spring概述1.1架构设计1.2各个模块依赖关系2.依赖注入和控制反转解析2.1SpringIOC体系结构2.1.1BeanFactory2.1.2BeanDefinition2.1.3XmlBeanDefinitionReader2.2IOC容器初始化2.2.1XmlBeanFactory2.2.2ApplicationContext2.2.2.1
- 6.Spring源码解析-loadBeanDefinitions(String location)
码农大乐乐丶
springIOCspring数据库mysql
这里resourceLoader其实就是ClassPathXmlApplicationContext1.ClassPathXmlApplicationContext在上文中图例就能看出来获取资源组可能存在多个bean.xml循环单独加载资源组创建一个编码资源并解析获取当前正在加载的资源发现是空创建了一个字节输入流,继续解析委托给Document并加载Document类。注册beanBeanDefi
- Spring源码解析-Spring IOC
小满只想睡觉
springjava后端
这篇⽂章主要讲解IOC容器的创建过程,让你对整体有⼀个全局的认识,⽂章没有复杂嵌套的debug流程,相对来说⽐较简单。一.基础知识1.1什么是SpringIOC?IOC不是⼀种技术,只是⼀种思想,⼀个重要的⾯向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应⽤程序都是由我们在类内部主动创建依赖对象,从⽽导致类与类之间⾼耦合,难于测试。有了IOC容器后,把创建和查找依赖对象的控制权
- spring源码解析-------AbstractApplicationContext类的prepareBeanFactory方法
xfgp02
spring源码解析spring
源码解析AbstractApplicationContext类的protectedvoidprepareBeanFactory(ConfigurableListableBeanFactorybeanFactory)方法/***Configurethefactory'sstandardcontextcharacteristics,*suchasthecontext'sClassLoaderandpo
- Spring源码解析-2.IOC容器源码解析
不进大厂不改名二号
springspringjava
目录前言一、IOC是什么?二、代码实践三、构建流程分析BeanFactory简介启动过程分析四、Component注解实现原理(手动实现)五、@Autowired源码浅析参考前言Spring三大核心思想:控制反转(IOC),依赖注入(DI)和面向切面编程(AOP)。Spring最核心,最基础的概念是什么?将spring类比java,java最核心,最基础的概念就是object了。java中,所有的
- spring源码解析之ioc-prepareBeanFactory
mist蒙
上一篇,我们分析了beanDefinition的定义,接着,我们继续跟着源码,来看看springioc在启动阶段都做了什么事还是来贴出核心代码publicvoidrefresh()throwsBeansException,IllegalStateException{synchronized(this.startupShutdownMonitor){this.prepareRefresh();Con
- Spring源码解析(16)之refresh(4)-prepareBeanFactory源码分析
技术路上的苦行僧
Spring源码分析系列Spring源码分析Spring属性编辑器自定义属性编辑器prepare源码分析Spring
一、前言在这一篇博客中我们主要是介绍prepareBeanFactory方法,bean工厂的初始化准备工作,设置bean工厂的一些属性值,需要忽略哪一些接口,需要注册哪一些bean,需要设置哪一些bean的后置处理器等。接下来我们看具体的源码分析,并且这里我们还看看Spring属性编辑器,以及我们如果去拓展一个属性编辑器。protectedvoidprepareBeanFactory(Config
- 13.Spring源码解析-prepareBeanFactory
码农大乐乐丶
springIOCspringjava后端
点进去此处是Spel表达式设置BeanExpressionResolver此接口只有一个实现:StandardBeanExpressionResolver。接口只含有一个方法:Objectevaluate(Stringvalue,BeanExpressionContextevalContext)prepareBeanFactory将一个此对象放入BeanFactory:beanFactory.se
- 15.spring源码解析-invokeBeanFactoryPostProcessors
码农大乐乐丶
springIOCspringjava数据库
BeanFactoryPostProcessor接口允许我们在bean正是初始化之前改变其值。此接口只有一个方法:voidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory);有两种方式可以向Spring添加此对象:通过代码的方式:context.addBeanFactoryPostProcessor通过xml配置的方
- 14.spring源码解析-postProcessBeanFactory
码农大乐乐丶
springIOCspringjava后端
此方法允许子类在所有的bean尚未初始化之前注册BeanPostProcessor。空实现且没有子类覆盖。
- 8.Spring源码解析-parseBeanDefinitionElement bean解析
码农大乐乐丶
springIOCspringjava后端
首先获取到bean的class属性和parent属性,配置了parent之后,当前bean会继承父bean的属性。之后根据class和parent创建BeanDefinition对象。相关代码区域如下:StringclassName=null;if(ele.hasAttribute(CLASS_ATTRIBUTE)){className=ele.getAttribute(CLASS_ATTRIBU
- 1.Spring源码解析-ClassPathXmlApplicationContext
码农大乐乐丶
springIOCjavaspringbootspring
此类是读取spring的xml配置文件并解析。也是源码入口之一。我们调试即将开始。传递给父类设置值经调试我们得到是给AbstractApplicationContext设置默认的应用上下文父级的值,很明显是空给父类AbstractRefreshableConfigApplicationContext设置属性刷新容器时序图如下:
- Enum 枚举
120153216
enum枚举
原文地址:http://www.cnblogs.com/Kavlez/p/4268601.html Enumeration
于Java 1.5增加的enum type...enum type是由一组固定的常量组成的类型,比如四个季节、扑克花色。在出现enum type之前,通常用一组int常量表示枚举类型。比如这样:
public static final int APPLE_FUJI = 0
- Java8简明教程
bijian1013
javajdk1.8
Java 8已于2014年3月18日正式发布了,新版本带来了诸多改进,包括Lambda表达式、Streams、日期时间API等等。本文就带你领略Java 8的全新特性。
一.允许在接口中有默认方法实现
Java 8 允许我们使用default关键字,为接口声明添
- Oracle表维护 快速备份删除数据
cuisuqiang
oracle索引快速备份删除
我知道oracle表分区,不过那是数据库设计阶段的事情,目前是远水解不了近渴。
当前的数据库表,要求保留一个月数据,且表存在大量录入更新,不存在程序删除。
为了解决频繁查询和更新的瓶颈,我在oracle内根据需要创建了索引。但是随着数据量的增加,一个半月数据就要超千万,此时就算有索引,对高并发的查询和更新来说,让然有所拖累。
为了解决这个问题,我一般一个月会进行一次数据库维护,主要工作就是备
- java多态内存分析
麦田的设计者
java内存分析多态原理接口和抽象类
“ 时针如果可以回头,熟悉那张脸,重温嬉戏这乐园,墙壁的松脱涂鸦已经褪色才明白存在的价值归于记忆。街角小店尚存在吗?这大时代会不会牵挂,过去现在花开怎么会等待。
但有种意外不管痛不痛都有伤害,光阴远远离开,那笑声徘徊与脑海。但这一秒可笑不再可爱,当天心
- Xshell实现Windows上传文件到Linux主机
被触发
windows
经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下;之前我的做法现在看来好笨好繁琐,不过也达到了目的,笨人有本方法嘛;
我是怎么操作的:
1、打开一台本地Linux虚拟机,使用mount 挂载Windows的共享文件夹到Linux上,然后拷贝数据到Linux虚拟机里面;(经常第一步都不顺利,无法挂载Windo
- 类的加载ClassLoader
肆无忌惮_
ClassLoader
类加载器ClassLoader是用来将java的类加载到虚拟机中,类加载器负责读取class字节文件到内存中,并将它转为Class的对象(类对象),通过此实例的 newInstance()方法就可以创建出该类的一个对象。
其中重要的方法为findClass(String name)。
如何写一个自己的类加载器呢?
首先写一个便于测试的类Student
- html5写的玫瑰花
知了ing
html5
<html>
<head>
<title>I Love You!</title>
<meta charset="utf-8" />
</head>
<body>
<canvas id="c"></canvas>
- google的ConcurrentLinkedHashmap源代码解析
矮蛋蛋
LRU
原文地址:
http://janeky.iteye.com/blog/1534352
简述
ConcurrentLinkedHashMap 是google团队提供的一个容器。它有什么用呢?其实它本身是对
ConcurrentHashMap的封装,可以用来实现一个基于LRU策略的缓存。详细介绍可以参见
http://code.google.com/p/concurrentlinke
- webservice获取访问服务的ip地址
alleni123
webservice
1. 首先注入javax.xml.ws.WebServiceContext,
@Resource
private WebServiceContext context;
2. 在方法中获取交换请求的对象。
javax.xml.ws.handler.MessageContext mc=context.getMessageContext();
com.sun.net.http
- 菜鸟的java基础提升之道——————>是否值得拥有
百合不是茶
1,c++,java是面向对象编程的语言,将万事万物都看成是对象;java做一件事情关注的是人物,java是c++继承过来的,java没有直接更改地址的权限但是可以通过引用来传值操作地址,java也没有c++中繁琐的操作,java以其优越的可移植型,平台的安全型,高效性赢得了广泛的认同,全世界越来越多的人去学习java,我也是其中的一员
java组成:
- 通过修改Linux服务自动启动指定应用程序
bijian1013
linux
Linux中修改系统服务的命令是chkconfig (check config),命令的详细解释如下: chkconfig
功能说明:检查,设置系统的各种服务。
语 法:chkconfig [ -- add][ -- del][ -- list][系统服务] 或 chkconfig [ -- level <</SPAN>
- spring拦截器的一个简单实例
bijian1013
javaspring拦截器Interceptor
Purview接口
package aop;
public interface Purview {
void checkLogin();
}
Purview接口的实现类PurviesImpl.java
package aop;
public class PurviewImpl implements Purview {
public void check
- [Velocity二]自定义Velocity指令
bit1129
velocity
什么是Velocity指令
在Velocity中,#set,#if, #foreach, #elseif, #parse等,以#开头的称之为指令,Velocity内置的这些指令可以用来做赋值,条件判断,循环控制等脚本语言必备的逻辑控制等语句,Velocity的指令是可扩展的,即用户可以根据实际的需要自定义Velocity指令
自定义指令(Directive)的一般步骤
&nbs
- 【Hive十】Programming Hive学习笔记
bit1129
programming
第二章 Getting Started
1.Hive最大的局限性是什么?一是不支持行级别的增删改(insert, delete, update)二是查询性能非常差(基于Hadoop MapReduce),不适合延迟小的交互式任务三是不支持事务2. Hive MetaStore是干什么的?Hive persists table schemas and other system metadata.
- nginx有选择性进行限制
ronin47
nginx 动静 限制
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;...
server {...
location ~.*\.(gif|png|css|js|icon)$ {
- java-4.-在二元树中找出和为某一值的所有路径 .
bylijinnan
java
/*
* 0.use a TwoWayLinkedList to store the path.when the node can't be path,you should/can delete it.
* 1.curSum==exceptedSum:if the lastNode is TreeNode,printPath();delete the node otherwise
- Netty学习笔记
bylijinnan
javanetty
本文是阅读以下两篇文章时:
http://seeallhearall.blogspot.com/2012/05/netty-tutorial-part-1-introduction-to.html
http://seeallhearall.blogspot.com/2012/06/netty-tutorial-part-15-on-channel.html
我的一些笔记
===
- js获取项目路径
cngolon
js
//js获取项目根路径,如: http://localhost:8083/uimcardprj
function getRootPath(){
//获取当前网址,如: http://localhost:8083/uimcardprj/share/meun.jsp
var curWwwPath=window.document.locati
- oracle 的性能优化
cuishikuan
oracleSQL Server
在网上搜索了一些Oracle性能优化的文章,为了更加深层次的巩固[边写边记],也为了可以随时查看,所以发表这篇文章。
1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。(这点本人曾经做过实例验证过,的确如此哦!
- Shell变量和数组使用详解
daizj
linuxshell变量数组
Shell 变量
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="w3cschool.cc"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用ba
- 编程中的一些概念,KISS、DRY、MVC、OOP、REST
dcj3sjt126com
REST
KISS、DRY、MVC、OOP、REST (1)KISS是指Keep It Simple,Stupid(摘自wikipedia),指设计时要坚持简约原则,避免不必要的复杂化。 (2)DRY是指Don't Repeat Yourself(摘自wikipedia),特指在程序设计以及计算中避免重复代码,因为这样会降低灵活性、简洁性,并且可能导致代码之间的矛盾。 (3)OOP 即Object-Orie
- [Android]设置Activity为全屏显示的两种方法
dcj3sjt126com
Activity
1. 方法1:AndroidManifest.xml 里,Activity的 android:theme 指定为" @android:style/Theme.NoTitleBar.Fullscreen" 示例: <application
- solrcloud 部署方式比较
eksliang
solrCloud
solrcloud 的部署其实有两种方式可选,那么我们在实践开发中应该怎样选择呢? 第一种:当启动solr服务器时,内嵌的启动一个Zookeeper服务器,然后将这些内嵌的Zookeeper服务器组成一个集群。 第二种:将Zookeeper服务器独立的配置一个集群,然后将solr交给Zookeeper进行管理
谈谈第一种:每启动一个solr服务器就内嵌的启动一个Zoo
- Java synchronized关键字详解
gqdy365
synchronized
转载自:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913806.html
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。
同步机制可以使用synchronized关键字实现。
当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。
当s
- js实现登录时记住用户名
hw1287789687
记住我记住密码cookie记住用户名记住账号
在页面中如何获取cookie值呢?
如果是JSP的话,可以通过servlet的对象request 获取cookie,可以
参考:http://hw1287789687.iteye.com/blog/2050040
如果要求登录页面是html呢?html页面中如何获取cookie呢?
直接上代码了
页面:loginInput.html
代码:
<!DOCTYPE html PUB
- 开发者必备的 Chrome 扩展
justjavac
chrome
Firebug:不用多介绍了吧https://chrome.google.com/webstore/detail/bmagokdooijbeehmkpknfglimnifench
ChromeSnifferPlus:Chrome 探测器,可以探测正在使用的开源软件或者 js 类库https://chrome.google.com/webstore/detail/chrome-sniffer-pl
- 算法机试题
李亚飞
java算法机试题
在面试机试时,遇到一个算法题,当时没能写出来,最后是同学帮忙解决的。
这道题大致意思是:输入一个数,比如4,。这时会输出:
&n
- 正确配置Linux系统ulimit值
字符串
ulimit
在Linux下面部 署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题;这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用 其实很容易就达到这个数量。下面说的是,如何通过正解配置来改正这个系统默认值。因为这个问题是我配置Nginx+php5时遇到了,所以我将这篇归纳进
- hibernate调用返回游标的存储过程
Supanccy2013
javaDAOoracleHibernatejdbc
注:原创作品,转载请注明出处。
上篇博文介绍的是hibernate调用返回单值的存储过程,本片博文说的是hibernate调用返回游标的存储过程。
此此扁博文的存储过程的功能相当于是jdbc调用select 的作用。
1,创建oracle中的包,并在该包中创建的游标类型。
---创建oracle的程
- Spring 4.2新特性-更简单的Application Event
wiselyman
application
1.1 Application Event
Spring 4.1的写法请参考10点睛Spring4.1-Application Event
请对比10点睛Spring4.1-Application Event
使用一个@EventListener取代了实现ApplicationListener接口,使耦合度降低;
1.2 示例
包依赖
<p