spring源碼分析之spring-core總結篇

1.spring-core概覽
spring-core是spring框架的基石,它為spring框架提供了基礎的支持。
在這里插入圖片描述
spring-core從源碼上看,分為6個package,分別是asm,cglib,core,lang,objenesis和util。

1.1 asm

關于asm的內幕參見博客:

spring源碼分析之spring-core asm概述

1.2 cglib

關于cglib的內幕參見博客

cglib源碼分析–轉

1.3 core

1.4 lang

四個注解接口

/*** Indicates that the annotated element uses the Http Server available in* {@code com.sun.*} classes, which is only available on a Sun/Oracle JVM.** @author Stephane Nicoll* @since 4.1*/
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE})
@Documented
public @interface UsesSunHttpServer {
}
/*** Indicates that the annotated element uses Java 7 specific API constructs,* without implying that it strictly requires Java 7.** @author Stephane Nicoll* @since 4.1*/
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE})
@Documented
@Deprecated
public @interface UsesJava7 {
}
/*** Indicates that the annotated element uses Java 8 specific API constructs,* without implying that it strictly requires Java 8.** @author Stephane Nicoll* @since 4.1*/
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE})
@Documented
@Deprecated
public @interface UsesJava8 {
}
/*** Indicates that the annotated element uses an API from the {@code sun.misc}* package.** @author Stephane Nicoll* @since 4.3*/
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE})
@Documented
public @interface UsesSunMisc {
}

1.5 Objenesis

官網:http://objenesis.org/

Objenesis is a small Java library that serves one purpose:

To instantiate a new object of a particular class.
Objenesis是專門用于實例化一些特殊java對象的一個工具,如私有構造方法,帶參數的構造等不能通過class.newInstance()實例化的,通過它可以輕松完成。

When would you want this?

Java already supports this dynamic instantiation of classes using Class.newInstance(). However, this only works if the class has an appropriate constructor. There are many times when a class cannot be instantiated this way, such as when the class contains:

Constructors that require arguments.
Constructors that have side effects.
Constructors that throw exceptions.
As a result, it is common to see restrictions in libraries stating that classes must require a default constructor. Objenesis aims to overcome these restrictions by bypassing the constructor on object instantiation.

Typical uses

Needing to instantiate an object without calling the constructor is a fairly specialized task, however there are certain cases when this is useful:

Serialization, Remoting and Persistence - Objects need to be instantiated and restored to a specific state, without invoking code.
Proxies, AOP Libraries and Mock Objects - Classes can be subclassed without needing to worry about the super() constructor.
Container Frameworks - Objects can be dynamically instantatiated in non-standard ways.
示例:

Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
MyThingy thingy1 = (MyThingy) objenesis.newInstance(MyThingy.class);// or (a little bit more efficient if you need to create many objects)Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
ObjectInstantiator thingyInstantiator = objenesis.getInstantiatorOf(MyThingy.class);MyThingy thingy2 = (MyThingy)thingyInstantiator.newInstance();
MyThingy thingy3 = (MyThingy)thingyInstantiator.newInstance();
MyThingy thingy4 = (MyThingy)thingyInstantiator.newInstance();

SpringObjenesis封裝了Objenesis,涉及了一個spring封裝的數據結構org.springframework.util.ConcurrentReferenceHashMap

A ConcurrentHashMap that uses soft or weak references for both keys and values.
This class can be used as an alternative to Collections.synchronizedMap(new WeakHashMap<K, Reference<V>>()) in order to support better performance when accessed concurrently. This implementation follows the same design constraints as ConcurrentHashMap with the exception that null values and null keys are supported.NOTE: The use of references means that there is no guarantee that items placed into the map will be subsequently available. The garbage collector may discard references at any time, so it may appear that an unknown thread is silently removing entries.If not explicitly specified, this implementation will use soft entry references.Since:
3.2

可以做緩存使用,不保證命中率。

1.6 util包

spring提供了豐富的util工具類,ObjectUtil和classUtil是最基本的兩個類:

Class的定義:

/*** Instances of the class {@code Class} represent classes and* interfaces in a running Java application.  An enum is a kind of* class and an annotation is a kind of interface.  Every array also* belongs to a class that is reflected as a {@code Class} object* that is shared by all arrays with the same element type and number* of dimensions.  The primitive Java types ({@code boolean},* {@code byte}, {@code char}, {@code short},* {@code int}, {@code long}, {@code float}, and* {@code double}), and the keyword {@code void} are also* represented as {@code Class} objects.** <p> {@code Class} has no public constructor. Instead {@code Class}* objects are constructed automatically by the Java Virtual Machine as classes* are loaded and by calls to the {@code defineClass} method in the class* loader.** <p> The following example uses a {@code Class} object to print the* class name of an object:** <blockquote><pre>*     void printClassName(Object obj) {*         System.out.println("The class of " + obj +*                            " is " + obj.getClass().getName());*     }* </pre></blockquote>** <p> It is also possible to get the {@code Class} object for a named* type (or for void) using a class literal.  See Section 15.8.2 of* <cite>The Java&trade; Language Specification</cite>.* For example:** <blockquote>*     {@code System.out.println("The name of class Foo is: "+Foo.class.getName());}* </blockquote>** @param <T> the type of the class modeled by this {@code Class}* object.  For example, the type of {@code String.class} is {@code* Class<String>}.  Use {@code Class<?>} if the class being modeled is* unknown.** @author  unascribed* @see     java.lang.ClassLoader#defineClass(byte[], int, int)* @since   JDK1.0*/
public final class Class<T> implements java.io.Serializable,GenericDeclaration,Type,AnnotatedElement

說明

Java程序在運行時,Java運行時系統一直對所有的對象進行所謂的運行時類型標識。這項信息紀錄了每個對象所屬的類。虛擬機通常使用運行時類型信息選準正確方法去執行,用來保存這些類型信息的類是Class類。Class類封裝一個對象和接口運行時的狀態,當裝載類時,Class類型的對象自動創建。
Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineClass 方法自動構造的,因此不能顯式地聲明一個Class對象。
虛擬機為每種類型管理一個獨一無二的Class對象。也就是說,每個類(型)都有一個Class對象。運行程序時,Java虛擬機(JVM)首先檢查是否所要加載的類對應的Class對象是否已經加載。如果沒有加載,JVM就會根據類名查找.class文件,并將其Class對象載入。
基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也都對應一個 Class 對象。
每個數組屬于被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。
一般某個類的Class對象被載入內存,它就用來創建這個類的所有對象。
一、如何得到Class的對象呢?有三種方法可以的獲取:
1、調用Object類的getClass()方法來得到Class對象,這也是最常見的產生Class對象的方法。例如:
MyObject x;
Class c1 = x.getClass();
2、使用Class類的中靜態forName()方法獲得與字符串對應的Class對象。例如:
Class c2=Class.forName(“MyObject”),Employee必須是接口或者類的名字。
3、獲取Class類型對象的第三個方法非常簡單。如果T是一個Java類型,那么T.class就代表了匹配的類對象。例如
Class cl1 = Manager.class;
Class cl2 = int.class;
Class cl3 = Double[].class;
注意:Class對象實際上描述的只是類型,而這類型未必是類或者接口。例如上面的int.class是一個Class類型的對象。由于歷史原因,數組類型的getName方法會返回奇怪的名字。
二、Class類的常用方法
1、getName()
一個Class對象描述了一個特定類的屬性,Class類中最常用的方法getName以 String 的形式返回此 Class 對象所表示的實體(類、接口、數組類、基本類型或 void)名稱。
2、newInstance()
Class還有一個有用的方法可以為類創建一個實例,這個方法叫做newInstance()。例如:
x.getClass.newInstance(),創建了一個同x一樣類型的新實例。newInstance()方法調用默認構造器(無參數構造器)初始化新建對象。
3、getClassLoader()
返回該類的類加載器。
4、getComponentType()
返回表示數組組件類型的 Class。
5、getSuperclass()
返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的超類的 Class。
6、isArray()
判定此 Class 對象是否表示一個數組類。
三、Class的一些使用技巧
1、forName和newInstance結合起來使用,可以根據存儲在字符串中的類名創建對象。例如
Object obj = Class.forName(s).newInstance();
2、虛擬機為每種類型管理一個獨一無二的Class對象。因此可以使用==操作符來比較類對象。例如:
if(e.getClass() == Employee.class)…

Object定義:

/*** Class {@code Object} is the root of the class hierarchy.* Every class has {@code Object} as a superclass. All objects,* including arrays, implement the methods of this class.** @author  unascribed* @see     java.lang.Class* @since   JDK1.0*/
public class Object

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249613.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249613.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五分鐘搞懂后綴數組!

為什么學后綴數組 后綴數組是一個比較強大的處理字符串的算法&#xff0c;是有關字符串的基礎算法&#xff0c;所以必須掌握。 學會后綴自動機(SAM)就不用學后綴數組(SA)了&#xff1f;不&#xff0c;雖然SAM看起來更為強大和全面&#xff0c;但是有些SAM解決不了的問題能被SA解…

spring-core

spring最核心的組件是BeanFactory&#xff0c;看了源碼才發現&#xff0c;BeanFactory并非定義在spring-core中&#xff0c;那spring-core都有啥東東&#xff1f; spring-core主要提供以下服務&#xff0c;為BeanFactory的定義提供基礎服務。 1, ConversionService Conversi…

nginx配置靜態文件過期時間

1. 編輯虛擬主機配置文件/usr/local/nginx/conf/vhosts/huangzhenping.conf 說明&#xff1a;采用location方式 12345678910location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${access_log off;expires 1d;}location ~ \.(js|css){access_log off;expires 1d;}2. 檢查配置文件&#x…

vue 移動端在div上綁定click事件 失效

在.vue的文件中使用了better-scroll&#xff0c;在div標簽上綁定click事件后&#xff0c;無效。 原因&#xff1a;使用了better-scroll&#xff0c;默認它會阻止touch事件。所以在配置中需要加上click: true 即可解決 mounted(){this.$nextTick(() > {let bscrollDom this.…

Java中的鉤子方法

鉤子方法是啥 鉤子顧名思義就是用來掛東西的。那么要掛東西必須有個被掛的東西&#xff0c;要不就是鐵環、要不就是墻的邊沿。所以要能掛住東西必須要有個被勾住的鐵環&#xff0c;要一個鉤子。那么在java中也是同樣的原理&#xff0c;你首先需要一個被掛在的東西&#xff0c;一…

啟動tomcat出現too many connections的原因及解決方法

感謝分享&#xff0c;原文地址&#xff1a;http://blog.sina.com.cn/s/blog_e7e07ec30102vsba.html一、原因 產生too many connections 的直接原因是因為數據庫提供的連接被全部占滿了。數據庫可以提供多少連接&#xff0c;可以再my.cnf(linux)或者my.ini(windows)下設定。這個…

Spring Beans 初始化流程分析

測試用例 依然使用這個官網上的用例&#xff0c;來進行調試&#xff1b; Person.java package org.shangyang.spring.container;/**- - author shangyang**/public class Person {String name;Person spouse;public String getName() {return name;}public void setName(Stri…

劍指offer(65)矩陣中的路徑

題目描述 請設計一個函數&#xff0c;用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個格子開始&#xff0c;每一步可以在矩陣中向左&#xff0c;向右&#xff0c;向上&#xff0c;向下移動一個格子。如果一條路徑經過了矩陣中的某一個…

VSCode中怎么改變文件夾的圖標

昨天更新了VSCode后我的文件夾圖標莫名其妙的沒有了&#xff0c;變成了下圖這樣 看著真的讓我難受的頭皮發麻&#xff0c;本來打代碼就頭發少&#xff0c;難道非要讓我變成禿頭&#xff0c;不可能不可能&#xff0c;所以我找了找怎么解決 來&#xff0c;各位看官上眼 如圖所示 …

jdk1.8以前不建議使用其自帶的Base64來加解密

