Skip to content

Commit

Permalink
bp
Browse files Browse the repository at this point in the history
  • Loading branch information
spring committed Oct 27, 2023
1 parent 90f3c13 commit 3964d65
Show file tree
Hide file tree
Showing 15 changed files with 940 additions and 25 deletions.
103 changes: 103 additions & 0 deletions _book/Book/Java编程面试题.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
## 爬虫

* **如何最快速地从HTTP-URL中获取输入流并能够解析HTML源码?(代码题)**
从输入流中逐行读取`new BufferReader(new InpuptStreamReader(new URL(new String(urlPath)).openConnection().getInputStream())).readLine()`

* **如何解决爬虫403问题?(经验题)**
爬虫403的异常通常为"java.io.IOException:Server returned HTTP response code: 403 for URL"。通常情况下这种问题分为以下两种:
如果是服务端需要访问权限,那么需要提供授权信息。例如在URL中添加用户名或密码,或者使用OAuth2等认证方式。
如果是服务端禁止抓去,因为有些网站会根据请求的User-Agent头部判断请求是否来自合法浏览器,那么可以通过设置User-Agent。

* **java.net.URLConnection和java.net.HttpURLConnection有什么异同()?**
从继承关系上来说:
`URLConnection`是一个抽象类,它是所有URL连接类型的基类,用于处理各种类型的URL连接而不局限于HTTP。
`HttpURLConnection``URLConnection`的子类,它专门用于处理HTTP协议的URL,提供与HTTP协议相关的特定方法和功能。
从使用范围上来说:
`URLConnection`可以用于多种协议的连接,例如HTTP, FTP, FILE。
`HTTPURLConnection`只能用于HTTP协议等连接,提供了更多欲HTTP相关的方法和属性。
从功能特性上来说:
`URLConnection`提供了基本的连接功能,可以获取输入流、输出流及一些基本的头信息。
`HTTPURLConnection``URLConnection`的基础功能上还提供了更多的HTTP相关功能,例如设置请求方法、处理响应状态码、设置请求头、设置连接超时等。
从默认行为上来说:
`URLConnection`默认的连接实现是根据URL协议的不同而调用不同的子类。
`HTTPURLConnection`默认情况下会自动执行**HTTP重定向**
总体来说,如果单独处理HTTP连接,或者执行HTTP连接的相关操作,如设置请求头、处理响应状态等,使用`HTTPURLConnection`更合适,如果需要处理多种协议等连接,或者更加通用的连接操作,最好使用`URLConnection`

* **什么是HTTP重定向?如何在爬虫中取消重定向?**
HTTP Redirect(HTTP重定向)是一种在客户端发起请求时,服务器返回特定响应状态码和新的URL,用于将客户端Redirect到另一个URL的机制。通常用于网站的流量转发、访问控制、错误处理以及网站内容的移动。
HTTP重定向可以用于多种情况,例如:
1. 当网站更改了页面的URL结构时,旧的URL可能会重定向到新的URL,以确保用户可以找到所需的内容;
2. 当某个资源被删除或被移动到其他位置时,可以通过重定向告知客户端新的位置;
3. 当需要对用户进行身份验证或权限检查时,可以将用户重定向到登录页面。
当客户端发起HTTP请求时,服务器可能会返回以下一些常见的HTTP重定向状态码:
**301 (Moved Permanently)**: 表示所请求资源已永久移动至新的URL。客户端应当更新其链接并将所有未来请求发送到新的URL。
**302 (Found)/303(See Other)**: 表示所请求的资源临时移动到新的URL,而303则是一种更严格的重定向方式,要求客户端使用GET请求新的URL。这两种状态码通常用于临时重定向。
**307 (Temporary Redirect)**: 表示所请求的资源临时移动到新的URL,但是客户端应该保持原始请求的HTTP方法,即如果是POST请求,仍然要用POST请求新的URL。此状态码类似于302。
**308 (Permanent Redirect)**: 表示所请求资源永久移动到新的URL,但是客户端应该抱池原始请求的HTTP方法。
如果你需要关闭重定向,可以通过setInstanceFollowRedirects(false)。

* **获取HTTP输入的时候,使用HttpURLConnection和URLConnection打开的连接有什么不同?**
没有什么不同。当连接HTTP协议的URL时,虽然`URLConnection``HttpURLConnection`是不同的类,但是在底层机制上,当获取一个HTTP连接时,`URLConnection`会根据URL的协议选择适当的具体实现,所以对于HTTP协议来说,底层会使用`HttpURLConnection`这个酒体的实现。这种机制确保了在HTTP操作时能够使用专门为HTTP请求和响应设计的功能。

## 程序启动和类加载
* **Spring程序中都有哪些特有的方式,能够让函数方法在项目启动时运行?**
注解:
@Scheduled:设置项目启动的第n秒执行函数。
@PostConstruct
@PreDestory
@EventListener
@SpringAOP
自定义注解:
通过创建自定义注解并编写相应的处理器从而根据注解去触发函数执行。

* **传统Java项目中如何在项目启动加载时进行函数的执行?**
一是在类加载中定义,例如静态代码块;二是在主类中定义;三是使用其他组件封装需要执行的代码。

* **传统Java项目中,是否明确具有项目加载前、项目加载中、项目加载后的过程?**
在传统的纯Java项目中,整个项目启动过程通常就是项目加载过程的一部分,没有显式的分隔。
因为在纯Java项目中,如果没有像Spring等框架提供的内置机制来单独实现项目加载前和项目加载时分别运行的方法,则需要手动地管理这些阶段的执行。
这意味着在纯Java项目中没有现成的机制来管理项目的加载阶段,需要通过代码的逻辑和调用关系来判断方法是在哪个阶段运行。
所以,正因为在纯Java项目中没有固定的规范或框架来定义和管理这些阶段和执行,则需要我们根据项目的结构和逻辑来划分这些阶段,比如通过自定义方法和类来实现类似的效果,从而确保方法的调用顺序符合预期。

#### Spring项目和传统项目加载过程区别
在Spring项目中,虽然仍涉及到类加载荷主方法执行的概念,但由于Spring引入了IOC容器、事件监听等特性,导致整个加载过程的机制和行为与传统的Java项目有所不同。
这些特性使得Spring项目更加灵活、可配置和可扩展,也为开发者提供了更多的控制权和定制能力,所以在Spring框架中,类加载荷主方法执行的过程经过了一些改进荷扩展,以满足Spring框架自身的特性荷要求。
传统上来说,类加载荷主方法执行是顺序相继发生的两个步骤,主方法执行依赖于类加载。在传统Java应用程序中,首先会发生类加载阶段,即JVM会按需加载类的字节码文件,创建类的定义并初始化静态成员。然后,在类加载完成后,JVM会寻找并执行包含主方法的类,从而启动整个应用程序。在主方法中,可以进行各种逻辑操作和调用其他类的方法。
简而言之,类加载荷主方法执行是构成传统Java应用程序启动的两个关键步骤:类加载是为了准备应用程序所需的类荷资源,而主方法执行则是启动应用程序的入口点。
主函数执行需要等待类加载完成后才会开始。在Java应用程序中,JVM会先进行类加载,加载并初始化应用程序所需的类,包括静态成员和静态代码块的初始化。一旦所有必要的类加载完成,并且静态初始化也完成,JVM会找到包含主方法的类,并开始执行主方法中的代码。因此,主函数执行确实需要等待类加载完成后才会开始。
其他组件的初始化通常是在类加载荷主方法执行之间。一旦类加载完成,静态成员和静态代码块初始化完毕,主方法即将执行前,通常会出发其他组件的初始化。在Java应用程序中,这些组件可以是依赖注入框架的IOC容器的初始化、事件监听器的注册、配置文件的加载等,这些初始化过程的目的是为了在主方法执行前准备好应用程序所需的各种资源和环境。

##### 其他组件的初始化
当谈到其他组件的初始化时,通常会涉及到各种应用程序特定的功能。
Spring的IOC容器初始化:在Spring框架中,IOC容器负责管理Bean的创建、依赖注入等工作。当应用程序启动时,SpringIOC容器开始初始化,包括:扫描配置文件或注解,创建Bean实例,并解决它们之间的依赖关系。
事件监听器的初始化:在许多框架中,能够定义事件监听器以便在特定事件发生时执行某些操作。例如Spring框架,它允许定义应用程序启动或停止时的监听器,以便在这些事件发生时执行自定义逻辑。
数据库连接池的初始化:如果应用程序需要与数据库进行交互,可能会需要初始化一个数据库连接池,以便在应用程序需要数据库连接时能够快速地获取连接,而不需要每次都建立连接。
日志系统初始化:许多应用程序使用日志系统记录日志信息。在应用程序启动时,日志系统可能会被初始化:配置日志输出的位置、级别和格式等信息。
插件系统初始化:如果应用程序支持插件功能,插件系统可能会在应用程序启动时进行初始化,以加载和注册可用的插件。
配置文件加载:在应用程序启动时,可能会加载配置文件,读取应用程序的配置信息,例如数据库连接参数和系统属性等。
安全管理初始化:如果应用程序设计安全管理,例如用户认证和授权,安全管理系统可能会在应用程序启动时进行初始化。
第三方库的初始化:如果您在应用程序中使用第三方库,这些库可能会在应用程序启动时进行初始化,以准备库所需的资源和配置。
以上只是可能或常用的初始化组件,然而在实际开发中,可以根据应用程序的需求,定制和扩展初始化过程,以确保应用程序在启动时处于预期状态。

#### Java项目加载阶段
类加载:在Java中,类加载是整个项目加载过程的重要组成部分。在项目启动时,JVM会加载所需的类文件。类加载过程涉及类加载器、双亲委派模型、类的链接和初始化等步骤。
组件加载:项目启动后可能需要初始化其他组件、服务等,这些组件的初始化可以在主方法中进行,也可以在Spring等框架的容器中完成。
主函数加载:项目中包含`public static void main(String[] args)`的方法,为程序执行入口,该方法中为启动项目的逻辑。

