二者都是用於bean的注入
區別有:①@Autowired是spring提供的註解,而@Resouce是由J2EE提供的,在javax.annotation.Resource包html
②@Autowired默認按類型裝配,若是要按照名稱裝配,須要加上@Qualifier註解,以下:java
public class TestServiceImpl { @Autowired @Qualifier("userDao") private UserDao userDao; }
@Resource默認經過反射機制,按照名稱裝配,若是匹配不上則會拋出異常。也可指定type屬性進行匹配,經過類型匹配到多個或者匹配不上也會拋出異常redis
Redis是一個基於內存的高性能的key-value數據庫算法
優勢:spring
(1)速度快,應該數據都在內存中sql
(2)支持豐富的數據類型,有string、list、set、sorted set、hash數據庫
(3)支持事務,操做都是原子性編程
(4)可設置過時時間,可用於緩存等設計模式
一、緩存雪崩:因爲原有緩存失效(或者數據未加載到緩存中),新緩存未到期間,全部本來應該訪問緩存的請求都去查詢數據庫了,而對數據庫CPU和內存形成巨大壓力,嚴重的會形成數據庫宕機,形成系統的崩潰。數組
解決思路:
二、緩存穿透:指用戶查詢數據,在數據庫沒有,天然在緩存中也不會有。這樣就致使用戶查詢的時候,在緩存中找不到,每次都要去數據庫中查詢。
解決思路:
三、緩存預熱:指系統上線後,將相關的緩存數據直接加載到緩存系統。這樣就能夠避免在用戶請求的時候,先查詢數據庫,而後再將數據緩存的問題!用戶直接查詢事先被預熱的緩存數據!
四、緩存更新
五、緩存降級:當訪問量劇增、服務出現問題(如響應時間慢或不響應)或非核心服務影響到核心流程的性能時,仍然須要保證服務仍是可用的,即便是有損服務。系統能夠根據一些關鍵數據進行自動降級,也能夠配置開關實現人工降級。
分佈式緩存系統面臨的問題緩存一致性問題
緩存數據的淘汰
緩存算法
ThreadLocal 保證一個線程使用同一個對象
ThreadPoolExcutor 線程池建立
序列化是指把對象轉換爲字節序列的過程;而反序列化是指把字節序列恢復爲對象的過程;
序列化主要的兩種用途:
1)把對象的字節序列保存到硬盤中(一般存放在一個文件中)
2)在網絡上傳送對象的字節序列
何時使用序列化:
1)對象序列化能夠實現分佈式對象,主要應用例如:RMI要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時同樣。
2)java對象序列化不只保留一個對象的數據,並且遞歸保存對象引用的每一個對象的數據。能夠將整個對象層次寫入字節流中,能夠保存在文件中或在網絡鏈接上傳遞。利用對象序列化能夠進行對象的「深複製」,即複製對象自己及引用的對象自己。序列化一個對象可能獲得整個對象序列。
IoC就是對象的建立,依賴都有Spring及配置文件控制;而AOP就是統一的給一些相似的方法加上一樣的功能,好比日誌,事務。
IOC:控制反轉,是一種設計模式。
1)控制反轉,由傳統在程序中控制,變爲由容器控制
2)依賴注入:將互相依賴的對象分離,在Spring配置文件中描述他們的依賴關係。他們依賴關係只在使用的時候才創建。
AOP:面向切面。將系統中非核心的業務提取出來,進行單獨處理,好比事務、日誌和安全等。
實現方式:
通知類型:
注意編程中核心是一個ProceedingJoinPoint
1 @Component
2 @Aspect 3 public class Operator { 4 5 @Pointcut("execution(* com.aijava.springcode.service..*.*(..))") 6 public void pointCut(){} 7 8 @Before("pointCut()") 9 public void doBefore(JoinPoint joinPoint){ 10 System.out.println("AOP Before Advice..."); 11 } 12 13 @After("pointCut()") 14 public void doAfter(JoinPoint joinPoint){ 15 System.out.println("AOP After Advice..."); 16 } 17 18 @AfterReturning(pointcut="pointCut()",returning="returnVal") 19 public void afterReturn(JoinPoint joinPoint,Object returnVal){ 20 System.out.println("AOP AfterReturning Advice:" + returnVal); 21 } 22 23 @AfterThrowing(pointcut="pointCut()",throwing="error") 24 public void afterThrowing(JoinPoint joinPoint,Throwable error){ 25 System.out.println("AOP AfterThrowing Advice..." + error); 26 System.out.println("AfterThrowing..."); 27 } 28 29 @Around("pointCut()") 30 public void around(ProceedingJoinPoint pjp){ 31 System.out.println("AOP Aronud before..."); 32 try { 33 pjp.proceed(); 34 } catch (Throwable e) { 35 e.printStackTrace(); 36 } 37 System.out.println("AOP Aronud after..."); 38 } 39 40 }
通知執行的優先級
進入目標方法時,先織入Around,再織入Before,退出目標方法時,先織入Around,再織入AfterReturning,最後才織入After。
注意:Spring AOP的環繞通知會影響到AfterThrowing通知的運行,不要同時使用!同時使用也沒啥意義。
原文:https://blog.csdn.net/chinacr07/article/details/78817449
轉發(forward) |
|
||
地址欄 | 不變 | 改成重定向的地址 | |
數據共享 | 能夠共享轉發前request的數據 | 不能共享request的數據 | |
運用 | 通常用於用戶登陸後轉發到相應模塊 | 通常用於用戶註銷後回到首頁和跳轉到其餘網站等 | |
效率 | 高 | 低 |
堆:線程共享,存放數組和實例化對象(GC主要在這裏進行垃圾回收)jdk8後把運行時常量池、靜態變量也移到堆區進行存儲
虛擬機棧:線程私有,隨線程建立而建立,存放基本數據類型變量和引用等(操做數棧、方法出口等信息)
本地方法棧:線程私有,與虛擬機用到native方法相關,(JNI)
方法區:常量池
程序計數器:JVM支持多個線程同時運行,每一個線程都有本身的程序計數器,運行JVM方法會保存當前指令的地址。(PS:線程執行過程當中並非一口氣完成的,執行到一半中止後,下次繼續執行時,經過程序計數器就能夠知道該從什麼地方開始執行)
HashMap | HashTable |
非線程安全 | 線程安全 |
鍵值容許爲null | 不容許爲null |
containsValue/containsKey | contains |
繼承自Dictionary類 | 是Map接口的實現 |
cookie | session |
數據存放在客戶端 | 數據存放在服務器 |
經過http協議實現的 | - |
不安全(存放在瀏覽器) | 相對安全 |
- | 可能影響服務器性能 |
常規信息可放在cookie | 重要信息如登陸信息等,放在session |
(1)編程式事務管理。咱們須要在代碼中調用beginTransaction()、commit()、rollback()等事務管理相關的方法,這就是編程式事務管理。
(2)基於xml配置, 聲明式事務管理(TransactionProxyFactoryBean)
(3)基於註解, @Transactional 的聲明式事務管理
(4)基於Aspectj AOP配置事務
1 public class ExA { 2 static { 3 System.out.println("父類--靜態代碼塊"); 4 } 5 6 public ExA() { 7 System.out.println("父類--構造函數"); 8 } 9 10 { 11 System.out.println("父類--非靜態代碼塊"); 12 } 13 14 public static void main(String[] args) { 15 new ExB(); 16 } 17 } 18 19 class ExB extends ExA { 20 static { 21 System.out.println("子類--靜態代碼塊"); 22 } 23 { 24 System.out.println("子類--非靜態代碼塊"); 25 } 26 27 public ExB() { 28 System.out.println("子類--構造函數"); 29 } 30 } 31 32 執行結果 33 ===== 34 父類--靜態代碼塊 35 子類--靜態代碼塊 36 父類--非靜態代碼塊 37 父類--構造函數 38 子類--非靜態代碼塊 39 子類--構造函數
sleep()是Thread類中的方法,而wait是Object類提供的方法;
調用sleep()方法的時候,線程不會釋放對象鎖;
調用wait()方法的時候,線程會釋放對象鎖,只有對此對象調用notify()方法後,才獲取對象鎖進入運行狀態
原文:https://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html
(一)、索引
如下狀況不會命中索引: