@TOC# Spring系列 記錄在程式走的每一步___auth:huf
最近在復習Spring核心原理; 順手記錄;
一、Spring創建Bean的生命周期
在Spring的入口開始
package com. example ;
import com. example. service. StudentService ;
import org. springframework. boot. SpringApplication ;
import org. springframework. boot. autoconfigure. SpringBootApplication ;
import org. springframework. context. ConfigurableApplicationContext ;
import org. springframework. context. annotation. Import ;
@SpringBootApplication
public class DemoApplication {
public static void main ( String [ ] args) {
ConfigurableApplicationContext run = SpringApplication . run ( DemoApplication . class , args) ;
StudentService studentService = ( StudentService ) run. getBean ( "studentService" ) ;
System . out. println ( studentService) ;
}
}
直接使用SpringBoot, 在ConfigurableApplicationContext 進行加載 StudentService 以下是StudentService的物體類 StudentService 獲取直接從Spring容器中獲取. 跟直接new 出來的類有天壤之別; 其中一大塊就是屬性注入問題; 屬性注入就要提起 關于BeanDefinition 與 Bean之間的關系 在后面的文章中會詳細介紹; 本期文章中不會有體現;
package com. example. service ;
import com. example. entity. Student ;
public interface StudentService {
. . .
}
package com. example. service. impl ;
import com. example. service. StudentService ;
@Service ( value= "studentService" )
public class StudentServiceImpl implements StudentService {
. .
}
以下是一個Bean的生命周期圖<簡化版>
<style>#mermaid-svg-UAqxqaCfrD6qxnAA .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .label text{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .node rect,#mermaid-svg-UAqxqaCfrD6qxnAA .node circle,#mermaid-svg-UAqxqaCfrD6qxnAA .node ellipse,#mermaid-svg-UAqxqaCfrD6qxnAA .node polygon,#mermaid-svg-UAqxqaCfrD6qxnAA .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-UAqxqaCfrD6qxnAA .node .label{text-align:center;fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .node.clickable{cursor:pointer}#mermaid-svg-UAqxqaCfrD6qxnAA .arrowheadPath{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-UAqxqaCfrD6qxnAA .flowchart-link{stroke:#333;fill:none}#mermaid-svg-UAqxqaCfrD6qxnAA .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-UAqxqaCfrD6qxnAA .edgeLabel rect{opacity:0.9}#mermaid-svg-UAqxqaCfrD6qxnAA .edgeLabel span{color:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-UAqxqaCfrD6qxnAA .cluster text{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-UAqxqaCfrD6qxnAA .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-UAqxqaCfrD6qxnAA text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-UAqxqaCfrD6qxnAA .actor-line{stroke:grey}#mermaid-svg-UAqxqaCfrD6qxnAA .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-UAqxqaCfrD6qxnAA #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .sequenceNumber{fill:#fff}#mermaid-svg-UAqxqaCfrD6qxnAA #sequencenumber{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA #crosshead path{fill:#333;stroke:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .messageText{fill:#333;stroke:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-UAqxqaCfrD6qxnAA .labelText,#mermaid-svg-UAqxqaCfrD6qxnAA .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-UAqxqaCfrD6qxnAA .loopText,#mermaid-svg-UAqxqaCfrD6qxnAA .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-UAqxqaCfrD6qxnAA .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-UAqxqaCfrD6qxnAA .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-UAqxqaCfrD6qxnAA .noteText,#mermaid-svg-UAqxqaCfrD6qxnAA .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-UAqxqaCfrD6qxnAA .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-UAqxqaCfrD6qxnAA .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-UAqxqaCfrD6qxnAA .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-UAqxqaCfrD6qxnAA .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA .section{stroke:none;opacity:0.2}#mermaid-svg-UAqxqaCfrD6qxnAA .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-UAqxqaCfrD6qxnAA .section2{fill:#fff400}#mermaid-svg-UAqxqaCfrD6qxnAA .section1,#mermaid-svg-UAqxqaCfrD6qxnAA .section3{fill:#fff;opacity:0.2}#mermaid-svg-UAqxqaCfrD6qxnAA .sectionTitle0{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .sectionTitle1{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .sectionTitle2{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .sectionTitle3{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-UAqxqaCfrD6qxnAA .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA .grid path{stroke-width:0}#mermaid-svg-UAqxqaCfrD6qxnAA .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-UAqxqaCfrD6qxnAA .task{stroke-width:2}#mermaid-svg-UAqxqaCfrD6qxnAA .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA .taskText:not([font-size]){font-size:11px}#mermaid-svg-UAqxqaCfrD6qxnAA .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-UAqxqaCfrD6qxnAA .task.clickable{cursor:pointer}#mermaid-svg-UAqxqaCfrD6qxnAA .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-UAqxqaCfrD6qxnAA .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-UAqxqaCfrD6qxnAA .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-UAqxqaCfrD6qxnAA .taskText0,#mermaid-svg-UAqxqaCfrD6qxnAA .taskText1,#mermaid-svg-UAqxqaCfrD6qxnAA .taskText2,#mermaid-svg-UAqxqaCfrD6qxnAA .taskText3{fill:#fff}#mermaid-svg-UAqxqaCfrD6qxnAA .task0,#mermaid-svg-UAqxqaCfrD6qxnAA .task1,#mermaid-svg-UAqxqaCfrD6qxnAA .task2,#mermaid-svg-UAqxqaCfrD6qxnAA .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-UAqxqaCfrD6qxnAA .taskTextOutside0,#mermaid-svg-UAqxqaCfrD6qxnAA .taskTextOutside2{fill:#000}#mermaid-svg-UAqxqaCfrD6qxnAA .taskTextOutside1,#mermaid-svg-UAqxqaCfrD6qxnAA .taskTextOutside3{fill:#000}#mermaid-svg-UAqxqaCfrD6qxnAA .active0,#mermaid-svg-UAqxqaCfrD6qxnAA .active1,#mermaid-svg-UAqxqaCfrD6qxnAA .active2,#mermaid-svg-UAqxqaCfrD6qxnAA .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-UAqxqaCfrD6qxnAA .activeText0,#mermaid-svg-UAqxqaCfrD6qxnAA .activeText1,#mermaid-svg-UAqxqaCfrD6qxnAA .activeText2,#mermaid-svg-UAqxqaCfrD6qxnAA .activeText3{fill:#000 !important}#mermaid-svg-UAqxqaCfrD6qxnAA .done0,#mermaid-svg-UAqxqaCfrD6qxnAA .done1,#mermaid-svg-UAqxqaCfrD6qxnAA .done2,#mermaid-svg-UAqxqaCfrD6qxnAA .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-UAqxqaCfrD6qxnAA .doneText0,#mermaid-svg-UAqxqaCfrD6qxnAA .doneText1,#mermaid-svg-UAqxqaCfrD6qxnAA .doneText2,#mermaid-svg-UAqxqaCfrD6qxnAA .doneText3{fill:#000 !important}#mermaid-svg-UAqxqaCfrD6qxnAA .crit0,#mermaid-svg-UAqxqaCfrD6qxnAA .crit1,#mermaid-svg-UAqxqaCfrD6qxnAA .crit2,#mermaid-svg-UAqxqaCfrD6qxnAA .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-UAqxqaCfrD6qxnAA .activeCrit0,#mermaid-svg-UAqxqaCfrD6qxnAA .activeCrit1,#mermaid-svg-UAqxqaCfrD6qxnAA .activeCrit2,#mermaid-svg-UAqxqaCfrD6qxnAA .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-UAqxqaCfrD6qxnAA .doneCrit0,#mermaid-svg-UAqxqaCfrD6qxnAA .doneCrit1,#mermaid-svg-UAqxqaCfrD6qxnAA .doneCrit2,#mermaid-svg-UAqxqaCfrD6qxnAA .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-UAqxqaCfrD6qxnAA .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-UAqxqaCfrD6qxnAA .milestoneText{font-style:italic}#mermaid-svg-UAqxqaCfrD6qxnAA .doneCritText0,#mermaid-svg-UAqxqaCfrD6qxnAA .doneCritText1,#mermaid-svg-UAqxqaCfrD6qxnAA .doneCritText2,#mermaid-svg-UAqxqaCfrD6qxnAA .doneCritText3{fill:#000 !important}#mermaid-svg-UAqxqaCfrD6qxnAA .activeCritText0,#mermaid-svg-UAqxqaCfrD6qxnAA .activeCritText1,#mermaid-svg-UAqxqaCfrD6qxnAA .activeCritText2,#mermaid-svg-UAqxqaCfrD6qxnAA .activeCritText3{fill:#000 !important}#mermaid-svg-UAqxqaCfrD6qxnAA .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-UAqxqaCfrD6qxnAA g.classGroup text .title{font-weight:bolder}#mermaid-svg-UAqxqaCfrD6qxnAA g.clickable{cursor:pointer}#mermaid-svg-UAqxqaCfrD6qxnAA g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-UAqxqaCfrD6qxnAA g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-UAqxqaCfrD6qxnAA .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-UAqxqaCfrD6qxnAA .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-UAqxqaCfrD6qxnAA .dashed-line{stroke-dasharray:3}#mermaid-svg-UAqxqaCfrD6qxnAA #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA .commit-id,#mermaid-svg-UAqxqaCfrD6qxnAA .commit-msg,#mermaid-svg-UAqxqaCfrD6qxnAA .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-UAqxqaCfrD6qxnAA g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-UAqxqaCfrD6qxnAA g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-UAqxqaCfrD6qxnAA g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-UAqxqaCfrD6qxnAA .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-UAqxqaCfrD6qxnAA .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-UAqxqaCfrD6qxnAA .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-UAqxqaCfrD6qxnAA .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-UAqxqaCfrD6qxnAA .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-UAqxqaCfrD6qxnAA .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-UAqxqaCfrD6qxnAA .edgeLabel text{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-UAqxqaCfrD6qxnAA .node circle.state-start{fill:black;stroke:black}#mermaid-svg-UAqxqaCfrD6qxnAA .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-UAqxqaCfrD6qxnAA #statediagram-barbEnd{fill:#9370db}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-state .divider{stroke:#9370db}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-UAqxqaCfrD6qxnAA .note-edge{stroke-dasharray:5}#mermaid-svg-UAqxqaCfrD6qxnAA .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-UAqxqaCfrD6qxnAA .error-icon{fill:#522}#mermaid-svg-UAqxqaCfrD6qxnAA .error-text{fill:#522;stroke:#522}#mermaid-svg-UAqxqaCfrD6qxnAA .edge-thickness-normal{stroke-width:2px}#mermaid-svg-UAqxqaCfrD6qxnAA .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-UAqxqaCfrD6qxnAA .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-UAqxqaCfrD6qxnAA .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-UAqxqaCfrD6qxnAA .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-UAqxqaCfrD6qxnAA .marker{fill:#333}#mermaid-svg-UAqxqaCfrD6qxnAA .marker.cross{stroke:#333}
:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}</style>
<style>#mermaid-svg-UAqxqaCfrD6qxnAA {
color: rgba(0, 0, 0, 0.75);
font: ;
}</style>
Spring容器啟動
通過反射加載物件
UserService,Class
構造方法
默認無參構造方法
當有多個構造方法時,并且沒有無參構造方法時,應當使用Autowired來指定
普通物件
依賴注入
初始化前PostConstruct
初始化InitializingBean
初始化后aop
代理物件
bean
1: 利用該類的構造方法來實體化一個物件(如果說有多個構造方法,那么Spring會自行選擇,選擇規則是 在沒有@Autowired的時候 就會選擇默認的,在沒有默認的, 就會選擇唯一一個 如果有多個就會報錯,此時需要在構造方法內指定@Autowired);
2: 得到一個物件后 查看其屬性是否被 @Autowired注解 ; 如果有那么Spring會從容器中尋找該物件進行注入;
3: 依賴注入之后,Spring會自行判斷該物件是否實作了BeanNameAware,BeanClassLoaderAware,BeanFactoryAware介面 如果有.那么就會調取其實作方法setBeanName()、setBeanClassLoader()、 setBeanFactory();那Spring就會呼叫這些方法并傳入相應的引數(Aware回呼)
4:Aware回呼后,那么就會判斷該類是否存在PostConstruct注解 了,如果存在,Spring會呼叫當前物件的此方法(初始化前)
5:緊接著,Spring會判斷該物件是否實作了InitializingBean介面,如果實作了,就 表示當前物件必須實作該介面中的afterPropertiesSet()方法,那Spring就會呼叫當前物件中的afterPropertiesSet()方法(初始化);
6:最后判斷:Spring是否需要Aop,如果不需要.那么類就創建完畢(此時是普通物件);如果需要;那么就會 動態代理 由代理類來實作AOP;此時就是代理物件; 這個需要注意 普通物件與代理物件的區別! 代理物件 實際是就是為了實作AOP; 最后附上代碼圖 Debug進行解釋
Spring中使用Cglib 進行動態代理的呢;此處以偽代碼進行解釋
package com. example. service. impl ;
import com. example. entity. Student ;
import com. example. service. StudentService ;
/**
* 此處為cglib自己生產的代理類 并且繼承
* auth:huf
*/
public class StudentServiceProxy extends StudentServiceImpl {
StudentService target; // 使用的是是前面創建的Java普通物件;注意是普通物件
public int insert ( Student stu) {
/**
* AOP的前置動作;Before
*/
//這個地方insert并非使用super.insert方法;
target. insert ( stu) ;
/**
* AOP的后置動作;
*/
}
}
AOP大致流程
AOP就是進行動態代理,在創建一個Bean的程序中,Spring在最后一步會去判斷當前正在 創建的這個Bean是不是需要進行AOP,如果需要則會進行動態代理,如何判斷當前Bean物件需不需要進行AOP: 1. 找出所有的切面Bean 2. 遍歷切面中的每個方法,看是否寫了@Before、@After等注解 3. 如果寫了,則判斷所對應的Pointcut是否和當前Bean物件的類是否匹配 4. 如果匹配則表示當前Bean物件有匹配的的Pointcut,表示需要進行AOP 利用cglib進行AOP的大致流程: 1). 生成代理類StudentServiceProxy,代理類繼承StudentServiceImpl 2). 代理類中重寫了父類的方法,比如StudentServiceImpl中的insert()方法 3). 代理類中還會有一個target屬性,該屬性的值為被代理物件(也就是通過 UserService類推斷構造方法實體化出來的物件,進行了依賴注入、初始化等步驟的 物件) 4). 代理類中的test()方法被執行時的邏輯如下: a. 執行切面邏輯(@Before) b. 呼叫target.insert() 當我們從Spring容器得到StudentServiceImpl的Bean物件時,拿到的就是UserServiceProxy所生 成的物件,也就是代理物件, StudentServiceImpl代理物件.insert()—>執行切面邏輯—>target.insert(),注意target物件不是代理 物件,而是被代理物件,
在復習程序中 修正之前跟一名同事 哲哲 說的 一個Spring原理: 注:Spring會根據入參的型別和入參的名字去Spring中找Bean物件,(以單例Bean為例, Spring會從單例池那個Map中去找): 1. 先根據入參型別找,如果只找到一個,那就直接用來作為入參 2. 如果根據型別找到多個,則再根據入參名字來確定唯一一個 3. 最終如果沒有找到,則會報錯,無法創建當前Bean物件 //在什么時候會有多個Bean同時存在在一個容器中: 代碼舉例
package com. example. config ;
import com. example. entity. Student ;
import org. springframework. context. annotation. Bean ;
import org. springframework. context. annotation. Configuration ;
/**
* BeanTest
*/
@Configuration
public class BeanTestConfig {
/**
* 這種情況下 容器就會存在多個Bean并且 相互是獨立的
* 先通過型別進行查找. 這時候會找到三個Bean
* 然后再通過名字 student1 最終定位到一個Bean;
* @return
*/
@Bean
public Student student1 ( ) {
return new Student ( ) ;
}
@Bean
public Student student2 ( ) {
return new Student ( ) ;
}
}
總結
Spring中的 Bean的生命周期大致如上. Spring @Transactional 也是通過AOP實作的;其原理 就是把autocommit 由true改為false; 由代理類進行Commit; Spring原理 會持續更新 更新時間為每個星期 三篇左右;