JDK1.8之前的base64是內部測試使用的代碼&#xff0c;不建議生產環境使用&#xff0c;而且未來可能會移除&#xff0c; JDK1.8提供最新可以正式使用的Base64類&#xff0c; 不要使用JDK中自帶的sun.misc.BASE64Decoder這個類去BASE64&#xff0c; 這個會在后面多加換行。使用ap…

Redis的五大數據類型

1.String&#xff08;字符串&#xff09; String是Redis最基本的類型&#xff0c;一個Key對應一個Value。 String類型是二進制安全的&#xff0c;意思是Redis的String可以包含任何數據&#xff0c;比如jpg圖片或者序列化的對象。 String類型是Redis最基本的數據類型&#xff0c…

springxml解析

1.XML驗證模式的認識 首先XML的驗證模式有兩種&#xff1a;DTD和XSD。 DTD文檔類型定義&#xff0c;是XML約束模式語言。它是為了保證XML文檔格式正確有效的方法。通過XML文檔和DTD文檔的比較來判斷XML是否符合規范。(現在我很少見&#xff0c;不知道是不是淘汰了) 舉個例子&…

jq函數綁定與解綁

最近學到幾個新的jq函數 1、bind&#xff08;&#xff09;綁定函數 2、unbind&#xff08;&#xff09;解綁函數 3、add() .給元素追加字符串 4、addClass() 給某元素增加class屬性值轉載于:https://www.cnblogs.com/bigwang1126/p/9566556.html

微信小程序時間標簽與范圍聯動設計實現

微信小程序時間標簽與范圍聯動設計實現&#xff1f;最近忙于一個有關數據管理的微信小程序開發&#xff0c;遇到了上圖情況&#xff0c;雖然很簡單&#xff0c;還是整理一下。若有錯誤&#xff0c;請廣大朋友們指正。 使用微信小程序組件radio-group、picker&#xff0c;用wxss…

github中的watch、star、fork的作用

在每個 github 項目的右上角&#xff0c;都有三個按鈕,分別是 watch、star、fork&#xff0c;但是有些剛開始使用 github 的同學&#xff0c;可能對這三個按鈕的使用卻不怎么了解&#xff0c;包括一開始使用 github 的我也是如此&#xff0c;這篇博客&#xff0c;結合自己的理解…

docker 操作 記錄

docker ps #查看當前docker容器 docker exec -it 容器名稱 sh 進入docker容器 docker stop 停止docker容器轉載于:https://www.cnblogs.com/objects/p/9569299.html

關于群論證明費馬小定理?

這篇博客就是講證費馬的&#xff0c;沒什么意思。 既然是要用群論證明費馬小定理&#xff0c;那么我們先用數論證明一下。 (以下的 p 為一個質數) 首先我們考慮 一個前置定理&#xff1a; 第一個證明 若 $(c,p) 1$ (即 c 與 p 的 gcd 為 1)&#xff0c;且 $ac ≡ bc (mod\ p)$ …

spring 源碼-context

1 spring-context 模塊概要 該模塊主要實現在spring-beans 模塊的擴展&#xff0c;主要對aop支持及el表達式的實現 分析示例 public static void main(String[] args){ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("spring-aop.xml"…

標示符和關鍵字的總結--希望別再犯錯

&#xff08;一&#xff09;Java關鍵字的表 一共50個關鍵字&#xff0c;如下表 其中絕大部分關鍵詞是Java語法發布之初就約定好的&#xff0c;少部分關鍵詞是隨Java語言發展后加入的。 strictfp JDK1.2 加入 assert JDK1.4 加入 enum JDK5.0 加入 還有少數單詞&#xff0c;目前…

歷屆試題 打印十字圖

問題描述 小明為某機構設計了一個十字型的徽標&#xff08;并非紅十字會啊&#xff09;&#xff0c;如下所示&#xff1a; ..$$$$$$$$$$$$$....$...........$..$$$.$$$$$$$$$.$$$$...$.......$...$$.$$$.$$$$$.$$$.$$.$...$...$...$.$$.$.$$$.$.$$$.$.$$.$.$...$...$.$.$$.$.$.…