Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëdz³öSpring¼Ü¹¹Éè¼Æ
 
×÷ÕߣºÈýÌ«×Ó°½±û
  1486  次浏览      27
 2022-1-18
 
±à¼­ÍƼö:
ΪʲôÐèÒªSpring ʲôÊÇSpring¶ÔÓÚÕâÑùµÄÎÊÌ⣬´ó²¿·ÖÈ˶¼ÊÇ´¦ÓÚÒ»ÖÖëüëüëÊëʵÄ״̬£¬ËµµÄ³öÀ´£¬µ«ÓÖ²»ÊÇÍêȫ˵µÄ³öÀ´£¬½ñÌìÎÒÃǾÍÒԼܹ¹Éè¼ÆµÄ½Ç¶È³¢ÊԽ⿪SpringµÄÉñÃØÃæÉ´¡£
À´×ÔÓÚ51CTO ,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

ǰÑÔ

ΪʲôÐèÒªSpring ʲôÊÇSpring

¶ÔÓÚÕâÑùµÄÎÊÌ⣬´ó²¿·ÖÈ˶¼ÊÇ´¦ÓÚÒ»ÖÖëüëüëÊëʵÄ״̬£¬ËµµÄ³öÀ´£¬µ«ÓÖ²»ÊÇÍêȫ˵µÄ³öÀ´£¬½ñÌìÎÒÃǾÍÒԼܹ¹Éè¼ÆµÄ½Ç¶È³¢ÊԽ⿪SpringµÄÉñÃØÃæÉ´¡£

±¾ÆªÎÄÕÂÒÔÓÉdzÈëÉîµÄ·½Ê½½øÐнéÉÜ£¬´ó¼Ò²»±Ø¾ª»Å£¬ÎÒ¿ÉÒÔ±£Ö¤£¬Ö»ÒªÄã»á±à³Ì¾ÍÄÜ¿´¶®¡£

±¾ÆªÎÄÕ»ùÓÚSpring 5.2.8£¬ÔĶÁʱ³¤´ó¸ÅÐèÒª20·ÖÖÓ

°¸Àý

ÎÒÃÇÏÈÀ´¿´Ò»¸ö°¸Àý£ºÓÐÒ»¸öС»ï£¬ÓÐÒ»Á¾¼ªÀû³µ£¬ ƽ³£¾Í¿ª¼ªÀû³µÉϰà

´úÂëʵÏÖ£º

public?class?GeelyCar?{
public?void?run(){?
System.out.println("geely?running");
}?
}?

public?class?Boy?{
//?ÒÀÀµGeelyCar
private?final?GeelyCar?geelyCar?=?new?GeelyCar();
public?void?drive(){
geelyCar.run();
}
}

ÓÐÒ»Ì죬С»ï׬ǮÁË£¬ÓÖÂòÁËÁ¾ºìÆì£¬Ï뿪гµ¡£

¼òµ¥£¬°ÑÒÀÀµ»»³ÉHongQiCar

´úÂëʵÏÖ£º

public?class?HongQiCar?{
public?void?run(){
System.out.println("hongqi?running");
}
}

public?class?Boy?{
//?ÐÞ¸ÄÒÀÀµÎªHongQiCar
private?final?HongQiCar?hongQiCar?=?new?HongQiCar();
public?void?drive(){
hongQiCar.run();
}
}

гµ¿ªÄåÁË£¬ÓÖÏë»»»ØÀϳµ£¬Õâʱºò£¬¾Í»á³öÏÖÒ»¸öÎÊÌ⣺Õâ¸ö´úÂëÒ»Ö±ÔÚ¸ÄÀ´¸ÄÈ¥

ºÜÏÔÈ»£¬Õâ¸ö°¸ÀýÎ¥±³ÁËÎÒÃǵÄÒÀÀµµ¹ÖÃÔ­Ôò(DIP):³ÌÐò²»Ó¦ÒÀÀµÓÚʵÏÖ£¬¶øÓ¦ÒÀÀµÓÚ³éÏó

ÓÅ»¯ºó

ÏÖÔÚÎÒÃǶԴúÂë½øÐÐÈçÏÂÓÅ»¯£º

BoyÒÀÀµÓÚCar½Ó¿Ú£¬¶øÖ®Ç°µÄGeelyCarÓëHongQiCarΪCar½Ó¿ÚʵÏÖ

´úÂëʵÏÖ£º

¶¨Òå³öCar½Ó¿Ú

public?interface?Car?{
void?run();
}

½«Ö®Ç°µÄGeelyCarÓëHongQiCar¸ÄΪCarµÄʵÏÖÀà

public?class?GeelyCar?implements?Car?{
@Override
public?void?run(){
System.out.println("geely?running");
}
}

HongQiCarÏàͬ

Person´ËʱÒÀÀµµÄΪCar½Ó¿Ú

public?class?Boy?{
//?ÒÀÀµÓÚ½Ó¿Ú?
private?final?Car?car;
???
public?Person(Car?car){
this.car?=?car;
}?
public?void?drive(){
car.run();
}
}

´ËʱС»ïÏ뻻ʲô³µ¿ª£¬¾Í´«Èëʲô²ÎÊý¼´¿É£¬´úÂë²»ÔÙ·¢Éú±ä»¯¡£

¾ÖÏÞÐÔ

ÒÔÉϰ¸Àý¸ÄÔìºó¿´ÆðÀ´È·ÊµÃ»ÓÐʲô벡ÁË£¬µ«»¹ÊÇ´æÔÚÒ»¶¨µÄ¾ÖÏÞÐÔ£¬Èç¹û´ËʱÔö¼Óеij¡¾°£º

ÓÐÒ»ÌìС»ïºÈ¾ÆÁËû·¨¿ª³µ£¬ÐèÒªÕÒ¸ö´ú¼Ý¡£´ú¼Ý²¢²»¹ØÐÄËû¸øÄĸöС»ï¿ª³µ£¬Ò²²»¹ØÐÄ¿ªµÄÊÇʲô³µ£¬Ð¡»ï¾ÍͻȻ³ÉÁ˸ö³éÏó£¬Õâʱ´úÂëÓÖÒª½øÐи͝ÁË£¬´ú¼ÝÒÀÀµÐ¡»ïµÄ´úÂë¿ÉÄ᳤ܻÕâ¸öÑù×Ó£º

private final Boy boy = new YoungBoy(new HongQiCar());

Ëæ×ÅϵͳµÄ¸´ÔÓ¶ÈÔö¼Ó£¬ÕâÑùµÄÎÊÌâ¾Í»áÔ½À´Ô½¶à£¬Ô½À´Ô½ÄÑÒÔά»¤£¬ÄÇôÎÒÃÇÓ¦µ±ÈçºÎ½â¾öÕâ¸öÎÊÌâÄØ

˼¿¼

Ê×ÏÈ£¬ÎÒÃÇ¿ÉÒԿ϶¨£ºÊ¹ÓÃÒÀÀµµ¹ÖÃÔ­ÔòÊÇûÓÐÎÊÌâµÄ£¬ËüÔÚÒ»¶¨³Ì¶ÈÉϽâ¾öÁËÎÒÃǵÄÎÊÌâ¡£

ÎÒÃǾõµÃ³öÎÊÌâµÄµØ·½ÊÇÔÚ´«Èë²ÎÊýµÄ¹ý³Ì£º³ÌÐòÐèҪʲôÎÒÃǾʹ«Èëʲô£¬Ò»µ«ÏµÍ³ÖгöÏÖ¶àÖØÒÀÀµµÄÀà¹ØÏµ£¬Õâ¸ö´«ÈëµÄ²ÎÊý¾Í»á±äµÃ¼«Æä¸´ÔÓ¡£

»òÐíÎÒÃÇ¿ÉÒÔ°Ñ˼··´×ªÒ»Ï£ºÎÒÃÇÓÐʲô£¬³ÌÐò¾ÍÓÃʲô!

µ±ÎÒÃÇֻʵÏÖHongQiCarºÍYoungBoyʱ£¬´ú¼Ý¾ÍʹÓõÄÊÇ¿ª×ÅHongQiCarµÄYoungBoy!

µ±ÎÒÃÇֻʵÏÖGeelyCarºÍOldBoyʱ£¬´ú¼Ý×ÔÈ»¶øÈ»¾Í¸Ä±ä³ÉÁË¿ª×ÅGeelyCarµÄOldBoy!

¶øÈçºÎ·´×ª£¬¾ÍÊÇSpringËù½â¾öµÄÒ»´óÄÑÌâ¡£

Spring½éÉÜ

SpringÊÇÒ»¸öһվʽÇáÁ¿¼¶ÖØÁ¿¼¶µÄ¿ª·¢¿ò¼Ü£¬Ä¿µÄÊÇΪÁ˽â¾öÆóÒµ¼¶Ó¦Óÿª·¢µÄ¸´ÔÓÐÔ£¬ËüΪ¿ª·¢JavaÓ¦ÓóÌÐòÌá¹©È«ÃæµÄ»ù´¡¼Ü¹¹Ö§³Ö£¬ÈÃJava¿ª·¢Õß²»ÔÙÐèÒª¹ØÐÄÀàÓëÀàÖ®¼äµÄÒÀÀµ¹ØÏµ£¬¿ÉÒÔרעµÄ¿ª·¢Ó¦ÓóÌÐò(crud)¡£

SpringΪÆóÒµ¼¶¿ª·¢Ìṩ¸øÁ˷ḻµÄ¹¦ÄÜ£¬¶øÕâЩ¹¦Äܵĵײ㶼ÒÀÀµÓÚËüµÄÁ½¸öºËÐÄÌØÐÔ:ÒÀÀµ×¢Èë(DI)ºÍÃæÏòÇÐÃæ±à³Ì(AOP)¡£

SpringµÄºËÐĸÅÄî

IoCÈÝÆ÷

IoCµÄÈ«³ÆÎªInversion of Control£¬ÒâΪ¿ØÖÆ·´×ª£¬IoCÒ²±»³ÆÎªÒÀÀµÐÔ×¢Èë(DI)£¬ÕâÊÇÒ»¸öͨ¹ýÒÀÀµ×¢Èë¶ÔÏóµÄ¹ý³Ì£º¶ÔÏó½öͨ¹ý¹¹Ô캯Êý¡¢¹¤³§·½·¨£¬»òÕßÔÚ¶ÔÏóʵÀý»¯ÔÚÆäÉÏÉèÖõÄÊôÐÔÀ´¶¨ÒåÆäÒÀÀµ¹ØÏµ(¼´ÓëËüÃÇ×éºÏµÄÆäËû¶ÔÏó)£¬È»ºóÈÝÆ÷ÔÚ´´½¨beanʱעÈëÕâЩÐèÒªµÄÒÀÀµ¡£Õâ¸ö¹ý³Ì´Ó¸ù±¾ÉÏ˵ÊÇBean±¾Éíͨ¹ýʹÓÃÖ±½Ó¹¹½¨Àà»òÖîÈç·þÎñ¶¨Î»Ä£Ê½µÄ»úÖÆ£¬À´¿ØÖÆÆäÒÀÀµ¹ØÏµµÄʵÀý»¯»òλÖõÄÄæ¹ý³Ì(Òò´Ë±»³ÆÎª¿ØÖÆ·´×ª)¡£

ÒÀÀµµ¹ÖÃÔ­ÔòÊÇIoCµÄÉè¼ÆÔ­Àí£¬ÒÀÀµ×¢ÈëÊÇIoCµÄʵÏÖ·½Ê½¡£

ÈÝÆ÷

ÔÚSpringÖУ¬ÎÒÃÇ¿ÉÒÔʹÓÃXML¡¢Java×¢½â»òJava´úÂëµÄ·½Ê½À´±àдÅäÖÃÐÅÏ¢£¬¶øÍ¨¹ýÅäÖÃÐÅÏ¢£¬»ñÈ¡ÓйØÊµÀý»¯¡¢ÅäÖúÍ×é×°¶ÔÏóµÄ˵Ã÷£¬½øÐÐʵÀý»¯¡¢ÅäÖúÍ×é×°Ó¦ÓöÔÏóµÄ³ÆÎªÈÝÆ÷¡£

Ò»°ãÇé¿öÏ£¬ÎÒÃÇÖ»ÐèÒªÌí¼Ó¼¸¸ö×¢½â£¬ÕâÑùÈÝÆ÷½øÐд´½¨ºÍ³õʼ»¯ºó£¬ÎÒÃǾͿÉÒԵõ½Ò»¸ö¿ÉÅäÖõģ¬¿ÉÖ´ÐеÄϵͳ»òÓ¦ÓóÌÐò¡£

Bean

ÔÚSpringÖУ¬ÓÉSpring IOCÈÝÆ÷½øÐÐʵÀý»¯¡ª>×é×°¹ÜÀí¡ª>¹¹³É³ÌÐò¹Ç¼ÜµÄ¶ÔÏó³ÆÎªBean¡£Bean¾ÍÊÇÓ¦ÓóÌÐòÖÐÖÚ¶à¶ÔÏóÖ®Ò»¡£

ÒÔÉÏÈýµã´®ÆðÀ´¾ÍÊÇ£ºSpringÄÚ²¿ÊÇÒ»¸ö·ÅÖÃBeanµÄIoCÈÝÆ÷£¬Í¨¹ýÒÀÀµ×¢ÈëµÄ·½Ê½´¦ÀíBeanÖ®¼äµÄÒÀÀµ¹ØÏµ¡£

AOP

ÃæÏòÇÐÃæ±à³Ì(Aspect-oriented Programming)£¬ÊÇÏà¶ÔÃæÏò¶ÔÏó±à³Ì(OOP)µÄÒ»ÖÖ¹¦Äܲ¹³ä,OOPÃæÏòµÄÖ÷Òª¶ÔÏóÊÇÀ࣬¶øAOPÔòÊÇÇÐÃæ¡£ÔÚ´¦ÀíÈÕÖ¾¡¢°²È«¹ÜÀí¡¢ÊÂÎñ¹ÜÀíµÈ·½ÃæÓзdz£ÖØÒªµÄ×÷Óá£AOPÊÇSpring¿ò¼ÜÖØÒªµÄ×é¼þ£¬ËäÈ»IOCÈÝÆ÷ûÓÐÒÀÀµAOP£¬µ«ÊÇAOPÌṩÁ˷dz£Ç¿´óµÄ¹¦ÄÜ£¬ÓÃÀ´¶ÔIOC×ö²¹³ä¡£

AOP¿ÉÒÔÈÃÎÒÃÇÔÚ²»ÐÞ¸ÄÔ­ÓдúÂëµÄÇé¿öÏ£¬¶ÔÎÒÃǵÄÒµÎñ¹¦ÄܽøÐÐÔöÇ¿£º½«Ò»¶Î¹¦ÄÜÇÐÈëµ½ÎÒÃÇÖ¸¶¨µÄλÖã¬ÈçÔÚ·½·¨µÄµ÷ÓÃÁ´Ö®¼ä´òÓ¡ÈÕÖ¾¡£

SpringµÄÓŵã

1¡¢Springͨ¹ýDI¡¢AOPÀ´¼ò»¯ÆóÒµ¼¶Java¿ª·¢

2¡¢SpringµÄµÍÇÖÈëʽÉè¼Æ£¬ÈôúÂëµÄÎÛȾ¼«µÍ

3¡¢SpringµÄIoCÈÝÆ÷½µµÍÁËÒµÎñ¶ÔÏóÖ®¼äµÄ¸´ÔÓÐÔ£¬ÈÃ×é¼þÖ®¼ä»¥Ïà½âñî

4¡¢SpringµÄAOPÖ§³ÖÔÊÐí½«Ò»Ð©Í¨ÓÃÈÎÎñÈ簲ȫ¡¢ÊÂÎñ¡¢ÈÕÖ¾µÈ½øÐм¯ÖÐʽ´¦Àí£¬´Ó¶øÌá¸ßÁ˸üºÃµÄ¸´ÓÃÐÔ

5¡¢SpringµÄ¸ß¶È¿ª·ÅÐÔ£¬²¢²»Ç¿ÖÆÓ¦ÓÃÍêÈ«ÒÀÀµÓÚSpring£¬¿ª·¢Õß¿É×ÔÓÉÑ¡ÓÃSpring¿ò¼ÜµÄ²¿·Ö»òÈ«²¿

6¡¢SpringµÄ¸ß¶ÈÀ©Õ¹ÐÔ£¬Èÿª·¢Õß¿ÉÒÔÇáÒ×µÄÈÃ×Ô¼ºµÄ¿ò¼ÜÔÚSpringÉϽøÐм¯³É

7¡¢SpringµÄÉú̬¼«ÆäÍêÕû£¬¼¯³ÉÁ˸÷ÖÖÓÅÐãµÄ¿ò¼Ü£¬Èÿª·¢Õß¿ÉÒÔÇáÒ×µÄʹÓÃËüÃÇ

ÎÒÃÇ¿ÉÒÔûÓÐJava£¬µ«ÊDz»ÄÜûÓÐSpring~

ÓÃSpring¸ÄÔì°¸Àý

ÎÒÃÇÏÖÔÚÒѾ­ÈÏʶÁËʲôÊÇSpring£¬ÏÖÔھͳ¢ÊÔʹÓÃSpring¶Ô°¸Àý½øÐиÄÔìÒ»ÏÂ

Ô­À´µÄ½á¹¹Ã»Óб仯£¬Ö»ÐèÔÚGeelyCar»òHongQiCarÉÏÔö¼Ó@Component×¢½â£¬BoyÔÚʹÓÃʱ¼ÓÉÏ@Autowired×¢½â

´úÂëÑùʽ£º

@Componentpublic class GeelyCar implements Car { @Override public void run() { System. out .println( "geely car running" ); }}

HongQiCarÏàͬ

ÔÚSpringÖУ¬µ±Àà±êʶÁË@Component×¢½âºó¾Í±íʾÕâÊÇÒ»¸öBean£¬¿ÉÒÔ±»IoCÈÝÆ÷Ëù¹ÜÀí

@Componentpublic class Boy { // ʹÓÃAutowired×¢½â±íʾcarÐèÒª½øÐÐÒÀÀµ×¢Èë @Autowired private Car car; public void driver(){ car.run(); }}

ÎÒÃÇ֮ǰËù˵µÄ£ºÎÒÃÇʵÏÖʲô£¬³ÌÐò¾ÍʹÓÃʲô£¬ÔÚÕâÀï¾ÍµÈͬÓÚÎÒÃÇÔÚÄĸöÀàÉϱêʶÁËComponent×¢½â£¬ÄĸöÀà¾Í»áÊÇÒ»¸öBean£¬Spring¾Í»áʹÓÃËü×¢ÈëBoyµÄÊôÐÔCarÖÐ

ËùÒÔµ±ÎÒÃǸøGeelyCar±êʶComponent×¢½âʱ£¬Boy¿ªµÄ³µ¾ÍÊÇGeelyCar£¬µ±ÎÒÃǸøHongQiCar±êʶComponent×¢½âʱ£¬Boy¿ªµÄ³µ¾ÍÊÇHongQiCar

µ±È»£¬ÎÒÃDz»¿ÉÒÔÔÚGeelyCarºÍHongQiCarÉÏͬʱ±êʶComponent×¢½â£¬ÒòΪÕâÑùSpring¾Í²»ÖªµÀÓÃÄĸöCar½øÐÐ×¢ÈëÁË¡ª¡ªSpringÒ²ÓÐÑ¡ÔñÀ§ÄÑÖ¢(or Ò»boy²»ÄÜ¿ªÁ©³µ)

ʹÓÃSpringÆô¶¯³ÌÐò

// ¸æËßSpring´ÓÄĸö°üÏÂɨÃèBean£¬²»Ð´¾ÍÊǵ±Ç°°ü·¾¶@ComponentScan(basePackages = "com.my.spring.test.demo" ) public class Main { public static void main(String[] args) { // ½«Main(ÅäÖÃÐÅÏ¢)´«Èëµ½ApplicationContext(IoCÈÝÆ÷)ÖÐ ApplicationContext context = new AnnotationConfigApplicationContext(Main.class); // ´Ó(IoCÈÝÆ÷)ÖлñÈ¡µ½ÎÒÃǵÄboy Boy boy = (Boy) context.getBean( "boy" ); // ¿ª³µ boy.driver(); }}

ÕâÀï¾Í¿ÉÒÔ°ÑÎÒÃǸոսéÉÜSpringµÄ֪ʶ½øÐнâ¶ÁÁË

°Ñ¾ßÓÐComponentScan×¢½â(ÅäÖÃÐÅÏ¢)µÄMainÀ࣬´«¸øAnnotationConfigApplicationContext(IoCÈÝÆ÷)½øÐгõʼ»¯£¬¾ÍµÈÓÚ£ºIoCÈÝÆ÷ͨ¹ý»ñÈ¡ÅäÖÃÐÅÏ¢½øÐÐʵÀý»¯¡¢¹ÜÀíºÍ×é×°Bean¡£

¶øÈçºÎ½øÐÐÒÀÀµ×¢ÈëÔòÊÇÔÚIoCÈÝÆ÷ÄÚ²¿Íê³ÉµÄ£¬ÕâÒ²ÊDZ¾ÎÄÒªÌÖÂÛµÄÖØµã

˼¿¼

ÎÒÃÇͨ¹ýÒ»¸ö¸ÄÔì°¸ÀýÍêÕûµÄÈÏʶÁËSpringµÄ»ù±¾¹¦ÄÜ£¬Ò²¶Ô֮ǰµÄ¸ÅÄîÓÐÁËÒ»¸ö¾ßÏ󻯵ÄÌåÑ飬¶øÎÒÃÇ»¹²¢²»ÖªµÀSpringµÄÒÀÀµ×¢ÈëÕâÒ»ÄÚ²¿¶¯×÷ÊÇÈçºÎÍê³ÉµÄ£¬Ëùν֪ÆäÈ»¸üÒªÖªÆäËùÒÔÈ»£¬½áºÏÎÒÃǵÄÏÖÓÐ֪ʶ£¬ÒÔ¼°¶ÔSpringµÄÀí½â£¬´óµ¨²ÂÏëÍÆ²âһϰÉ(ÕâÊǺÜÖØÒªµÄÄÜÁ¦Å¶)

Æäʵ²Â²â¾ÍÊÇÖ¸£ºÈç¹ûÈÃÎÒÃÇ×Ô¼ºÊµÏÖ£¬ÎÒÃÇ»áÈçºÎʵÏÖÕâ¸ö¹ý³Ì

Ê×ÏÈ£¬ÎÒÃÇÒªÇå³þÎÒÃÇÐèÒª×öµÄÊÂÇéÊÇʲô£ºÉ¨ÃèÖ¸¶¨°üÏÂÃæµÄÀ࣬½øÐÐʵÀý»¯£¬²¢¸ù¾ÝÒÀÀµ¹ØÏµ×éºÏºÃ¡£

²½Öè·Ö½â£º

ɨÃèÖ¸¶¨°üÏÂÃæµÄÀà -> Èç¹ûÕâ¸öÀà±êʶÁËComponent×¢½â(ÊǸöBean) -> °ÑÕâ¸öÀàµÄÐÅÏ¢´æÆðÀ´

½øÐÐʵÀý»¯ -> ±éÀú´æºÃµÄÀàÐÅÏ¢ -> ͨ¹ý·´Éä°ÑÕâЩÀà½øÐÐʵÀý»¯

¸ù¾ÝÒÀÀµ¹ØÏµ×éºÏ -> ½âÎöÀàÐÅÏ¢ -> ÅжÏÀàÖÐÊÇ·ñÓÐÐèÒª½øÐÐÒÀÀµ×¢ÈëµÄ×Ö¶Î -> ¶Ô×ֶνøÐÐ×¢Èë

·½°¸ÊµÏÖ

ÎÒÃÇÏÖÔÚÒѾ­ÓÐÁËÒ»¸ö¿´ÆðÀ´ÏñÊÇÄÇôһ»ØÊµĽâ¾ö·½°¸£¬ÏÖÔھͳ¢ÊÔ°ÑÕâ¸ö·½°¸ÊµÏÖ³öÀ´

¶¨Òå×¢½â

Ê×ÏÈÎÒÃÇÐèÒª¶¨Òå³öÐèÒªÓõ½µÄ×¢½â£ºComponentScan,Component,Autowired

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public?@interface?ComponentScan?{
String?basePackages()?default?"";
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
String value() default "";
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public?@interface?Autowired?{
}

 

ɨÃèÖ¸¶¨°üÏÂÃæµÄÀà

ɨÃèÖ¸¶¨°üϵÄËùÓÐÀ࣬ÌýÆðÀ´ºÃÏñһʱÃþ²»×ÅÍ·ÄÔ£¬ÆäʵËüµÈͬÓÚÁíÒ»¸öÎÊÌ⣺ÈçºÎ±éÀúÎļþĿ¼

ÄÇô´æ·ÅÀàÐÅÏ¢Ó¦¸ÃÓÃÊ²Ã´ÄØÎÒÃÇ¿´¿´ÉÏÃæÀý×ÓÖÐgetBeanµÄ·½·¨£¬ÊDz»ÊÇÏñMapÖеÄͨ¹ýkey»ñÈ¡value¶øMapÖл¹ÓкܶàʵÏÖ£¬µ«Ḭ̈߳²È«µÄÈ´Ö»ÓÐÒ»¸ö£¬ÄǾÍÊÇConcurrentHashMap(±ð¸úÎÒ˵HashTable)

¶¨Òå´æ·ÅÀàÐÅÏ¢µÄmap

private?final?Map<String,?Class<>>?classMap?=?new?ConcurrentHashMap<>(16);

¾ßÌåÁ÷³Ì£¬ÏÂÃæÍ¬Ñù¸½ÉÏ´úÂëʵÏÖ£º

´úÂëʵÏÖ£¬¿ÉÒÔÓëÁ÷³Ìͼ½áºÏ¹Û¿´£º

ɨÃèÀàÐÅÏ¢

private?void?scan(Class<>?configClass)?{
//?½âÎöÅäÖÃÀ࣬»ñÈ¡µ½É¨Ãè°ü·¾¶
String?basePackages?=?this.getBasePackages(configClass);
//?ʹÓÃɨÃè°ü·¾¶½øÐÐÎļþ±éÀú²Ù×÷
this.doScan(basePackages);
}

private?String?getBasePackages(Class<>?configClass)?{
//?´ÓComponentScan×¢½âÖлñȡɨÃè°ü·¾¶
ComponentScan?componentScan?=?configClass.getAnnotation(ComponentScan.class); return?componentScan.basePackages();
}?

private?void?doScan(String?basePackages)?{
//?»ñÈ¡×ÊÔ´ÐÅÏ¢?
URI?resource?=?this.getResource(basePackages);
File?dir?=?new?File(resource.getPath());
for?(File?file?:?dir.listFiles())?{
if?(file.isDirectory())?{//?µÝ¹éɨÃè?
doScan(basePackages?+?"."?+?file.getName());?
}?
else?{?
//?com.my.spring.example?+?.?+?Boy.class?->?
com.my.spring.example.Boy?
String?className?=?basePackages?+?"."?
+?file.getName().replace(".class",?"");?
//?½«class´æ·Åµ½classMapÖÐ?
this.registerClass(className);? }?
}?
}?


private?void?registerClass(String?className){
try?{
//?¼ÓÔØÀàÐÅÏ¢
Class<>?clazz?=?classLoader.loadClass(className);
//?ÅжÏÊÇ·ñ±êʶComponent×¢½â
if(clazz.isAnnotationPresent(Component.class)){
//?Éú³ÉbeanName?com.my.spring.example.Boy?->?boy
String?beanName?=?this.generateBeanName(clazz);
//?car:?com.my.spring.example.Car
classMap.put(beanName,?clazz);
}?}?catch?(ClassNotFoundException?ignore)?{}
}?

ʵÀý»¯

ÏÖÔÚÒѾ­°ÑËùÓÐÊʺϵÄÀà¶¼½âÎöºÃÁË£¬½ÓÏÂÀ´¾ÍÊÇʵÀý»¯µÄ¹ý³ÌÁË

¶¨Òå´æ·ÅBeanµÄMap

  1. private final Map<String, Object> beanMap = new ConcurrentHashMap<>(16);

¾ßÌåÁ÷³Ì£¬ÏÂÃæÍ¬Ñù¸ø³ö´úÂëʵÏÖ£º

´úÂëʵÏÖ£¬¿ÉÒÔÓëÁ÷³Ìͼ½áºÏ¹Û¿´£º

±éÀúclassMap½øÐÐʵÀý»¯Bean

public?void?instantiateBean()?{
for?(String?beanName?:?classMap.keySet())?{
getBean(beanName);
}
}

Object?bean?=?beanMap.get(beanName);
if(bean?!=?null){
return?bean;
}? return?this.createBean(beanName);
}

private?Object?createBean(String?beanName){
try?{
//?´´½¨bean
Object?bean?=?this.doCreateBean(clazz);
//?½«bean´æµ½ÈÝÆ÷ÖÐ
beanMap.put(beanName,?bean);
return?bean;
}?catch?(IllegalAccessException?e)?{
throw?new?RuntimeException(e);?}
}?

private?Object?doCreateBean(Class<>?clazz)?throws?IllegalAccessException?{??//?ʵÀý»¯bean??Object?bean?=?this.newInstance(clazz);??//?Ìî³ä×ֶΣ¬½«×Ö¶ÎÉèÖµthis.populateBean(bean,?clazz);??return?bean;}?

?
private?void?populateBean(Object?bean,?Class<>?clazz)?
throws?IllegalAccessException?{?
//?½âÎöclassÐÅÏ¢£¬ÅжÏÀàÖÐÊÇ·ñÓÐÐèÒª½øÐÐÒÀÀµ×¢ÈëµÄ×Ö¶Î?
final?Field[]?fields?=?clazz.getDeclaredFields();?
for?(Field?field?:?fields)?{????
Autowired?autowired?=?field.getAnnotation(Autowired.class);??
if(autowired?!=?null){??????//?»ñÈ¡bean???
Object?value?=?this.resolveBean(field.getType());
field.setAccessible(true);?field.set(bean,?value);?
? }??}}

private?Object?resolveBean(Class<>?clazz){
//?ÏÈÅжÏclazzÊÇ·ñΪһ¸ö½Ó¿Ú£¬ÊÇÔòÅжÏclassMapÖÐÊÇ·ñ´æÔÚ×ÓÀà
if(clazz.isInterface()){
//?ÔÝʱֻ֧³ÖclassMapÖ»ÓÐÒ»¸ö×ÓÀàµÄÇé¿ö
? for?(Map.Entry<String,?Class<>
entry?:?classMap.entrySet())?{?
if?(clazz.isAssignableFrom(entry.getValue()))?{?????
return?getBean(entry.getValue());??????}???}??
throw?new?RuntimeException("ÕÒ²»µ½¿ÉÒÔ½øÐÐÒÀÀµ×¢ÈëµÄbean")?
}else?{????return?getBean(clazz);??}

×éºÏ

Á½¸öºËÐÄ·½·¨ÒѾ­Ð´ºÃÁË£¬½ÓϰÑËüÃÇ×éºÏÆðÀ´£¬ÎÒ°ÑËüÃÇʵÏÖÔÚ×Ô¶¨ÒåµÄApplicationContextÀàÖУ¬¹¹Ôì·½·¨ÈçÏ£º

public?ApplicationContext(Class<>?configClass)?{?
//?1.ɨÃèÅäÖÃÐÅÏ¢ÖÐÖ¸¶¨°üϵÄÀà?
this.scan(configClass);?
//?2.ʵÀý»¯É¨Ãèµ½µÄÀà?
this.instantiateBean();?
}?

UMLÀàͼ£º

²âÊÔ

´úÂë½á¹¹Óë°¸ÀýÏàͬ£¬ÕâÀïչʾһÏÂÎÒÃÇ×Ô¼ºµÄSpringÊÇ·ñ¿ÉÒÔÕý³£ÔËÐÐ

ÔËÐÐÕý³££¬ÖйúÈ˲»Æ­ÖйúÈË

Ô´Âë»áÔÚÎÄÄ©¸ø³ö

»Ø¹Ë

ÏÖÔÚ£¬ÎÒÃÇÒѾ­¸ù¾ÝÉèÏëµÄ·½°¸½øÐÐÁËʵÏÖ£¬ÔËÐеÄÇé¿öÒ²´ïµ½ÁËÔ¤ÆÚµÄЧ¹û¡£µ«Èç¹û×ÐϸÑо¿Ò»Ï£¬ÔÙ½áºÏÎÒÃÇÆ½³£Ê¹ÓÃSpringµÄ³¡¾°£¬¾Í»á·¢ÏÖÕâÒ»·Ý´úÂëµÄ²»ÉÙÎÊÌ⣺

1¡¢ÎÞ·¨Ö§³Ö¹¹ÔìÆ÷×¢È룬µ±È»Ò²Ã»ÓÐÖ§³Ö·½·¨×¢È룬ÕâÊÇÊôÓÚ¹¦ÄÜÉϵÄȱʧ¡£

2¡¢¼ÓÔØÀàÐÅÏ¢µÄÎÊÌ⣬¼ÓÔØÀàʱÎÒÃÇʹÓõÄÊÇclassLoader.loadClassµÄ·½Ê½£¬ËäÈ»Õâ±ÜÃâÁËÀàµÄ³õʼ»¯(¿ÉǧÍò±ðÓÃClass.forNameµÄ·½Ê½)£¬µ«»¹ÊDz»¿É±ÜÃâµÄ°ÑÀàÔªÐÅÏ¢¼ÓÔØµ½ÁËÔª¿Õ¼äÖУ¬µ±ÎÒÃÇɨÃè°üÏÂÓв»ÐèÒªµÄÀàʱ£¬Õâ¾ÍÀË·ÑÁËÎÒÃǵÄÄÚ´æ¡£

3¡¢ÎÞ·¨½â¾öbeanÖ®¼äµÄÑ­»·ÒÀÀµ£¬±ÈÈçÓÐÒ»¸öA¶ÔÏóÒÀÀµÁËB¶ÔÏó£¬ B¶ÔÏóÓÖÒÀÀµÁËA¶ÔÏó£¬Õâ¸öʱºòÎÒÃÇÔÙÀ´¿´¿´´úÂëÂß¼­£¬¾Í»á·¢ÏÖ´Ëʱ»áÏÝÈëËÀÑ­»·¡£

4¡¢À©Õ¹ÐԺܲÎÒÃǰÑËùÓеŦÄܶ¼Ð´ÔÚÒ»¸öÀàÀµ±ÏëÒªÍêÉÆ¹¦ÄÜ(±ÈÈçÒÔÉÏ3¸öÎÊÌâ)ʱ£¬¾ÍÐèҪƵ·±ÐÞ¸ÄÕâ¸öÀ࣬Õâ¸öÀàÒ²»á±äµÃÔ½À´Ô½Ó·Ö×£¬±ð˵µü´úй¦ÄÜ£¬Î¬»¤¶¼»áÁîÈËÍ·ÌÛ¡£

ÓÅ»¯·½°¸

¶ÔÓÚǰÈý¸öÎÊÌâ¶¼ÀàËÆÓÚ¹¦ÄÜÉϵÄÎÊÌ⣬¹¦ÄÜÂ¸ÄÒ»¸Ä¾ÍºÃÁË¡£

ÎÒÃÇÐèÒª×ÅÖØ¹Ø×¢µÄÊǵÚËĸöÎÊÌ⣬һ¿î¿ò¼ÜÏëÒª±äµÃÓÅÐ㣬ÄÇôËüµÄµü´úÄÜÁ¦Ò»¶¨ÒªºÃ£¬ÕâÑù¹¦ÄܲÅÄܱäµÃ·á¸»£¬¶øµü´úÄÜÁ¦µÄÓ°ÏìÒòËØÓкܶ࣬ÆäÖÐÖ®Ò»¾ÍÊÇËüµÄÀ©Õ¹ÐÔ¡£

ÄÇôӦ¸ÃÈçºÎÌá¸ßÎÒÃǵķ½°¸µÄÀ©Õ¹ÐÔÄØ£¬Áù´óÉè¼ÆÔ­Ôò¸øÁËÎÒÃǺܺõÄÖ¸µ¼×÷Óá£

ÔÚ·½°¸ÖУ¬ApplicationContext×öÁ˺ܶàÊÂÇ飬 Ö÷Òª¿ÉÒÔ·ÖΪÁ½´ó¿é

1¡¢É¨ÃèÖ¸¶¨°üϵÄÀà

2¡¢ÊµÀý»¯Bean

½èÖúµ¥Ò»Ö°ÔðÔ­ÔòµÄ˼Ï룺һ¸öÀàÖ»×öÒ»ÖÖÊ£¬Ò»¸ö·½·¨Ö»×öÒ»¼þÊ¡£

ÎÒÃǰÑɨÃèÖ¸¶¨°üϵÄÀàÕâ¼þʵ¥¶ÀʹÓÃÒ»¸ö´¦ÀíÆ÷½øÐд¦Àí£¬ÒòΪɨÃèÅäÖÃÊÇ´ÓÅäÖÃÀà¶øÀ´£¬ÄÇÎÒÃǾͽÐËûÅäÖÃÀà´¦ÀíÆ÷£ºConfigurationCalssProcessor

ʵÀý»¯BeanÕâ¼þÊÂÇéҲͬÑùÈç´Ë£¬ÊµÀý»¯BeanÓÖ·ÖΪÁËÁ½¼þÊ£ºÊµÀý»¯ºÍÒÀÀµ×¢Èë

ʵÀý»¯Bean¾ÍÊÇÏ൱ÓÚÒ»¸öÉú²úBeanµÄ¹ý³Ì£¬ÎÒÃǾͰÑÕâ¼þÊÂʹÓÃÒ»¸ö¹¤³§Àà½øÐд¦Àí£¬Ëü¾Í½Ð×ö£ºBeanFactory£¬¼ÈÈ»ÊÇÔÚÉú²úBean£¬ÄǾÍÐèÒªÔ­ÁÏ(Class)£¬ËùÒÔÎÒÃǰÑclassMapºÍbeanMap¶¼¶¨Òåµ½ÕâÀï

¶øÒÀÀµ×¢ÈëµÄ¹ý³Ì£¬Æäʵ¾ÍÊÇÔÚ´¦ÀíAutowired×¢½â£¬ÄÇËü¾Í½Ð×ö: AutowiredAnnotationBeanProcessor

ÎÒÃÇ»¹ÔÚÖªµÀ£¬ÔÚSpringÖУ¬²»½ö½öÖ»ÓÐÕâÖÖʹÓ÷½Ê½£¬»¹ÓÐxml£¬mvc£¬SpringBootµÄ·½Ê½£¬ËùÒÔÎÒÃǽ«ApplicationContext½øÐгéÏó£¬Ö»ÊµÏÖÖ÷¸ÉÁ÷³Ì£¬Ô­À´µÄ×¢½â·½Ê½½»ÓÉAnnotationApplicationContextʵÏÖ¡£

½èÖúÒÀÀµµ¹ÖÃÔ­Ôò£º³ÌÐòÓ¦µ±ÒÀÀµÓÚ³éÏó

ÔÚδÀ´£¬ÀàÐÅÏ¢²»½ö½ö¿ÉÒÔ´ÓÀàÐÅÏ¢À´£¬Ò²¿ÉÒÔ´ÓÅäÖÃÎļþ¶øÀ´£¬ËùÒÔÎÒÃǽ«ConfigurationCalssProcessor³éÏó

¶øÒÀÀµ×¢ÈëµÄ·½Ê½²»Ò»¶¨·ÇµÃÊÇÓÃAutowried×¢½â±êʶ£¬Ò²¿ÉÒÔÊDZðµÄ×¢½â±êʶ£¬±ÈÈçResource£¬ËùÒÔÎÒÃǽ«AutowiredAnnotationBeanProcessor³éÏó

BeanµÄÀàÐÍÒ²¿ÉÒÔÓкܶ࣬¿ÉÒÔÊǵ¥ÀýµÄ£¬¿ÉÒÔʹ¶àÀýµÄ£¬Ò²¿ÉÒÔÊǸö¹¤³§Bean£¬ËùÒÔÎÒÃǽ«BeanFactory³éÏó

ÏÖÔÚ£¬ÎÒÃǽèÖúÁ½´óÉè¼ÆÔ­Ôò¶ÔÎÒÃǵķ½°¸½øÐÐÁËÓÅ»¯£¬Ïà±ÈÓÚ֮ǰ¿ÉνÊÇ¡±ÍÑÌ¥»»¹Ç¡°¡£

SpringµÄÉè¼Æ

ÔÚÉÏÒ»²½£¬ÎÒÃÇʵÏÖÁË×Ô¼ºµÄ·½°¸£¬²¢»ùÓÚһЩÉèÏë½øÐÐÁËÀ©Õ¹ÐÔÓÅ»¯£¬ÏÖÔÚ£¬ÎÒÃǾÍÀ´ÈÏʶһÏÂʵ¼ÊÉÏSpringµÄÉè¼Æ

ÄÇô£¬ÔÚSpringÖÐÓÖÊÇÓÉÄÄЩ"½ÇÉ«"¹¹³ÉµÄÄØ

1¡¢Bean: Spring×÷Ϊһ¸öIoCÈÝÆ÷£¬×îÖØÒªµÄµ±È»ÊÇBean¿©

2¡¢BeanFactory: Éú²úÓë¹ÜÀíBeanµÄ¹¤³§

3¡¢BeanDefinition: BeanµÄ¶¨Ò壬Ҳ¾ÍÊÇÎÒÃÇ·½°¸ÖеÄClass£¬Spring¶ÔËü½øÐÐÁË·â×°

4¡¢BeanDefinitionRegistry: ÀàËÆÓÚBeanÓëBeanFactoryµÄ¹ØÏµ£¬BeanDefinitionRegistryÓÃÓÚ¹ÜÀíBeanDefinition

5¡¢BeanDefinitionRegistryPostProcessor: ÓÃÓÚÔÚ½âÎöÅäÖÃÀàʱµÄ´¦ÀíÆ÷£¬ÀàËÆÓÚÎÒÃÇ·½°¸ÖеÄClassProcessor

6¡¢BeanFactoryPostProcessor: BeanDefinitionRegistryPostProcessor¸¸À࣬ÈÃÎÒÃÇ¿ÉÒÔÔÙ½âÎöÅäÖÃÀàÖ®ºó½øÐкóÖô¦Àí

7¡¢BeanPostProcessor: BeanµÄºóÖô¦ÀíÆ÷£¬ÓÃÓÚÔÚÉú²úBeanµÄ¹ý³ÌÖнøÐÐһЩ´¦Àí£¬±ÈÈçÒÀÀµ×¢È룬ÀàËÆÎÒÃǵÄAutowiredAnnotationBeanProcessor

8¡¢ApplicationContext: Èç¹û˵ÒÔÉϵĽÇÉ«¶¼ÊÇÔÚ¹¤³§ÖÐÉú²úBeanµÄ¹¤ÈË£¬ÄÇôApplicationContext¾ÍÊÇÎÒÃÇSpringµÄÃÅÃæ£¬ApplicationContextÓëBeanFactoryÊÇÒ»ÖÖ×éºÏµÄ¹ØÏµ£¬ËùÒÔËüÍêÈ«À©Õ¹ÁËBeanFactoryµÄ¹¦ÄÜ£¬²¢ÔÚÆä»ù´¡ÉÏÌí¼ÓÁ˸ü¶àÌØ¶¨ÓÚÆóÒµµÄ¹¦ÄÜ£¬±ÈÈçÎÒÃÇÊìÖªµÄApplicationListener(ʼþ¼àÌýÆ÷)

ÒÔÉÏ˵µÄÀàËÆÆäʵÓÐһЩ±¾Ä©µ¹ÖÃÁË£¬ÒòΪʵ¼ÊÉÏÓ¦¸ÃÊÇÎÒÃÇ·½°¸ÖеÄʵÏÖÀàËÆÓÚSpringÖеÄʵÏÖ£¬ÕâÑù˵ֻÊÇΪÁËÈôó¼Ò¸üºÃµÄÀí½â

ÎÒÃÇÔÚ¾­ÀúÁË×Ô¼º·½°¸µÄÉè¼ÆÓëÓÅ»¯ºó£¬¶ÔÕâЩ½ÇÉ«ÆäʵÊǷdz£ÈÝÒ×Àí½âµÄ

½ÓÏÂÀ´£¬ÎÒÃǾÍÒ»¸öÒ»¸öµÄÏêϸÁ˽âÒ»ÏÂ

BeanFactory

BeanFactoryÊÇSpringÖеÄÒ»¸ö¶¥¼¶½Ó¿Ú£¬Ëü¶¨ÒåÁË»ñÈ¡BeanµÄ·½Ê½£¬SpringÖл¹ÓÐÁíÒ»¸ö½Ó¿Ú½ÐSingletonBeanRegistry£¬Ëü¶¨ÒåµÄÊDzÙ×÷µ¥ÀýBeanµÄ·½Ê½£¬ÕâÀïÎÒ½«ÕâÁ½¸ö·ÅÔÚÒ»Æð½øÐнéÉÜ£¬ÒòΪËüÃÇ´óÌåÏàͬ£¬SingletonBeanRegistryµÄ×¢ÊÍÉÏҲдÁË¿ÉÒÔÓëBeanFactory½Ó¿ÚÒ»ÆðʵÏÖ£¬·½±ãͳһ¹ÜÀí¡£

BeanFactory

1¡¢ListableBeanFactory£º½Ó¿Ú£¬¶¨ÒåÁË»ñÈ¡Bean/BeanDefinitionÁбíÏà¹ØµÄ·½·¨£¬ÈçgetBeansOfType(Class type)

2¡¢AutowireCapableBeanFactory£º½Ó¿Ú£¬¶¨ÒåÁËBeanÉúÃüÖÜÆÚÏà¹ØµÄ·½·¨£¬Èç´´½¨bean, ÒÀÀµ×¢È룬³õʼ»¯

3¡¢AbstractBeanFactory£º³éÏóÀ࣬»ù±¾ÉÏʵÏÖÁËËùÓÐÓйØBean²Ù×÷µÄ·½·¨£¬¶¨ÒåÁËBeanÉúÃüÖÜÆÚÏà¹ØµÄ³éÏó·½·¨

4¡¢AbstractAutowireCapableBeanFactory£º³éÏóÀ࣬¼Ì³ÐÁËAbstractBeanFactory£¬ÊµÏÖÁËBeanÉúÃüÖÜÆÚÏà¹ØµÄÄÚÈÝ£¬ËäÈ»ÊǸö³éÏóÀ࣬µ«ËüûÓгéÏó·½·¨

5¡¢DefaultListableBeanFactory£º¼Ì³ÐÓëʵÏÖÒÔÉÏËùÓÐÀàºÍ½Ó¿Ú£¬ÊÇΪSpringÖÐ×îµ×²ãµÄBeanFactory, ×ÔÉíʵÏÖÁËListableBeanFactory½Ó¿Ú

6¡¢ApplicationContext£ºÒ²ÊÇÒ»¸ö½Ó¿Ú£¬ÎÒÃÇ»áÔÚÏÂÃæÓÐרÃŶÔËüµÄ½éÉÜ

SingletonBeanRegistry

1¡¢DefaultSingletonBeanRegistry£º ¶¨ÒåÁËBeanµÄ»º´æ³Ø£¬ÀàËÆÓÚÎÒÃǵÄBeanMap£¬ÊµÏÖÁËÓйص¥ÀýµÄ²Ù×÷£¬±ÈÈçgetSingleton(ÃæÊÔ³£ÎʵÄÈý¼¶»º´æ¾ÍÔÚÕâÀï)

2¡¢FactoryBeanRegistrySupport£ºÌṩÁ˶ÔFactoryBeanµÄÖ§³Ö£¬±ÈÈç´ÓFactoryBeanÖлñÈ¡Bean

BeanDefinition

BeanDefinitionÆäʵҲÊǸö½Ó¿Ú(Ïë²»µ½°É)£¬ÕâÀﶨÒåÁËÐí¶àºÍÀàÐÅÏ¢Ïà¹ØµÄ²Ù×÷·½·¨£¬·½±ãÔÚÉú²úBeanµÄʱºòÖ±½ÓʹÓ㬱ÈÈçgetBeanClassName

ËüµÄ´ó¸Å½á¹¹ÈçÏÂ(ÕâÀï¾ÙÀýRootBeanDefinition×ÓÀà)£º

ÀïÃæµÄ¸÷ÖÖÊôÐÔÏë±Ø´ó¼ÒÒ²¾ø²»Ä°Éú

ͬÑùµÄ£¬ËüÒ²ÓÐÐí¶àʵÏÖÀࣺ

1¡¢AnnotatedGenericBeanDefinition£º½âÎöÅäÖÃÀàÓë½âÎöImport×¢½â´øÈëµÄÀàʱ£¬¾Í»áʹÓÃËü½øÐзâ×°

2¡¢ScannedGenericBeanDefinition£º·âװͨ¹ý@ComponentScanɨÃè°üËùµÃµ½µÄÀàÐÅÏ¢

3¡¢ConfigurationClassBeanDefinition£º·âװͨ¹ý@Bean×¢½âËùµÃµ½µÄÀàÐÅÏ¢

4¡¢RootBeanDefinition£ºConfigurationClassBeanDefinition¸¸À࣬һ°ãÔÚSpringÄÚ²¿Ê¹Ó㬽«ÆäËûµÄBeanDefitionת»¯³É¸ÃÀà

BeanDefinitionRegistry

¶¨ÒåÁËÓëBeanDefinitonÏà¹ØµÄ²Ù×÷£¬ÈçregisterBeanDefinition£¬getBeanDefinition£¬ÔÚBeanFactoryÖУ¬ÊµÏÖÀà¾ÍÊÇDefaultListableBeanFactory

BeanDefinitionRegistryPostProcessor

²å»°£º½²µ½ÕâÀÓÐûÓз¢ÏÖSpringµÄÃüÃû¼«Æä¹æ·¶£¬SpringÍŶÓÔøÑÔSpringÖеÄÀàÃû¶¼ÊÇ·´¸´ÍÆÇòÅÈ·Èϵģ¬ÕæÊÇÃû¸±Æäʵѽ£¬ËùÒÔ¿´SpringÔ´ÂëÕæµÄÊÇÒ»¼þºÜÊæ·þµÄÊÂÇ飬¿´¿´ÀàÃû·½·¨Ãû¾ÍÄܲ³öËüÃǵŦÄÜÁË¡£

¸Ã½Ó¿ÚÖ»¶¨ÒåÁËÒ»¸ö¹¦ÄÜ£º´¦ÀíBeanDefinitonRegistry£¬Ò²¾ÍÊǽâÎöÅäÖÃÀàÖеÄImport¡¢Component¡¢ComponentScanµÈ×¢½â½øÐÐÏàÓ¦µÄ´¦Àí£¬´¦ÀíÍê±Ïºó½«ÕâЩÀà×¢²á³É¶ÔÓ¦µÄBeanDefinition

ÔÚSpringÄÚ²¿ÖУ¬Ö»ÓÐÒ»¸öʵÏÖ£ºConfigurationClassPostProcessor

BeanFactoryPostProcessor

ËùνBeanFactoryµÄºóÖô¦ÀíÆ÷£¬Ëü¶¨ÒåÁËÔÚ½âÎöÍêÅäÖÃÀàºó¿ÉÒÔµ÷ÓõĴ¦ÀíÂß¼­£¬ÀàËÆÓÚÒ»¸ö²å²Û£¬Èç¹ûÎÒÃÇÏëÔÚÅäÖÃÀà½âÎöÍêºó×öµãʲô£¬¾Í¿ÉÒÔʵÏָýӿڡ£

ÔÚSpringÄÚ²¿ÖУ¬Í¬ÑùÖ»ÓÐConfigurationClassPostProcessorʵÏÖÁËËü£ºÓÃÓÚרÃÅ´¦Àí¼ÓÁËConfiguration×¢½âµÄÀà

ÕâÀï´®³¡Ò»¸öСÎÊÌ⣬ÈçÖªÒÔÏ´úÂ룺

@Configuraiton
public?class?MyConfiguration{
@Bean
public?Car?car(){
return?new?Car(wheel());
}
@Bean
public?Wheel?wheel(){
return?new?Wheel();
}?
}?

ÎÊ£ºWheel¶ÔÏóÔÚSpringÆô¶¯Ê±£¬±»newÁ˼¸´ÎΪʲô

BeanPostProcessor

½­ºþ·­Ò룺BeanµÄºóÖô¦ÀíÆ÷

¸ÃºóÖô¦ÀíÆ÷¹á´©ÁËBeanµÄÉúÃüÖÜÆÚÕû¸ö¹ý³Ì£¬ÔÚBeanµÄ´´½¨¹ý³ÌÖУ¬Ò»¹²±»µ÷ÓÃÁË9´Î£¬ÖÁÓÚÄÄ9´ÎÎÒÃÇÏ´ÎÔÙÀ´Ì½¾¿£¬ÒÔϽéÉÜËüµÄʵÏÖÀàÒÔ¼°×÷ÓÃ

1¡¢AutowiredAnnotationBeanPostProcessor£ºÓÃÓÚÍÆ¶Ï¹¹ÔìÆ÷½øÐÐʵÀý»¯£¬ÒÔ¼°´¦ÀíAutowiredºÍValue×¢½â

2¡¢CommonAnnotationBeanPostProcessor£º´¦ÀíJava¹æ·¶ÖеÄ×¢½â£¬ÈçResource¡¢PostConstruct

3¡¢ApplicationListenerDetector: ÔÚBeanµÄ³õʼ»¯ºóʹÓ㬽«ÊµÏÖÁËApplicationListener½Ó¿ÚµÄbeanÌí¼Óµ½Ê¼þ¼àÌýÆ÷ÁбíÖÐ

4¡¢ApplicationContextAwareProcessor£ºÓÃÓڻص÷ʵÏÖÁËAware½Ó¿ÚµÄBean

5¡¢ImportAwareBeanPostProcessor: ÓÃÓڻص÷ʵÏÖÁËImportAware½Ó¿ÚµÄBean

ApplicationContext

ApplicationContext×÷ΪSpringµÄºËÐÄ£¬ÒÔÃÅÃæÄ£Ê½¸ôÀëÁËBeanFactory£¬ÒÔÄ£°å·½·¨Ä£Ê½¶¨ÒåÁËSpringÆô¶¯Á÷³ÌµÄ¹Ç¼Ü£¬ÓÖÒÔ²ßÂÔģʽµ÷ÓÃÁ˸÷ʽ¸÷ÑùµÄProcessor......ʵÔÚÊÇ´í×Û¸´ÔÓÓÖ¾«Ãî¾øÂ×!

ËüµÄʵÏÖÀàÈçÏ£º

1¡¢ConfigurableApplicationContext£º½Ó¿Ú£¬¶¨ÒåÁËÅäÖÃÓëÉúÃüÖÜÆÚÏà¹Ø²Ù×÷£¬Èçrefresh

2¡¢AbstractApplicationContext: ³éÏóÀ࣬ʵÏÖÁËrefresh·½·¨£¬refresh·½·¨×÷ΪSpringºËÐÄÖеĺËÐÄ,¿ÉÒÔ˵Õû¸öSpring½ÔÔÚrefreshÖ®ÖУ¬ËùÓÐ×ÓÀ඼ͨ¹ýrefresh·½·¨Æô¶¯£¬ÔÚµ÷Óø÷½·¨Ö®ºó£¬½«ÊµÀý»¯ËùÓе¥Àý

3¡¢AnnotationConfigApplicationContext: ÔÚÆô¶¯Ê±Ê¹ÓÃÏà¹ØµÄ×¢½â¶ÁÈ¡Æ÷ÓëɨÃèÆ÷£¬ÍùSpringÈÝÆ÷ÖÐ×¢²áÐèÒªÓõĴ¦ÀíÆ÷£¬¶øºóÔÚrefresh·½·¨ÔÚ±»Ö÷Á÷³Ìµ÷Óü´¿É

4¡¢AnnotationConfigWebApplicationContext£ºÊµÏÖloadBeanDefinitions·½·¨£¬ÒÔÆÚÔÚrefreshÁ÷³ÌÖб»µ÷Ó㬴Ӷø¼ÓÔØBeanDefintion

5¡¢ClassPathXmlApplicationContext: ͬÉÏ

´Ó×ÓÀàµÄÇé¿ö¿ÉÒÔ¿´³ö£¬×ÓÀàµÄ²»Í¬Ö®´¦ÔÚÓÚÈçºÎ¼ÓÔØBeanDefiniton, AnnotationConfigApplicationContextÊÇͨ¹ýÅäÖÃÀà´¦ÀíÆ÷(ConfigurationClassPostProcessor)¼ÓÔØµÄ£¬¶øAnnotationConfigWebApplicationContextÓëClassPathXmlApplicationContextÔòÊÇͨ¹ý×Ô¼ºÊµÏÖloadBeanDefinitions·½·¨£¬ÆäËûÁ÷³ÌÔòÍêȫһÖÂ

SpringµÄÁ÷³Ì

ÒÔÉÏ£¬ÎÒÃÇÒѾ­Çå³þÁËSpringÖеÄÖ÷Òª½ÇÉ«ÒÔ¼°×÷Óã¬ÏÖÔÚÎÒÃdz¢ÊÔ°ÑËüÃÇ×éºÏÆðÀ´£¬¹¹½¨Ò»¸öSpringµÄÆô¶¯Á÷³Ì

ͬÑùÒÔÎÒÃdz£ÓõÄAnnotationConfigApplicationContextΪÀý

ͼÖÐÖ»»­³öÁËSpringÖеIJ¿·Ö´ó¸ÅÁ÷³Ì£¬ÏêϸÄÚÈÝÎÒÃÇ»áÔÚºóÃæµÄÕ½ÚÕ¹¿ª

С½á

ËùνÍòÊ¿ªÍ·ÄÑ£¬±¾ÎijõÖÔ¾ÍÊÇÄÜÈôó¼ÒÒÔÓÉdzÈëÉîµÄ·½Ê½ÈÏʶSpring£¬³õ²½½¨Á¢SpringµÄÈÏÖªÌåϵ£¬Ã÷°×SpringµÄÄÚ²¿¼Ü¹¹£¬¶ÔSpringµÄÈÏÖª²»ÔÙ¸¡ÓÚ±íÃæ¡£

ÏÖÔÚÍ·ÒѾ­¿ªÁË£¬ÏàÐźóÃæÄÚÈݵÄѧϰҲ½«Ë®µ½ÇþÀ´¡£

±¾ÆªÎÄÕ¼Ƚ²ÊÇSpringµÄ¼Ü¹¹Éè¼Æ£¬Ò²Ï£ÍûÄܳÉΪÎÒÃÇÒÔºó¸´Ï°SpringÕûÌåÄÚÈÝʱʹÓõÄÊֲᡣ

×îºó£¬¿´ÍêÎÄÕÂÖ®ºó£¬ÏàÐŶÔÒÔÏÂÃæÊÔ³£ÎʵÄÎÊÌâ»Ø´ðÆðÀ´Ò²ÊÇÇá¶øÒ×¾Ù

1¡¢Ê²Ã´ÊÇBeanDefinition

2¡¢BeanFactoryÓëApplicationContextµÄ¹ØÏµ

3¡¢ºóÖô¦ÀíÆ÷µÄ·ÖÀàÓë×÷ÓÃ

4¡¢SpringµÄÖ÷ÒªÁ÷³ÌÊÇÔõôÑùµÄ

 

   
1486 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]
 
×îÐÂÎÄÕÂ
¼Ü¹¹Éè¼Æ-̸̸¼Ü¹¹
ʵÏÖSaaS£¨Èí¼þ¼°·þÎñ£©¼Ü¹¹Èý´ó¼¼ÊõÌôÕ½
µ½µ×ʲôÊÇÊý¾ÝÖÐ̨£¿
ÏìӦʽ¼Ü¹¹¼ò½é
ÒµÎñ¼Ü¹¹¡¢Ó¦Óüܹ¹ÓëÔÆ»ù´¡¼Ü¹¹
×îпγÌ
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
´Ó´óÐ͵çÉ̼ܹ¹Ñݽø¿´»¥ÁªÍø¸ß¿ÉÓüܹ¹Éè¼Æ
´óÐÍ»¥ÁªÍø¸ß¿ÉÓüܹ¹Éè¼ÆÊµ¼ù
ÆóÒµ¼Ü¹¹Ê¦ (TOGAF¹Ù·½ÈÏÖ¤)
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
³É¹¦°¸Àý
ijÐÂÄÜÔ´µçÁ¦ÆóÒµ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
Öк½¹¤ÒµÄ³Ñо¿Ëù ǶÈëʽÈí¼þ¿ª·¢Ö¸ÄÏ
ij¹ìµÀ½»Í¨ÐÐÒµ ǶÈëʽÈí¼þ¸ß¼¶Éè¼ÆÊµ¼ù
±±¾© º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Èí¼þ²âÊԼܹ¹Ê¦
±±¾©Ä³ÁìÏÈÊý×ÖµØÍ¼ ¼Ü¹¹Ê¦£¨Éè¼Æ°¸Àý£©