Spring全套教学资料
Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。
目录:
部分内容:
Spring源码
- 第一部分 Spring 概述
- 第二部分 核心思想
- 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
- 第四部分 Spring IOC 高级应用
基础特性
高级特性 - 第五部分 Spring IOC源码深度剖析
设计优雅
设计模式
注意:原则、方法和技巧 - 第六部分 Spring AOP 应用
声明事务控制 - 第七部分 Spring AOP源码深度剖析
必要的笔记、必要的图、通俗易懂的语言化解知识难点
脚手框架:SpringBoot技术
它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。
Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。
- SpringBoot入门
- 配置文件
- 日志
- Web开发
- Docker
- SpringBoot与数据访问
- 启动配置原理
- 自定义starter
微服务架构:Spring Cloud Alibaba
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
- 微服务架构介绍
- Spring Cloud Alibaba介绍
- 微服务环境搭建
- 服务治理
- 服务容错
- 服务网关
- 链路追踪
- ZipKin集成及数据持久化
- 消息驱动
- 短信服务
- Nacos Confifig—服务配置
- Seata—分布式事务
- Dubbo—rpc通信
Spring MVC
目录:
部分内容:
if (childWithAccessibilityFocus != child) {
continue;
}
childWithAccessibilityFocus = null;
i = childrenCount - 1;
}
if (!canViewReceivePointerEvents(child)
|| !isTransformedTouchPointInView(x, y, child, null)) { // 2
ev.setTargetAccessibilityFocus(false);
continue;
}
newTouchTarget = getTouchTarget(child);
if (newTouchTarget != null) {
newTouchTarget.pointerIdBits |= idBitsToAssign;
break;
}
resetCancelNextUpFlag(child);
if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) { // 3
mLastTouchDownTime = ev.getDownTime();
if (preorderedList != null) {
for (int j = 0; j < childrenCount; j++) {
if (children[childIndex] == mChildren[j]) {
mLastTouchDownIndex = j;
break;
}
}
} else {
mLastTouchDownIndex = childIndex;
}
mLastTouchDownX = ev.getX();
mLastTouchDownY = ev.getY();
newTouchTarget = addTouchTarget(child, idBitsToAssign);
alreadyDispatchedToNewTouchTarget = true;
break;
}
ev.setTargetAccessibilityFocus(false);
}
…
}
注释1:遍历ViewGroup的所有子View,判断子View是否能够接收到点击事件,如果可以接受到,则交由子View来处理。
需要注意的是,这里是以倒序来遍历子View的,说明越靠近用户的View越先获取到点击事件。
注释2:判断触摸点是否在子View的范围内或者子View是否在播放动画。如果均不符合则continue。表明该View不能接收点击事件。
注释3:调用dispatchTransformedTouchEvent()
,可以看到如果这个结果返回了ture的话,if语句里面会记录这个view,比如 newTouchTarget = addTouchTarget(child, idBitsToAssign);
这行。 所以如果这个方法返回了true,就表明这个子View会拦截这系列的点击事件。
所以我们有必要看下这个方法:
// ViewGroup.java
private boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel,
View child, int desiredPointerIdBits) {
final boolean handled;
final int oldAction = event.getAction();
if (cancel || oldAction == MotionEvent.ACTION_CANCEL) {
event.setAction(MotionEvent.ACTION_CANCEL);
if (child == null) {
handled = super.dispatchTouchEvent(event); // 1
} else {
handled = child.dispatchTouchEvent(event); // 2
}
event.setAction(oldAction);
return handled;
}
…
}
注释2:如果该View有子View,则调用子View的dispatchTouchEvent()
。
注释1:如果该View没有子View,则调用 super.dispatchTouchEvent()
,因为ViewGroup是继承自View的,所以会调用 View.dispatchTouchEvent()
:
// View.java
public boolean dispatchTouchEvent(MotionEvent event) {
boolean result = false;
…
if (onFilterTouchEventForSecurity(event)) {
if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
result = true;
}
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) { // 1
result = true; //2
}
if (!result && onTouchEvent(event)) { //3
result = true; // 4
}
}
…
return result;
}
注释1、2:如果 OnTouchListener
不为null且 onTouch()
返回true,则 dispatchTouchEvent返回true,表示事件被拦截了下来。
注释3、4:如果 onTouchEvent()
返回true,则表示事件被拦截了下来。
上面这两段可以看出来,在View中,如果同时设置了 OnTouchListener.onTouch()
和 onTouchEvent()
,则前者的优先级比后者高,即事件只会被前者处理,到不了后面去。但是如果 没有设置OnTouchListener.onTouch()
,或者它返回false,则会进入到 onTouchEvent方法。
我们来看看 onTouchEvent()
:
// View.java
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
…
if (clickable || (viewFlags & TOOLTIP) == TOOLTIP) { // 1
switch (action) {
case MotionEvent.ACTION_UP:
mPrivateFlags3 &= ~PFLAG3_FINGER_DOWN;
if ((viewFlags & TOOLTIP) == TOOLTIP) {
handleTooltipUp();
}
if (!clickable) {
removeTapCallback();
removeLongPressCallback();
mInContextButtonPress = false;
mHasPerformedLongPress = false;
mIgnoreNextUpEvent = false;
break;
}
boolean prepressed = (mPrivateFlags & PFLAG_PREPRESSED) != 0;
if ((mPrivateFlags & PFLAG_PRESSED) != 0 || prepressed) {
boolean focusTaken = false;
if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
focusTaken = requestFocus();
}
if (prepressed) {
setPressed(true, x, y);
}
if (!mHasPerformedLongPress && !mIgnoreNextUpEvent) {
removeLongPressCallback();
if (!focusTaken) {
if (mPerformClick == null) {
mPerformClick = new PerformClick();
}
if (!post(mPerformClick)) {
performClickInternal(); // 2
}
}
}
…
}
return true;
}
return false;
}
注释1:如果View的CLICKABLE
和 LONG_CLICKABLE
有一个为true,那么 onTouchEvent()
就会返回true消耗这个事件。这两个属性表示View可以被点击和长按点击。
他们可以通过 View的 setClickable()
和 setLongClickable
来设置。也可以通过 setOnClickListener()
和 setOnLongClickListener()
来设置。
注释2:调用 performClickInternal()
,它会调用 performClick()
:
public boolean performClick() {
notifyAutofillManagerOnClick();
final boolean result;
final ListenerInfo li = mListenerInfo;
if (li != null && li.mOnClickListener != null) { // 1
playSoundEffect(SoundEffectConstants.CLICK);
li.mOnClickListener.onClick(this); // 2
result = true;
} else {
result = false;
}
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
notifyEnterOrExitForAutoFillIfNeeded(true);
return result;
}
注释1:判断当前有View有没有设置 onClickListener()
,如果没有,则返回false,表示该View不处理事件。否则进入到if语句内,执行注释2的代码。
注释2:执行 OnClickListener.onClick
,并返回true。则说明该View拦截了时间。
经过上面的源码分析,我们大概知道了一个View是如何去分发MotionEvent,它可以简化为下面的代码:
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean result = false;
if(onInterceptTouchEvent(ev)){
result = super.onTouchEvent(ev);
} else {
result = child.dispatchTouchEvent(ev);
}
}
最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们
目录:
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
Java面试核心知识点
已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了
最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们
目录:
[外链图片转存中…(img-9kAfqDIC-1715116084015)]
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
[外链图片转存中…(img-ug3i87x9-1715116084015)]
Java面试核心知识点
已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了
[外链图片转存中…(img-4rcOmPcq-1715116084015)]