#### 传统Java项目加载全过程
**项目加载前过程:**
项目加载前过程会包含一些初始化的操作,如配置加载、依赖项的初始化等;
**项目加载时过程:**
项目加载时过程涉及一些启动的准备工作,如连接数据库、加载资源等;
**项目加载后过程:**
项目加载后过程则是项目启动后需要执行等业务逻辑。

#### 如何判断项目加载阶段
要判断方法是在哪个阶段运行,可以根据方法的调用顺序、代码逻辑以及方法所在的位置进行分析,例如在方法中添加一些日志输出或打印语句,能够帮助你更好地了解方法的运行时机。

#### 如何精细控制项目加载阶段
如果需要精细控制项目的加载阶段和执行顺序,可以手动创建一个类似于**声明周期管理的机制**,定义一些特定方法,并在适当地方调用这些方法,以达到想要的加载顺序和执行效果。
如果需要更细粒度的控制项目的加载阶段,可能就需要考虑使用类似Spring的框架了,它们提供了更多生命周期函数和扩展机制,能够方便地管理项目的不同阶段。

* **请讲一讲需要在项目启动时运行某些逻辑使用@Bean@EventListener的异同。**
在项目启动时实现运行逻辑使用@Bean@EventListener是不同的,准确地说可以分为项目启动前、项目启动时和项目启动后。
5 changes: 5 additions & 0 deletions _book/Book/MacOS KeyBoard Sound.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
2023年10月12日立项 Mac系统调节键盘输入设备响应声音
通过GitHub平台查找并筛选开源项目:
https://github.com/MrKai77/MKSTE

6
8 changes: 4 additions & 4 deletions _book/Book/java_concurrency.html
Original file line number Diff line number Diff line change
Expand Up @@ -271,16 +271,16 @@

</li>

<li class="chapter " data-level="1.5" >
<li class="chapter " data-level="1.5" data-path="rdbms.html">

<span>
<a href="rdbms.html">


<b>1.5.</b>

RDBMS

</span>
</a>



Expand Down Expand Up @@ -651,7 +651,7 @@ <h1 class="search-results-title">No results matching "<span class='search-query'
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"Java Concurrency","level":"1.8","depth":1,"next":{"title":"Queue","level":"1.8.1","depth":2,"path":"book/java_concurrency_queue.md","ref":"book/java_concurrency_queue.md","articles":[]},"previous":{"title":"generator","level":"1.7.1","depth":2,"path":"MyBatisBook/mybatis_generator.md","ref":"MyBatisBook/mybatis_generator.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":["hide-element","include-codeblock","copy-code-button","anchor-navigation-ex","advanced-emoji","emphasize","livereload"],"pluginsConfig":{"emphasize":{},"livereload":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"hide-element":{"elements":[".gitbook-link"]},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"anchor-navigation-ex":{"associatedWithSummary":true,"float":{"floatIcon":"fa fa-navicon","level1Icon":"","level2Icon":"","level3Icon":"","showLevelIcon":false},"mode":"float","multipleH1":true,"pageTop":{"level1Icon":"","level2Icon":"","level3Icon":"","showLevelIcon":false},"printLog":false,"showGoTop":true,"showLevel":true},"copy-code-button":{},"advanced-emoji":{"embedEmojis":false},"include-codeblock":{"check":false,"edit":false,"fixlang":false,"lang":"","template":"ace","theme":"monokai","unindent":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":true}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"book/java_concurrency.md","mtime":"2023-07-27T02:03:34.164Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2023-08-01T08:25:24.666Z"},"basePath":"..","book":{"language":""}});
gitbook.page.hasChanged({"page":{"title":"Java Concurrency","level":"1.8","depth":1,"next":{"title":"Queue","level":"1.8.1","depth":2,"path":"book/java_concurrency_queue.md","ref":"book/java_concurrency_queue.md","articles":[]},"previous":{"title":"generator","level":"1.7.1","depth":2,"path":"MyBatisBook/mybatis_generator.md","ref":"MyBatisBook/mybatis_generator.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":["hide-element","include-codeblock","copy-code-button","anchor-navigation-ex","advanced-emoji","emphasize","livereload"],"pluginsConfig":{"emphasize":{},"livereload":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"hide-element":{"elements":[".gitbook-link"]},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"anchor-navigation-ex":{"associatedWithSummary":true,"float":{"floatIcon":"fa fa-navicon","level1Icon":"","level2Icon":"","level3Icon":"","showLevelIcon":false},"mode":"float","multipleH1":true,"pageTop":{"level1Icon":"","level2Icon":"","level3Icon":"","showLevelIcon":false},"printLog":false,"showGoTop":true,"showLevel":true},"copy-code-button":{},"advanced-emoji":{"embedEmojis":false},"include-codeblock":{"check":false,"edit":false,"fixlang":false,"lang":"","template":"ace","theme":"monokai","unindent":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":true}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"book/java_concurrency.md","mtime":"2023-07-27T02:03:34.164Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2023-10-25T06:44:55.555Z"},"basePath":"..","book":{"language":""}});
});
</script>
</div>
Expand Down
Loading

0 comments on commit 3964d65

Please sign in to comment.