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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
IoCÈÝÆ÷ºÍDependency Injectionģʽ
 
×÷ÕߣºMartin Fowler À´Ô´£ºÀ´×ÔÍøÂç ·¢²¼ÓÚ 2017-3-16
  1610  次浏览      29
 

ÕªÒª£ºJavaÉçȺ½üÀ´ÏÆÆðÁËÒ»ÕóÇáÁ¿¼¶ÈÝÆ÷µÄÈȳ±£¬ÕâЩÈÝÆ÷Äܹ»°ïÖú¿ª·¢Õß½«À´×Ô²»Í¬ÏîÄ¿µÄ×é¼þ×é×°³ÉΪһ¸öÄÚ¾ÛµÄÓ¦ÓóÌÐò¡£ÔÚËüÃǵı³ºóÓÐ×Åͬһ¸öģʽ£¬Õâ¸öģʽ¾ö¶¨ÁËÕâЩÈÝÆ÷½øÐÐ×é¼þ×°ÅäµÄ·½Ê½¡£ÈËÃÇÓÃÒ»¸ö´ó¶ø»¯Ö®µÄÃû×ÖÀ´³ÆºôÕâ¸öģʽ£º¡±¿ØÖÆ·´×ª¡±£¨Inversion ofControl£¬IoC£©¡£ÔÚ±¾ÎÄÖУ¬ÎÒ½«ÉîÈë̽Ë÷Õâ¸öģʽµÄ¹¤×÷Ô­Àí£¬¸øËüÒ»¸ö¸üÄÜÃèÊöÆäÌØµãµÄÃû×Ö¡ª¡ª¡±ÒÀÀµ×¢È롱£¨Dependency Injection£©£¬²¢½«ÆäÓ롱·þÎñ¶¨Î»Æ÷¡±£¨Service Locator£©Ä£Ê½×÷Ò»¸ö±È½Ï¡£²»¹ý£¬ÕâÁ½ÕßÖ®¼äµÄ²îÒì²¢²»Ì«ÖØÒª£¬¸üÖØÒªµÄÊÇ£ºÓ¦¸Ã½«×é¼þµÄÅäÖÃÓëʹÓ÷ÖÀ뿪¡ª¡ªÁ½¸öģʽµÄÄ¿±ê¶¼ÊÇÕâ¸ö¡£

ÔÚÆóÒµ¼¶JavaµÄÊÀ½çÀï´æÔÚÒ»¸öÓÐȤµÄÏÖÏó£ºÓкܶàÈËͶÈëºÜ¶à¾«Á¦À´Ñо¿Ö÷Á÷J2EE ¼¼ÊõµÄÌæ´úÆ·¡ª¡ª×ÔÈ»£¬Õâ´ó¶à·¢ÉúÔÚopen sourceÉçȺ¡£Ôںܴó³Ì¶ÈÉÏ£¬Õâ¿ÉÒÔ¿´×÷ÊÇ¿ª·¢Õß¶ÔÖ÷Á÷J2EE¼¼ÊõµÄ±¿Öغ͸´ÔÓ×÷³öµÄ»ØÓ¦£¬µ«ÆäÖеÄÈ·Óкܶ༫¸»´´ÒâµÄÏë·¨£¬µÄÈ·ÌṩÁËһЩ¿É¹©Ñ¡ÔñµÄ·½°¸¡£J2EE¿ª·¢Õß³£Óöµ½µÄÒ»¸öÎÊÌâ¾ÍÊÇÈçºÎ×é×°²»Í¬µÄ³ÌÐòÔªËØ£ºÈç¹ûweb¿ØÖÆÆ÷Ìåϵ½á¹¹ºÍÊý¾Ý¿â½Ó¿ÚÊÇÓɲ»Í¬µÄÍŶÓËù¿ª·¢µÄ£¬±Ë´Ë¼¸ºõÒ»ÎÞËùÖª£¬ÄãÓ¦¸ÃÈçºÎÈÃËüÃÇÅäºÏ¹¤×÷£¿ºÜ¶à¿ò¼Ü³¢ÊÔ¹ý½â¾öÕâ¸öÎÊÌ⣬Óм¸¸ö¿ò¼ÜË÷ÐÔ³¯Õâ¸ö·½Ïò·¢Õ¹£¬ÌṩÁ˸üͨÓõġ±×é×°¸÷²ã×é¼þ¡±µÄ·½°¸¡£ÕâÑùµÄ¿ò¼Üͨ³£±»³ÆÎª¡±ÇáÁ¿¼¶ÈÝÆ÷¡±£¬PicoContainerºÍSpring¶¼ÔÚ´ËÁÐÖС£

ÔÚÕâЩÈÝÆ÷±³ºó£¬Ò»Ð©ÓÐȤµÄÉè¼ÆÔ­Ôò·¢»Ó×Å×÷Óá£ÕâЩԭÔòÒѾ­³¬Ô½ÁËÌØ¶¨ÈÝÆ÷µÄ·¶³ë£¬ÉõÖÁÒѾ­³¬Ô½ÁËJavaƽ̨µÄ·¶³ë¡£ÔÚ±¾ÎÄÖУ¬ÎÒ¾ÍÒª³õ²½½ÒʾÕâЩԭÔò¡£ÎÒʹÓõķ¶ÀýÊÇJava´úÂ룬µ«ÕýÈçÎҵĴó¶àÊýÎÄÕÂÒ»Ñù£¬ÕâЩԭÔòҲͬÑùÊÊÓÃÓÚ±ðµÄOO»·¾³£¬ÌرðÊÇ.NET¡£

×é¼þºÍ·þÎñ

×°Åä³ÌÐòÔªËØ£¬ÕâÑùµÄ»°ÌâÁ¢¼´½«ÎÒÍϽøÁËÒ»¸ö¼¬ÊÖµÄÊõÓïÎÊÌ⣺ÈçºÎÇø·Ö¡±·þÎñ¡±£¨service£©ºÍ¡±×é¼þ¡±£¨component£©£¿Äã¿ÉÒÔºÁ²»·ÑÁ¦µØÕÒ³ö¹ØÓÚÕâÁ½¸ö´Ê¶¨ÒåµÄ³¤Æª´óÂÛ£¬¸÷Öֱ˴Ëì¶ÜµÄ¶¨Òå»áÈÃÄã¸ÐÊܵ½ÎÒËù´¦µÄ¾½¾³¡£ÓмøÓÚ´Ë£¬¶ÔÓÚÕâÁ½¸öÔâµ½ÁËÑÏÖØÀÄÓõĴʻ㣬ÎÒ½«Ê×ÏÈ˵Ã÷ËüÃÇÔÚ±¾ÎÄÖеÄÓ÷¨¡£

Ëùν¡±×é¼þ¡±ÊÇÖ¸ÕâÑùÒ»¸öÈí¼þµ¥Ôª£ºËü½«±»×÷ÕßÎÞ·¨¿ØÖÆµÄÆäËûÓ¦ÓóÌÐòʹÓ㬵«ºóÕß²»ÄܶÔ×é¼þ½øÐÐÐ޸ġ£Ò²¾ÍÊÇ˵£¬Ê¹ÓÃÒ»¸ö×é¼þµÄÓ¦ÓóÌÐò²»ÄÜÐÞ¸Ä×é¼þµÄÔ´´úÂ룬µ«¿ÉÒÔͨ¹ý×÷ÕßÔ¤ÁôµÄijÖÖ;¾¶¶ÔÆä½øÐÐÀ©Õ¹£¬ÒԸıä×é¼þµÄÐÐΪ¡£

·þÎñºÍ×é¼þÓÐijÖÖÏàËÆÖ®´¦£ºËüÃǶ¼½«±»ÍⲿµÄÓ¦ÓóÌÐòʹÓá£ÔÚÎÒ¿´À´£¬Á½ÕßÖ®¼ä×î´óµÄ²îÒìÔÚÓÚ£º×é¼þÊÇÔÚ±¾µØÊ¹Óõģ¨ÀýÈçJARÎļþ¡¢³ÌÐò¼¯¡¢DLL¡¢»òÕßÔ´Âëµ¼È룩£»¶ø·þÎñÊÇҪͨ¹ýͬ²½»òÒì²½µÄÔ¶³Ì½Ó¿ÚÀ´Ô¶³ÌʹÓõģ¨ÀýÈçweb service¡¢ÏûϢϵͳ¡¢RPC£¬»òÕßsocket£©¡£

ÔÚ±¾ÎÄÖУ¬ÎÒ½«Ö÷ҪʹÓá±·þÎñ¡±Õâ¸ö´Ê£¬µ«ÎÄÖеĴó¶àÊýÂß¼­Ò²Í¬ÑùÊÊÓÃÓÚ±¾µØ×é¼þ¡£Êµ¼ÊÉÏ£¬ÎªÁË·½±ãµØ·ÃÎÊÔ¶³Ì·þÎñ£¬ÄãÍùÍùÐèҪijÖÖ±¾µØ×é¼þ¿ò¼Ü¡£²»¹ý£¬¡±×é¼þ»òÕß·þÎñ¡±ÕâÑùÒ»¸ö´Ê×éʵÔÚÌ«Âé·³ÁË£¬¶øÇÒ¡±·þÎñ¡±Õâ¸ö´Êµ±ÏÂÒ²ºÜÁ÷ÐУ¬ËùÒÔ±¾ÎĽ«Óá±·þÎñ¡±Ö¸´úÕâÁ½Õß¡£

Ò»¸ö¼òµ¥µÄÀý×Ó

ΪÁ˸üºÃµØËµÃ÷ÎÊÌ⣬ÎÒÒªÒýÈëÒ»¸öÀý×Ó¡£ºÍÎÒÒÔǰÓõÄËùÓÐÀý×ÓÒ»Ñù£¬ÕâÊÇÒ»¸ö³¬¼¶¼òµ¥µÄÀý×Ó£ºËü·Ç³£Ð¡£¬Ð¡µÃÓе㲻¹»ÕæÊµ£¬µ«×ãÒÔ°ïÖúÄã¿´ÇåÆäÖеĵÀÀí£¬¶ø²»ÖÁÓÚÏÝÈëÕæÊµÀý×ÓµÄÄà̶ÖÐÎÞ·¨×԰Ρ£

ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒ±àдÁËÒ»¸ö×é¼þ£¬ÓÃÓÚÌṩһ·ÝµçÓ°Çåµ¥£¬Çåµ¥ÉÏÁгöµÄӰƬ¶¼ÊÇÓÉÒ»Î»ÌØ¶¨µÄµ¼ÑÝÖ´µ¼µÄ¡£ÊµÏÖÕâ¸öΰ´óµÄ¹¦ÄÜÖ»ÐèÒªÒ»¸ö·½·¨

class MovieLister...

public Movie[] moviesDirectedBy(String arg)
{
List allMovies = finder.findAll();
for (Iterator it = allMovies.iterator(); it.hasNext();)
{
Movie movie = (Movie) it.next();
if (!movie.getDirector().equals(arg))
{
it.remove();
}

}
return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);
}

Äã¿ÉÒÔ¿´µ½£¬Õâ¸ö¹¦ÄܵÄʵÏÖ¼«Æä¼òµ¥£ºmoviesDirectedBy·½·¨Ê×ÏÈÇëÇófinder£¨Ó°Æ¬ËÑѰÕߣ©¶ÔÏó£¨ÎÒÃÇÉÔºó»á̸µ½Õâ¸ö¶ÔÏ󣩷µ»ØºóÕßËùÖªµÀµÄËùÓÐӰƬ£¬È»ºó±éÀúfinder¶ÔÏ󷵻صÄÇåµ¥£¬²¢·µ»ØÆäÖÐÓÉÌØ¶¨µÄij¸öµ¼ÑÝÖ´µ¼µÄӰƬ¡£·Ç³£¼òµ¥£¬²»¹ý²»±Øµ£ÐÄ£¬ÕâÖ»ÊÇÕû¸öÀý×ӵĽÅÊּܰÕÁË¡£ÎÒÃÇÕæÕýÏëÒª¿¼²ìµÄÊÇfinder¶ÔÏ󣬻òÕß˵£¬ÈçºÎ½«MovieLister¶ÔÏóÓëÌØ¶¨µÄfinder¶ÔÏóÁ¬½ÓÆðÀ´¡£ÎªÊ²Ã´ÎÒÃǶÔÕâ¸öÎÊÌâÌØ±ð¸ÐÐËȤ£¿ÒòΪÎÒÏ£ÍûÉÏÃæÕâ¸öƯÁÁµÄmoviesDirectedBy·½·¨ÍêÈ«²»ÒÀÀµÓÚӰƬµÄʵ¼Ê´æ´¢·½Ê½¡£ËùÒÔ£¬Õâ¸ö·½·¨Ö»ÄÜÒýÓÃÒ»¸öfinder¶ÔÏ󣬶øfinder¶ÔÏóÔò±ØÐëÖªµÀÈçºÎ¶ÔfindAll ·½·¨×÷³ö»ØÓ¦¡£ÎªÁ˰ïÖú¶ÁÕ߸üÇå³þµØÀí½â£¬ÎÒ¸øfinder¶¨ÒåÁËÒ»¸ö½Ó¿Ú£º

public interface MovieFinder
{
List findAll();
}

ÏÖÔÚ£¬Á½¸ö¶ÔÏóÖ®¼äûÓÐʲôñîºÏ¹ØÏµ¡£µ«ÊÇ£¬µ±ÎÒҪʵ¼ÊѰÕÒӰƬʱ£¬¾Í±ØÐëÉæ¼°µ½MovieFinderµÄij¸ö¾ßÌå×ÓÀà¡£ÔÚÕâÀÎÒ°ÑÉæ¼°¾ßÌå×ÓÀàµÄ´úÂë·ÅÔÚMovieListerÀàµÄ¹¹Ô캯ÊýÖС£

class MovieLister...
private MovieFinder finder;
public MovieLister()
{
finder = new ColonDelimitedMovieFinder("movies1.txt");
}

Õâ¸öʵÏÖÀàµÄÃû×Ö¾Í˵Ã÷£ºÎÒ½«Òª´ÓÒ»¸ö¶ººÅ·Ö¸ôµÄÎı¾ÎļþÖлñµÃӰƬÁÐ±í¡£Äã²»±Ø²ÙÐľßÌåµÄʵÏÖϸ½Ú£¬Ö»ÒªÉèÏëÕâÑùÒ»¸öʵÏÖÀà¾Í¿ÉÒÔÁË¡£Èç¹ûÕâ¸öÀàÖ»ÓÉÎÒ×Ô¼ºÊ¹Óã¬Ò»Çж¼Ã»ÎÊÌâ¡£µ«ÊÇ£¬Èç¹ûÎÒµÄÅóÓÑ̾·þÓÚÕâ¸ö¾«²ÊµÄ¹¦ÄÜ£¬Ò²ÏëʹÓÃÎҵijÌÐò£¬ÄÇÓÖ»áÔõôÑùÄØ£¿Èç¹ûËûÃÇÒ²°ÑӰƬÇåµ¥±£´æÔÚÒ»¸ö¶ººÅ·Ö¸ôµÄÎı¾ÎļþÖУ¬²¢ÇÒÒ²°ÑÕâ¸öÎļþÃüÃûΪ¡± movie1.txt ¡°£¬ÄÇôһÇл¹ÊÇûÎÊÌâ¡£Èç¹ûËûÃÇÖ»ÊǸøÕâ¸öÎļþ¸Ä¸ÄÃû£¬ÎÒÒ²¿ÉÒÔ´ÓÒ»¸öÅäÖÃÎļþ»ñµÃÎļþÃû£¬ÕâÒ²ºÜÈÝÒס£µ«ÊÇ£¬Èç¹ûËûÃÇÓÃÍêÈ«²»Í¬µÄ·½Ê½¡ª¡ªÀýÈçSQL Êý¾Ý¿â¡¢XML Îļþ¡¢web service£¬»òÕßÁíÒ»ÖÖ¸ñʽµÄÎı¾Îļþ¡ª¡ªÀ´´æ´¢Ó°Æ¬Ç嵥Ĩ£¿ÔÚÕâÖÖÇé¿öÏ£¬ÎÒÃÇÐèÒªÓÃÁíÒ»¸öÀàÀ´»ñÈ¡Êý¾Ý¡£ÓÉÓÚÒѾ­¶¨ÒåÁËMovieFinder½Ó¿Ú£¬ÎÒ¿ÉÒÔ²»ÓÃÐÞ¸ÄmoviesDirectedBy·½·¨¡£µ«ÊÇ£¬ÎÒÈÔÈ»ÐèҪͨ¹ýijÖÖ;¾¶»ñµÃºÏÊʵÄMovieFinderʵÏÖÀàµÄʵÀý¡£

ͼ1Õ¹ÏÖÁËÕâÖÖÇé¿öϵÄÒÀÀµ¹ØÏµ£ºMovieListerÀà¼ÈÒÀÀµÓÚMovieFinder½Ó¿Ú£¬Ò²ÒÀÀµÓÚ¾ßÌåµÄʵÏÖÀà¡£ÎÒÃǵ±È»Ï£ÍûMovieListerÀàÖ»ÒÀÀµÓÚ½Ó¿Ú£¬µ«ÎÒÃÇÒªÈçºÎ»ñµÃÒ»¸öMovieFinder×ÓÀàµÄʵÀýÄØ£¿

ÔÚPatterns of Enterprise Application ArchitectureÒ»ÊéÖУ¬ÎÒÃǰÑÕâÖÖÇé¿ö³ÆÎª²å¼þ£¨plugin£©£ºMovieFinderµÄʵÏÖÀ಻ÊÇÔÚ±àÒëÆÚÁ¬Èë³ÌÐòÖ®Öеģ¬ÒòΪÎÒ²¢²»ÖªµÀÎÒµÄÅóÓÑ»áʹÓÃÄĸöʵÏÖÀà¡£ÎÒÃÇÏ£ÍûMovieListerÀàÄܹ»ÓëMovieFinderµÄÈκÎʵÏÖÀàÅäºÏ¹¤×÷£¬²¢ÇÒÔÊÐíÔÚÔËÐÐÆÚ²åÈë¾ßÌåµÄʵÏÖÀ࣬²åÈ붯×÷ÍêÈ«ÍÑÀëÎÒ£¨Ô­×÷Õߣ©µÄ¿ØÖÆ¡£ÕâÀïµÄÎÊÌâ¾ÍÊÇ£ºÈçºÎÉè¼ÆÕâ¸öÁ¬½Ó¹ý³Ì£¬Ê¹MovieListerÀàÔÚ²»ÖªµÀʵÏÖÀàϸ½ÚµÄǰÌáÏÂÓëÆäʵÀýЭͬ¹¤×÷¡£

½«Õâ¸öÀý×ÓÍÆ¶ø¹ãÖ®£¬ÔÚÒ»¸öÕæÊµµÄϵͳÖУ¬ÎÒÃÇ¿ÉÄÜÓÐÊýÊ®¸ö·þÎñºÍ×é¼þ¡£ÔÚÈκÎʱºò£¬ÎÒÃÇ×Ü¿ÉÒÔ¶ÔʹÓÃ×é¼þµÄÇéÐμÓÒÔ³éÏó£¬Í¨¹ý½Ó¿ÚÓë¾ßÌåµÄ×é¼þ½»Á÷£¨Èç¹û×é¼þ²¢Ã»ÓÐÉè¼ÆÒ»¸ö½Ó¿Ú£¬Ò²¿ÉÒÔͨ¹ýÊÊÅäÆ÷ÓëÖ®½»Á÷£©¡£µ«ÊÇ£¬Èç¹ûÎÒÃÇÏ£ÍûÒÔ²»Í¬µÄ·½Ê½²¿ÊðÕâ¸öϵͳ£¬¾ÍÐèÒªÓòå¼þ»úÖÆÀ´´¦Àí·þÎñÖ®¼äµÄ½»»¥¹ý³Ì£¬ÕâÑùÎÒÃDzſÉÄÜÔÚ²»Í¬µÄ²¿Êð·½°¸ÖÐʹÓò»Í¬µÄʵÏÖ¡£ËùÒÔ£¬ÏÖÔڵĺËÐÄÎÊÌâ¾ÍÊÇ£ºÈçºÎ½«ÕâЩ²å¼þ×éºÏ³ÉÒ»¸öÓ¦ÓóÌÐò£¿ÕâÕýÊÇÐÂÉúµÄÇáÁ¿¼¶ÈÝÆ÷ËùÃæÁÙµÄÖ÷ÒªÎÊÌ⣬¶øËüÃǽâ¾öÕâ¸öÎÊÌâµÄÊÖ¶ÎÎÞÒ»ÀýÍâµØÊÇ¿ØÖÆ·´×ª£¨Inversion of Control£©Ä£Ê½¡£

¿ØÖÆ·´×ª

¼¸Î»ÇáÁ¿¼¶ÈÝÆ÷µÄ×÷ÕßÔø½¾°ÁµØ¶ÔÎÒ˵£ºÕâЩÈÝÆ÷·Ç³£ÓÐÓã¬ÒòΪËüÃÇʵÏÖÁË¿ØÖÆ·´×ª¡£ÕâÑùµÄ˵´ÇÈÃÎÒÉî¸ÐÃԻ󣺿ØÖÆ·´×ªÊÇ¿ò¼ÜËù¹²ÓеÄÌØÕ÷£¬Èç¹û½ö½öÒòΪʹÓÃÁË¿ØÖÆ·´×ª¾ÍÈÏΪÕâЩÇáÁ¿¼¶ÈÝÆ÷ÓëÖÚ²»Í¬£¬¾ÍºÃÏóÔÚ˵ÎҵĽγµÊÇÓëÖÚ²»Í¬µÄ£¬ÒòΪËüÓÐËĸöÂÖ×Ó¡£

ÎÊÌâµÄ¹Ø¼üÔÚÓÚ£ºËüÃÇ·´×ªÁËÄÄ·½ÃæµÄ¿ØÖÆ£¿ÎÒµÚÒ»´Î½Ó´¥µ½µÄ¿ØÖÆ·´×ªÕë¶ÔµÄÊÇÓû§½çÃæµÄÖ÷¿ØÈ¨¡£ÔçÆÚµÄÓû§½çÃæÊÇÍêÈ«ÓÉÓ¦ÓóÌÐòÀ´¿ØÖƵģ¬ÄãÔ¤ÏÈÉè¼ÆÒ»ÏµÁÐÃüÁÀýÈçÊäÈëÐÕÃû¡¢ÊäÈëµØÖ·µÈ£¬Ó¦ÓóÌÐòÖðÌõÊä³öÌáʾÐÅÏ¢£¬²¢È¡»ØÓû§µÄÏìÓ¦¡£¶øÔÚͼÐÎÓû§½çÃæ»·¾³Ï£¬UI¿ò¼Ü½«¸ºÔðÖ´ÐÐÒ»¸öÖ÷Ñ­»·£¬ÄãµÄÓ¦ÓóÌÐòÖ»ÐèΪÆÁÄ»µÄ¸÷¸öÇøÓòÌṩʼþ´¦Àíº¯Êý¼´¿É¡£ÔÚÕâÀ³ÌÐòµÄÖ÷¿ØÈ¨·¢ÉúÁË·´×ª£º´ÓÓ¦ÓóÌÐòÒÆµ½ÁË¿ò¼Ü¡£¶ÔÓÚÕâЩÐÂÉúµÄÈÝÆ÷£¬ËüÃÇ·´×ªµÄÊÇÈçºÎ¶¨Î»²å¼þµÄ¾ßÌåʵÏÖ¡£ÔÚÇ°ÃæÄǸö¼òµ¥µÄÀý×ÓÖУ¬MovieListerÀฺÔð¶¨Î»MovieFinderµÄ¾ßÌåʵÏÖ¡ª¡ªËüÖ±½ÓʵÀý»¯ºóÕßµÄÒ»¸ö×ÓÀà¡£ÕâÑùÒ»À´£¬MovieFinderÒ²¾Í²»³ÉÆäΪһ¸ö²å¼þÁË£¬ÒòΪËü²¢²»ÊÇÔÚÔËÐÐÆÚ²åÈëÓ¦ÓóÌÐòÖеġ£¶øÕâЩÇáÁ¿¼¶ÈÝÆ÷ÔòʹÓÃÁ˸üΪÁé»îµÄ°ì·¨£¬Ö»Òª²å¼þ×ñÑ­Ò»¶¨µÄ¹æÔò£¬Ò»¸ö¶ÀÁ¢µÄ×é×°Ä£¿é¾ÍÄܹ»½«²å¼þµÄ¾ßÌåʵÏÖ×¢Éäµ½Ó¦ÓóÌÐòÖС£Òò´Ë£¬ÎÒÏëÎÒÃÇÐèÒª¸øÕâ¸öģʽÆðÒ»¸ö¸üÄÜ˵Ã÷ÆäÌØµãµÄÃû×Ö¡ª¡ª¡±¿ØÖÆ·´×ª¡±Õâ¸öÃû×ÖÌ«·ºÁË£¬³£³£ÈÃÈËÓÐЩÃÔ»ó¡£Óë¶àλIoC °®ºÃÕßÌÖÂÛÖ®ºó£¬ÎÒÃǾö¶¨½«Õâ¸öģʽ½Ð×ö¡±ÒÀÀµ×¢È롱£¨Dependency Injection£©¡£

ÏÂÃæ£¬ÎÒ½«¿ªÊ¼½éÉÜDependency InjectionģʽµÄ¼¸ÖÖ²»Í¬ÐÎʽ¡£²»¹ý£¬ÔÚ´Ë֮ǰ£¬ÎÒÒªÊ×ÏÈÖ¸³ö£ºÒªÏû³ýÓ¦ÓóÌÐò¶Ô²å¼þʵÏÖµÄÒÀÀµ£¬ÒÀÀµ×¢Èë²¢²»ÊÇΨһµÄÑ¡Ôñ£¬ÄãÒ²¿ÉÒÔÓÃServiceLocatorģʽ»ñµÃͬÑùµÄЧ¹û¡£½éÉÜÍêDependency Injectionģʽ֮ºó£¬ÎÒÒ²»á̸µ½ServiceLocator ģʽ¡£

ÒÀÀµ×¢ÈëµÄ¼¸ÖÖÐÎʽ

Dependency InjectionģʽµÄ»ù±¾Ë¼ÏëÊÇ£ºÓÃÒ»¸öµ¥¶ÀµÄ¶ÔÏó£¨×°ÅäÆ÷£©À´»ñµÃMovieFinderµÄÒ»¸öºÏÊʵÄʵÏÖ£¬²¢½«ÆäʵÀý¸³¸øMovieListerÀàµÄÒ»¸ö×ֶΡ£ÕâÑùÒ»À´£¬ÎÒÃǾ͵õ½ÁËͼ2ËùʾµÄÒÀÀµÍ¼£º

ͼ2£ºÒýÈëÒÀÀµ×¢ÈëÆ÷Ö®ºóµÄÒÀÀµ¹ØÏµ

ÒÀÀµ×¢ÈëµÄÐÎʽÖ÷ÒªÓÐÈýÖÖ£¬ÎÒ·Ö±ð½«ËüÃǽÐ×ö¹¹Ô캯Êý×¢È루Constructor Injection£©¡¢ÉèÖµ·½·¨×¢È루Setter Injection£©ºÍ½Ó¿Ú×¢È루Interface Injection£©¡£Èç¹û¶Á¹ý×î½ü¹ØÓÚIoCµÄһЩÌÖÂÛ²ÄÁÏ£¬Äã²»ÄÑ¿´³ö£ºÕâÈýÖÖ×¢ÈëÐÎʽ·Ö±ð¾ÍÊÇtype 1 IoC£¨½Ó¿Ú×¢È룩¡¢type 2 IoC£¨ÉèÖµ·½·¨×¢È룩ºÍtype 3 IoC£¨¹¹Ô캯Êý×¢È룩¡£ÎÒ·¢ÏÖÊý×Ö±àºÅÍùÍù±È½ÏÄѼǣ¬ËùÒÔÎÒʹÓÃÁËÕâÀïµÄÃüÃû·½Ê½¡£

ʹÓÃPicoContainer ½øÐй¹Ô캯Êý×¢Èë

Ê×ÏÈ£¬ÎÒÒªÏò¶ÁÕßչʾÈçºÎÓÃÒ»¸öÃûΪPicoContainerµÄÇáÁ¿¼¶ÈÝÆ÷Íê³ÉÒÀÀµ×¢Èë¡£Ö®ËùÒÔ´ÓÕâÀ↑ʼ£¬Ö÷ÒªÊÇÒòΪÎÒÔÚThoughtWorks¹«Ë¾µÄ¼¸¸öͬÊÂÔÚPicoContainerµÄ¿ª·¢ÉçȺÖзdz£»îÔ¾¡ª¡ªÃ»´í£¬Ò²¿ÉÒÔ˵ÊÇijÖÖÆ«Ì»°É¡£

PicoContainerͨ¹ý¹¹Ô캯ÊýÀ´ÅжÏÈçºÎ½«MovieFinderʵÀý×¢ÈëMovieLister Àà¡£Òò´Ë£¬MovieListerÀà±ØÐëÉùÃ÷Ò»¸ö¹¹Ô캯Êý£¬²¢ÔÚÆäÖаüº¬ËùÓÐÐèҪעÈëµÄÔªËØ£º

class MovieLister...
public MovieLister(MovieFinder finder)
{
this.finder = finder;
}

MovieFinderʵÀý±¾ÉíÒ²½«ÓÉPicoContainerÀ´¹ÜÀí£¬Òò´ËÎı¾ÎļþµÄÃû×ÖÒ²¿ÉÒÔÓÉÈÝÆ÷×¢È룺

class ColonMovieFinder...
public ColonMovieFinder(String filename)
{
this.filename = filename;
}

Ëæºó£¬ÐèÒª¸æËßPicoContainer£º¸÷¸ö½Ó¿Ú·Ö±ðÓëÄĸöʵÏÖÀà¹ØÁª¡¢½«Äĸö×Ö·û´®×¢ÈëMovieFinder×é¼þ¡£

    private MutablePicoContainer configureContainer()
{
MutablePicoContainer pico = new DefaultPicoContainer();
Parameter[] finderParams = {newConstantParameter("movies1.txt")};
pico.registerComponentImplementation(MovieFinder.class,ColonMovieFinder.class, finderParams);
pico.registerComponentImplementation(MovieLister.class);
return pico;
}

Õâ¶ÎÅäÖôúÂëͨ³£Î»ÓÚÁíÒ»¸öÀà¡£¶ÔÓÚÎÒÃÇÕâ¸öÀý×Ó£¬Ê¹ÓÃÎÒµÄMovieLister ÀàµÄÅóÓÑÐèÒªÔÚ×Ô¼ºµÄÉèÖÃÀàÖбàдºÏÊʵÄÅäÖôúÂë¡£µ±È»£¬»¹¿ÉÒÔ½«ÕâЩÅäÖÃÐÅÏ¢·ÅÔÚÒ»¸öµ¥¶ÀµÄÅäÖÃÎļþÖУ¬ÕâÒ²ÊÇÒ»ÖÖ³£¼ûµÄ×ö·¨¡£Äã¿ÉÒÔ±àдһ¸öÀàÀ´¶ÁÈ¡ÅäÖÃÎļþ£¬È»ºó¶ÔÈÝÆ÷½øÐкÏÊʵÄÉèÖ᣾¡¹ÜPicoContainer±¾Éí²¢²»°üº¬ÕâÏÄÜ£¬µ«ÁíÒ»¸öÓëËü¹ØÏµ½ôÃܵÄÏîÄ¿NanoContainerÌṩÁËһЩ°ü×°£¬ÔÊÐí¿ª·¢ÕßʹÓÃXMLÅäÖÃÎļþ±£´æÅäÖÃÐÅÏ¢¡£NanoContainerÄܹ»½âÎöXMLÎļþ£¬²¢¶Ôµ×ϵÄPicoContainer½øÐÐÅäÖá£Õâ¸öÏîÄ¿µÄÕÜѧ¹ÛÄî¾ÍÊÇ£º½«ÅäÖÃÎļþµÄ¸ñʽÓëµ×ϵÄÅäÖûúÖÆ·ÖÀ뿪¡£

ʹÓÃÕâ¸öÈÝÆ÷£¬Äãд³öµÄ´úÂë´ó¸Å»áÊÇÕâÑù£º

   public void testWithPico()
{
MutablePicoContainer pico = configureContainer();
MovieLister lister = (MovieLister)pico.getComponentInstance(MovieLister.class);
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West",movies[0].getTitle());
}

¾¡¹ÜÔÚÕâÀïÎÒʹÓÃÁ˹¹Ô캯Êý×¢È룬ʵ¼ÊÉÏPicoContainerÒ²Ö§³ÖÉèÖµ·½·¨×¢È룬²»¹ý¸ÃÏîÄ¿µÄ¿ª·¢Õ߸üÍÆ¼öʹÓù¹Ô캯Êý×¢Èë¡£

ʹÓÃSpring ½øÐÐÉèÖµ·½·¨×¢Èë

Spring ¿ò¼ÜÊÇÒ»¸öÓÃ;¹ã·ºµÄÆóÒµ¼¶Java ¿ª·¢¿ò¼Ü£¬ÆäÖаüÀ¨ÁËÕë¶ÔÊÂÎñ¡¢³Ö¾Ã»¯¿ò¼Ü¡¢webÓ¦Óÿª·¢ºÍJDBCµÈ³£Óù¦ÄܵijéÏ󡣺ÍPicoContainerÒ»Ñù£¬ËüҲͬʱ֧³Ö¹¹Ô캯Êý×¢ÈëºÍÉèÖµ·½·¨×¢È룬µ«¸ÃÏîÄ¿µÄ¿ª·¢Õ߸üÍÆ¼öʹÓÃÉèÖµ·½·¨×¢È롪¡ªÇ¡ºÃÊʺÏÕâ¸öÀý×Ó¡£ÎªÁËÈÃMovieListerÀà½ÓÊÜ×¢È룬ÎÒÐèҪΪËü¶¨ÒåÒ»¸öÉèÖµ·½·¨£¬¸Ã·½·¨½ÓÊÜÀàÐÍΪMovieFinderµÄ²ÎÊý£º

class MovieLister...
private MovieFinder finder;
public void setFinder(MovieFinder finder)
{
this.finder = finder;
}

ÀàËÆµØ£¬ÔÚMovieFinderµÄʵÏÖÀàÖУ¬ÎÒÒ²¶¨ÒåÁËÒ»¸öÉèÖµ·½·¨£¬½ÓÊÜÀàÐÍΪString µÄ²ÎÊý£º

class ColonMovieFinder...
public void setFilename(String filename)
{
this.filename = filename;
}

µÚÈý²½ÊÇÉ趨ÅäÖÃÎļþ¡£Spring Ö§³Ö¶àÖÖÅäÖ÷½Ê½£¬Äã¿ÉÒÔͨ¹ýXML Îļþ½øÐÐÅäÖã¬Ò²¿ÉÒÔÖ±½ÓÔÚ´úÂëÖÐÅäÖᣲ»¹ý£¬XML ÎļþÊDZȽÏÀíÏëµÄÅäÖ÷½Ê½¡£

<beans>
<bean id="MovieLister" class="spring.MovieLister">
<property name="finder">
<ref local="MovieFinder"/>
</property>
</bean>
<bean id="MovieFinder" class="spring.ColonMovieFinder">
<property name="filename">
<value>movies1.txt</value>
</property>
</bean>
</beans>

ÓÚÊÇ£¬²âÊÔ´úÂë´ó¸Å¾ÍÏñÏÂÃæÕâÑù£º

 public void testWithSpring() throws Exception
{
ApplicationContext ctx = newFileSystemXmlApplicationContext("spring.xml");
MovieLister lister = (MovieLister) ctx.getBean("MovieLister");
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West",movies[0].getTitle());
}

½Ó¿Ú×¢Èë

³ýÁËÇ°ÃæÁ½ÖÖ×¢Èë¼¼Êõ£¬»¹¿ÉÒÔÔÚ½Ó¿ÚÖж¨ÒåÐèҪעÈëµÄÐÅÏ¢£¬²¢Í¨¹ý½Ó¿ÚÍê³É×¢Èë¡£Avalon¿ò¼Ü¾ÍʹÓÃÁËÀàËÆµÄ¼¼Êõ¡£ÔÚÕâÀÎÒÊ×ÏÈÓüòµ¥µÄ·¶Àý´úÂë˵Ã÷ËüµÄÓ÷¨£¬ºóÃæ»¹»áÓиüÉîÈëµÄÌÖÂÛ¡£Ê×ÏÈ£¬ÎÒÐèÒª¶¨ÒåÒ»¸ö½Ó¿Ú£¬×é¼þµÄ×¢È뽫ͨ¹ýÕâ¸ö½Ó¿Ú½øÐС£ÔÚ±¾ÀýÖУ¬Õâ¸ö½Ó¿ÚµÄÓÃ;Êǽ«Ò»¸öMovieFinderʵÀý×¢Èë¼Ì³ÐÁ˸ýӿڵĶÔÏó¡£

public interface InjectFinder
{
void injectFinder(MovieFinder finder);
}

Õâ¸ö½Ó¿ÚÓ¦¸ÃÓÉÌṩMovieFinder½Ó¿ÚµÄÈËÒ»²¢Ìṩ¡£ÈκÎÏëҪʹÓÃMovieFinderʵÀýµÄÀࣨÀýÈçMovieListerÀࣩ¶¼±ØÐëʵÏÖÕâ¸ö½Ó¿Ú¡£

class MovieLister implements InjectFinder...
public void injectFinder(MovieFinder finder)
{
this.finder = finder;
}

È»ºó£¬ÎÒʹÓÃÀàËÆµÄ·½·¨½«ÎļþÃû×¢ÈëMovieFinderµÄʵÏÖÀࣺ

public interface InjectFilename
{
void injectFilename (String filename);
}

class ColonMovieFinder implements MovieFinder, InjectFilename...
public void injectFilename(String filename)
{
this.filename = filename;
}

ÏÖÔÚ£¬»¹ÐèÒªÓÃһЩÅäÖôúÂ뽫ËùÓеÄ×é¼þʵÏÖ×°ÅäÆðÀ´¡£¼òµ¥Æð¼û£¬ÎÒÖ±½ÓÔÚ´úÂëÖÐÍê³ÉÅäÖ㬲¢½«ÅäÖúõÄMovieLister ¶ÔÏó±£´æÔÚÃûΪlisterµÄ×Ö¶ÎÖУº

class IfaceTester...
private MovieLister lister;
private void configureLister()
{
ColonMovieFinder finder = new ColonMovieFinder();
finder.injectFilename("movies1.txt");
lister = new MovieLister();
lister.injectFinder(finder);
}

²âÊÔ´úÂëÔò¿ÉÒÔÖ±½ÓʹÓÃÕâ¸ö×ֶΣº

class IfaceTester...
public void testIface()
{
configureLister();
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West",movies[0].getTitle());
}

ʹÓÃService Locator

ÒÀÀµ×¢ÈëµÄ×î´óºÃ´¦ÔÚÓÚ£ºËüÏû³ýÁËMovieListerÀà¶Ô¾ßÌåMovieFinderʵÏÖÀàµÄÒÀÀµ¡£ÕâÑùÒ»À´£¬ÎҾͿÉÒÔ°ÑMovieListerÀཻ¸øÅóÓÑ£¬ÈÃËûÃǸù¾Ý×Ô¼ºµÄ»·¾³²åÈëÒ»¸öºÏÊʵÄMovieFinderʵÏÖ¼´¿É¡£²»¹ý£¬Dependency Injectionģʽ²¢²»ÊÇ´òÆÆÕâ²ãÒÀÀµ¹ØÏµµÄΨһÊֶΣ¬ÁíÒ»ÖÖ·½·¨ÊÇʹÓÃService Locatorģʽ¡£

Service Locatorģʽ±³ºóµÄ»ù±¾Ë¼ÏëÊÇ£ºÓÐÒ»¸ö¶ÔÏ󣨼´·þÎñ¶¨Î»Æ÷£©ÖªµÀÈçºÎ»ñµÃÒ»¸öÓ¦ÓóÌÐòËùÐèµÄËùÓзþÎñ¡£Ò²¾ÍÊÇ˵£¬ÔÚÎÒÃǵÄÀý×ÓÖУ¬·þÎñ¶¨Î»Æ÷Ó¦¸ÃÓÐÒ»¸ö·½·¨£¬ÓÃÓÚ»ñµÃÒ»¸öMovieFinderʵÀý¡£µ±È»£¬Õâ²»¹ýÊǰÑÂé·³»»ÁËÒ»¸öÑù×Ó£¬ÎÒÃÇÈÔÈ»±ØÐëÔÚMovieListerÖлñµÃ·þÎñ¶¨Î»Æ÷£¬×îÖյõ½µÄÒÀÀµ¹ØÏµÈçͼ3 Ëùʾ£º

ͼ3£ºÊ¹ÓÃService Locator ģʽ֮ºóµÄÒÀÀµ¹ØÏµ

ÔÚÕâÀÎÒ°ÑServiceLocatorÀàʵÏÖΪһ¸öSingletonµÄ×¢²á±í£¬ÓÚÊÇMovieLister¾Í¿ÉÒÔÔÚʵÀý»¯Ê±Í¨¹ýServiceLocator»ñµÃÒ»¸öMovieFinderʵÀý¡£

class MovieLister...
MovieFinder finder = ServiceLocator.movieFinder();

class ServiceLocator...
public static MovieFinder movieFinder()
{
return soleInstance.movieFinder;
}
private static ServiceLocator soleInstance;
private MovieFinder movieFinder;

ºÍ×¢ÈëµÄ·½Ê½Ò»Ñù£¬ÎÒÃÇÒ²±ØÐë¶Ô·þÎñ¶¨Î»Æ÷¼ÓÒÔÅäÖá£ÔÚÕâÀÎÒÖ±½ÓÔÚ´úÂëÖнøÐÐÅäÖ㬵«Éè¼ÆÒ»ÖÖͨ¹ýÅäÖÃÎļþ»ñµÃÊý¾ÝµÄ»úÖÆÒ²²¢·ÇÄÑÊ¡£

class Tester...
private void configure()
{
ServiceLocator.load(new ServiceLocator(
newColonMovieFinder("movies1.txt")));
}

class ServiceLocator...
public static void load(ServiceLocator arg)
{
soleInstance = arg;
}
public ServiceLocator(MovieFinder movieFinder)
{
this.movieFinder = movieFinder;
}

ÏÂÃæÊDzâÊÔ´úÂ룺

class Tester...
public void testSimple()
{
configure();
MovieLister lister = new MovieLister();
Movie[] movies = lister.moviesDirectedBy("Sergio Leone");
assertEquals("Once Upon a Time in the West",movies[0].getTitle());

}

ÎÒʱ³£Ìýµ½ÕâÑùµÄÂÛµ÷£ºÕâÑùµÄ·þÎñ¶¨Î»Æ÷²»ÊÇʲôºÃ¶«Î÷£¬ÒòΪÄãÎÞ·¨Ìæ»»Ëü·µ»ØµÄ·þÎñʵÏÖ£¬´Ó¶øµ¼ÖÂÎÞ·¨¶ÔËüÃǽøÐвâÊÔ¡£µ±È»£¬Èç¹ûÄãµÄÉè¼ÆºÜÔã¸â£¬ÄãµÄÈ·»áÓöµ½ÕâÑùµÄÂé·³£»µ«ÄãÒ²¿ÉÒÔÑ¡ÔñÁ¼ºÃµÄÉè¼Æ¡£ÔÚÕâ¸öÀý×ÓÖУ¬ServiceLocatorʵÀý½ö½öÊÇÒ»¸ö¼òµ¥µÄÊý¾ÝÈÝÆ÷£¬Ö»ÐèÒª¶ÔËü×öһЩ¼òµ¥µÄÐ޸ģ¬¾Í¿ÉÒÔÈÃËü·µ»ØÓÃÓÚ²âÊԵķþÎñʵÏÖ¡£

¶ÔÓÚ¸ü¸´ÔÓµÄÇé¿ö£¬ÎÒ¿ÉÒÔ´ÓServiceLocatorÅÉÉú³ö¶à¸ö×ÓÀ࣬²¢½«×ÓÀàÐ͵ÄʵÀý´«µÝ¸ø×¢²á±íµÄÀà±äÁ¿¡£ÁíÍ⣬ÎÒ¿ÉÒÔÐÞ¸ÄServiceLocatorµÄ¾²Ì¬·½·¨£¬Ê¹Æäµ÷ÓÃServiceLocatorʵÀýµÄ·½·¨£¬¶ø²»ÊÇÖ±½Ó·ÃÎÊʵÀý±äÁ¿¡£ÎÒ»¹¿ÉÒÔʹÓÃÌØ¶¨ÓÚÏ̵߳Ĵ洢»úÖÆ£¬´Ó¶øÌá¹©ÌØ¶¨ÓÚÏ̵߳ķþÎñ¶¨Î»Æ÷¡£ËùÓÐÕâÒ»ÇиĽø¶¼ÎÞÐëÐÞ¸ÄServiceLocatorµÄʹÓÃÕß¡£

Ò»ÖָĽøµÄ˼·ÊÇ£º·þÎñ¶¨Î»Æ÷ÈÔÈ»ÊÇÒ»¸ö×¢²á±í£¬µ«²»ÊÇSingleton¡£SingletonµÄÈ·ÊÇʵÏÖ×¢²á±íµÄÒ»ÖÖ¼òµ¥Í¾¾¶£¬µ«ÕâÖ»ÊÇÒ»¸öʵÏÖʱµÄ¾ö¶¨£¬¿ÉÒÔºÜÇáËɵظıäËü¡£

Ϊ¶¨Î»Æ÷Ìṩ·ÖÀëµÄ½Ó¿Ú

ÉÏÃæÕâÖÖ¼òµ¥µÄʵÏÖ·½Ê½ÓÐÒ»¸öÎÊÌ⣺MovieListerÀཫÒÀÀµÓÚÕû¸öServiceLocatorÀ࣬µ«ËüÐèҪʹÓõÄÈ´Ö»ÊǺóÕßËùÌṩµÄÒ»Ïî·þÎñ¡£ÎÒÃÇ¿ÉÒÔÕë¶ÔÕâÏî·þÎñÌṩһ¸öµ¥¶ÀµÄ½Ó¿Ú£¬¼õÉÙMovieLister¶ÔServiceLocatorµÄÒÀÀµ³Ì¶È¡£ÕâÑùÒ»À´£¬MovieLister¾Í²»±ØÊ¹ÓÃÕû¸öµÄServiceLocator ½Ó¿Ú£¬Ö»ÐèÉùÃ÷ËüÏëҪʹÓõÄÄDz¿·Ö½Ó¿Ú¡£

´Ëʱ£¬MovieLister ÀàµÄÌṩÕßÒ²Ó¦¸ÃÒ»²¢Ìṩһ¸ö¶¨Î»Æ÷½Ó¿Ú£¬Ê¹ÓÃÕß¿ÉÒÔͨ¹ýÕâ¸ö½Ó¿Ú»ñµÃMovieFinderʵÀý¡£

public interface MovieFinderLocator
{
public MovieFinder movieFinder();

ÕæÊµµÄ·þÎñ¶¨Î»Æ÷ÐèҪʵÏÖÉÏÊö½Ó¿Ú£¬Ìṩ·ÃÎÊMovieFinderʵÀýµÄÄÜÁ¦£º

 MovieFinderLocator locator = ServiceLocator.locator();
MovieFinder finder = locator.movieFinder();
public static ServiceLocator locator()
{
return soleInstance;
}
public MovieFinder movieFinder()
{
return movieFinder;
}
private static ServiceLocator soleInstance;
private MovieFinder movieFinder;

ÄãÓ¦¸ÃÒѾ­×¢Òâµ½ÁË£ºÓÉÓÚÏëҪʹÓýӿڣ¬ÎÒÃDz»ÄÜÔÙͨ¹ý¾²Ì¬·½·¨Ö±½Ó·ÃÎÊ·þÎñ¡ª¡ªÎÒÃDZØÐëÊ×ÏÈͨ¹ýServiceLocatorÀà»ñµÃ¶¨Î»Æ÷ʵÀý£¬È»ºóʹÓö¨Î»Æ÷ʵÀýµÃµ½ÎÒÃÇÏëÒªµÄ·þÎñ¡£

¶¯Ì¬·þÎñ¶¨Î»Æ÷

ÉÏÃæÊÇÒ»¸ö¾²Ì¬¶¨Î»Æ÷µÄÀý×Ó¡ª¡ª¶ÔÓÚÄãËùÐèÒªµÄÿÏî·þÎñ£¬ServiceLocatorÀà¶¼ÓжÔÓ¦µÄ·½·¨¡£Õâ²¢²»ÊÇʵÏÖ·þÎñ¶¨Î»Æ÷µÄΨһ·½Ê½£¬ÄãÒ²¿ÉÒÔ´´½¨Ò»¸ö¶¯Ì¬·þÎñ¶¨Î»Æ÷£¬Äã¿ÉÒÔÔÚÆäÖÐ×¢²áÐèÒªµÄÈκηþÎñ£¬²¢ÔÚÔËÐÐÆÚ¾ö¶¨»ñµÃÄÄÒ»Ïî·þÎñ¡£

ÔÚ±¾ÀýÖУ¬ServiceLocatorʹÓÃÒ»¸ömapÀ´±£´æ·þÎñÐÅÏ¢£¬¶ø²»ÔÙÊǽ«ÕâЩÐÅÏ¢±£´æÔÚ×Ö¶ÎÖС£´ËÍ⣬ServiceLocator»¹ÌṩÁËÒ»¸öͨÓõķ½·¨£¬ÓÃÓÚ»ñÈ¡ºÍ¼ÓÔØ·þÎñ¶ÔÏó¡£

class ServiceLocator...
private static ServiceLocator soleInstance;
public static void load(ServiceLocator arg)
{
soleInstance = arg;
}
private Map services = new HashMap();
public static Object getService(String key)
{
return soleInstance.services.get(key);
}
public void loadService (String key, Object service)
{
services.put(key, service);
}

ͬÑùÐèÒª¶Ô·þÎñ¶¨Î»Æ÷½øÐÐÅäÖ㬽«·þÎñ¶ÔÏóÓëÊʵ±µÄ¹Ø¼ü×Ö¼ÓÔØµ½¶¨Î»Æ÷ÖУº

class Tester...
private void configure()
{
ServiceLocator locator = new ServiceLocator();
locator.loadService("MovieFinder", newColonMovieFinder("movies1.txt"));
ServiceLocator.load(locator);
}

ÎÒʹÓÃÓë·þÎñ¶ÔÏóÀàÃû³ÆÏàͬµÄ×Ö·û´®×÷Ϊ·þÎñ¶ÔÏóµÄ¹Ø¼ü×Ö£º

class MovieLister...
MovieFinder finder = (MovieFinder)
ServiceLocator.getService("MovieFinder");

×ÜÌå¶øÑÔ£¬ÎÒ²»Ï²»¶ÕâÖÖ·½Ê½¡£ÎÞÒÉ£¬ÕâÑùʵÏֵķþÎñ¶¨Î»Æ÷¾ßÓиüÇ¿µÄÁé»îÐÔ£¬µ«ËüµÄʹÓ÷½Ê½²»¹»Ö±¹ÛÃ÷ÀÊ¡£ÎÒÖ»ÓÐͨ¹ýÎı¾ÐÎʽµÄ¹Ø¼ü×Ö²ÅÄÜÕÒµ½Ò»¸ö·þÎñ¶ÔÏó¡£Ïà±È֮ϣ¬ÎÒ¸üÐÀÉÍͨ¹ýÒ»¸ö·½·¨Ã÷È·»ñµÃ·þÎñ¶ÔÏóµÄ·½Ê½£¬ÒòΪÕâÈÃʹÓÃÕßÄܹ»´Ó½Ó¿Ú¶¨ÒåÖÐÇå³þµØÖªµÀÈçºÎ»ñµÃijÏî·þÎñ¡£

ÓÃAvalon ¼æ¹Ë·þÎñ¶¨Î»Æ÷ºÍÒÀÀµ×¢Èë

Dependency InjectionºÍService LocatorÁ½¸öģʽ²¢²»ÊÇ»¥³âµÄ£¬Äã¿ÉÒÔͬʱʹÓÃËüÃÇ£¬Avalon¿ò¼Ü¾ÍÊÇÕâÑùµÄÒ»¸öÀý×Ó¡£AvalonʹÓÃÁË·þÎñ¶¨Î»Æ÷£¬µ«ÈçºÎ»ñµÃ¶¨Î»Æ÷µÄÐÅÏ¢ÔòÊÇͨ¹ý×¢ÈëµÄ·½Ê½¸æÖª×é¼þµÄ¡£

¶ÔÓÚÇ°ÃæÒ»Ö±Ê¹ÓõÄÀý×Ó£¬Berin Loritsch·¢Ë͸øÁËÎÒÒ»¸ö¼òµ¥µÄAvalonʵÏÖ°æ±¾£º

public class MyMovieLister implements MovieLister, Serviceable
{
private MovieFinder finder;
public void service( ServiceManager manager )throws ServiceException
{
finder = (MovieFinder)manager.lookup("finder");
}

service·½·¨¾ÍÊǽӿÚ×¢ÈëµÄÀý×Ó£¬ËüʹÈÝÆ÷¿ÉÒÔ½«Ò»¸öServiceManager¶ÔÏó×¢ÈëMyMovieLister¶ÔÏó¡£ServiceManagerÔòÊÇÒ»¸ö·þÎñ¶¨Î»Æ÷¡£ÔÚÕâ¸öÀý×ÓÖУ¬MyMovieLister²¢²»°ÑServiceManager¶ÔÏó±£´æÔÚ×Ö¶ÎÖУ¬¶øÊÇÂíÉϽèÖúËüÕÒµ½MovieFinder ʵÀý£¬²¢½«ºóÕß±£´æÆðÀ´¡£

×÷³öÒ»¸öÑ¡Ôñ

µ½ÏÖÔÚΪֹ£¬ÎÒÒ»Ö±ÔÚ²ûÊö×Ô¼º¶ÔÕâÁ½¸öģʽ£¨Dependency InjectionģʽºÍServiceLocatorģʽ£©ÒÔ¼°ËüÃǵı仯ÐÎʽµÄ¿´·¨¡£ÏÖÔÚ£¬ÎÒÒª¿ªÊ¼ÌÖÂÛËûÃǵÄÓŵãºÍȱµã£¬ÒÔ±ãÖ¸³öËüÃǸ÷×ÔÊÊÓõij¡¾°¡£

Service Locator vs. Dependency Injection

Ê×ÏÈ£¬ÎÒÃÇÃæÁÙService LocatorºÍDependency InjectionÖ®¼äµÄÑ¡Ôñ¡£Ó¦¸Ã×¢Ò⣬¾¡¹ÜÎÒÃÇÇ°ÃæÄǸö¼òµ¥µÄÀý×Ó²»×ãÒÔ±íÏÖ³öÀ´£¬Êµ¼ÊÉÏÕâÁ½¸öģʽ¶¼ÌṩÁË»ù±¾µÄ½âñîºÏÄÜÁ¦¡£ÎÞÂÛʹÓÃÄĸöģʽ£¬Ó¦ÓóÌÐò´úÂë¶¼²»ÒÀÀµÓÚ·þÎñ½Ó¿ÚµÄ¾ßÌåʵÏÖ¡£Á½ÕßÖ®¼ä×îÖØÒªµÄÇø±ðÔÚÓÚ£º¾ßÌåʵÏÖÒÔʲô·½Ê½Ìṩ¸øÓ¦ÓóÌÐò´úÂ롣ʹÓÃService Locatorģʽʱ£¬Ó¦ÓóÌÐò´úÂëÖ±½ÓÏò·þÎñ¶¨Î»Æ÷·¢ËÍÒ»¸öÏûÏ¢£¬Ã÷È·ÒªÇó·þÎñµÄʵÏÖ£»Ê¹ÓÃDependency Injectionģʽʱ£¬Ó¦ÓóÌÐò´úÂë²»·¢³öÏÔʽµÄÇëÇ󣬷þÎñµÄʵÏÖ×ÔÈ»»á³öÏÖÔÚÓ¦ÓóÌÐò´úÂëÖУ¬ÕâÒ²¾ÍÊÇËùν¿ØÖÆ·´×ª¡£

¿ØÖÆ·´×ªÊÇ¿ò¼ÜµÄ¹²Í¬ÌØÕ÷£¬µ«ËüÒ²ÒªÇóÄ㸶³öÒ»¶¨µÄ´ú¼Û£ºËü»áÔö¼ÓÀí½âµÄÄѶȣ¬²¢ÇÒ¸øµ÷ÊÔ´øÀ´Ò»¶¨µÄÀ§ÄÑ¡£ËùÒÔ£¬ÕûÌåÀ´Ëµ£¬³ý·Ç±ØÒª£¬·ñÔòÎһᾡÁ¿±ÜÃâʹÓÃËü¡£Õâ²¢²»Òâζ×Å¿ØÖÆ·´×ª²»ºÃ£¬Ö»ÊÇÎÒÈÏΪÔںܶàʱºòʹÓÃÒ»¸ö¸üΪֱ¹ÛµÄ·½°¸£¨ÀýÈçService Locatorģʽ£©»á±È½ÏºÏÊÊ¡£

Ò»¸ö¹Ø¼üµÄÇø±ðÔÚÓÚ£ºÊ¹ÓÃService Locatorģʽʱ£¬·þÎñµÄʹÓÃÕß±ØÐëÒÀÀµÓÚ·þÎñ¶¨Î»Æ÷¡£¶¨Î»Æ÷¿ÉÒÔÒþ²ØÊ¹ÓÃÕß¶Ô·þÎñ¾ßÌåʵÏÖµÄÒÀÀµ£¬µ«Äã±ØÐëÊ×ÏÈ¿´µ½¶¨Î»Æ÷±¾Éí¡£ËùÒÔ£¬ÎÊÌâµÄ´ð°¸¾ÍºÜÃ÷ÀÊÁË£ºÑ¡ÔñService Locator»¹ÊÇDependency Injection£¬È¡¾öÓÚ¶Ô¶¨Î»Æ÷µÄÒÀÀµÊÇ·ñ»á¸øÄã´øÀ´Âé·³¡£

Dependency Injectionģʽ¿ÉÒÔ°ïÖúÄã¿´Çå×é¼þÖ®¼äµÄÒÀÀµ¹ØÏµ£ºÄãÖ»Ðè¹Û²ìÒÀÀµ×¢ÈëµÄ»úÖÆ£¨ÀýÈç¹¹Ô캯Êý£©£¬¾Í¿ÉÒÔÕÆÎÕÕû¸öÒÀÀµ¹ØÏµ¡£¶øÊ¹ÓÃService Locatorģʽʱ£¬Äã¾Í±ØÐëÔÚÔ´´úÂëÖе½´¦ËÑË÷¶Ô·þÎñ¶¨Î»Æ÷µÄµ÷Ó᣾߱¸È«ÎļìË÷ÄÜÁ¦µÄIDE¿ÉÒÔÂÔ΢¼ò»¯ÕâÒ»¹¤×÷£¬µ«»¹ÊDz»ÈçÖ±½Ó¹Û²ì¹¹Ô캯Êý»òÕßÉèÖµ·½·¨À´µÃÇáËÉ¡£

Õâ¸öÑ¡ÔñÖ÷Ҫȡ¾öÓÚ·þÎñʹÓÃÕßµÄÐÔÖÊ¡£Èç¹ûÄãµÄÓ¦ÓóÌÐòÖÐÓкܶ಻ͬµÄÀàҪʹÓÃÒ»¸ö·þÎñ£¬ÄÇôӦÓóÌÐò´úÂë¶Ô·þÎñ¶¨Î»Æ÷µÄÒÀÀµ¾Í²»ÊÇʲô´óÎÊÌâ¡£ÔÚÇ°ÃæµÄÀý×ÓÖУ¬ÎÒÒª°ÑMovieListerÀཻ¸øÅóÓÑÈ¥Óã¬ÕâÖÖÇé¿öÏÂʹÓ÷þÎñ¶¨Î»Æ÷¾ÍºÜºÃ£ºÎÒµÄÅóÓÑÃÇÖ»ÐèÒª¶Ô¶¨Î»Æ÷×öÒ»µãÅäÖã¨Í¨¹ýÅäÖÃÎļþ»òÕßijЩÅäÖÃÐԵĴúÂ룩£¬Ê¹ÆäÌṩºÏÊʵķþÎñʵÏ־ͿÉÒÔÁË¡£ÔÚÕâÖÖÇé¿öÏ£¬ÎÒ¿´²»³öDependency InjectionģʽÌṩµÄ¿ØÖÆ·´×ªÓÐʲôÎüÒýÈ˵ĵط½¡£µ«ÊÇ£¬Èç¹û°ÑMovieLister ¿´×÷Ò»¸ö×é¼þ£¬Òª½«ËüÌṩ¸ø±ðÈËдµÄÓ¦ÓóÌÐòȥʹÓã¬Çé¿ö¾Í²»Í¬ÁË¡£ÔÚÕâÖÖʱºò£¬ÎÒÎÞ·¨Ô¤²âʹÓÃÕß»áʹÓÃʲôÑùµÄ·þÎñ¶¨Î»Æ÷API£¬Ã¿¸öʹÓÃÕß¶¼¿ÉÄÜÓÐ×Ô¼ºµÄ·þÎñ¶¨Î»Æ÷£¬¶øÇұ˴ËÖ®¼äÎÞ·¨¼æÈÝ¡£Ò»ÖÖ½â¾ö°ì·¨ÊÇΪÿÏî·þÎñÌṩµ¥¶ÀµÄ½Ó¿Ú£¬Ê¹ÓÃÕß¿ÉÒÔ±àдһ¸öÊÊÅäÆ÷£¬ÈÃÎҵĽӿÚÓëËûÃǵķþÎñ¶¨Î»Æ÷ÏàÅäºÏ¡£µ«¼´±ãÈç´Ë£¬ÎÒÈÔÈ»ÐèÒªµ½µÚÒ»¸ö·þÎñ¶¨Î»Æ÷ÖÐѰÕÒÎҹ涨µÄ½Ó¿Ú¡£¶øÇÒÒ»µ©ÓÃÉÏÁËÊÊÅäÆ÷£¬·þÎñ¶¨Î»Æ÷ËùÌṩµÄ¼òµ¥ÐԾͱ»´ó´óÏ÷ÈõÁË¡£

ÁíÒ»·½Ã棬Èç¹ûʹÓÃDependency Injectionģʽ£¬×é¼þÓë×¢ÈëÆ÷Ö®¼ä²»»áÓÐÒÀÀµ¹ØÏµ£¬Òò´Ë×é¼þÎÞ·¨´Ó×¢ÈëÆ÷ÄÇÀï»ñµÃ¸ü¶àµÄ·þÎñ£¬Ö»ÄÜ»ñµÃÅäÖÃÐÅÏ¢ÖÐËùÌṩµÄÄÇЩ¡£ÕâÒ²ÊÇDependency Injection ģʽµÄ¾ÖÏÞÐÔÖ®Ò»¡£

ÈËÃÇÇãÏòÓÚʹÓÃDependency InjectionģʽµÄÒ»¸ö³£¼ûÀíÓÉÊÇ£ºËü¼ò»¯Á˲âÊÔ¹¤×÷¡£ÕâÀïµÄ¹Ø¼üÊÇ£º³öÓÚ²âÊÔµÄÐèÒª£¬Äã±ØÐëÄܹ»ÇáËɵØÔÚÕæÊµµÄ·þÎñʵÏÖÓ빩²âÊÔÓõÄα×é¼þÖ®¼äÇл»¡£µ«ÊÇ£¬Èç¹ûµ¥´ÓÕâ¸ö½Ç¶ÈÀ´¿¼ÂÇ£¬Dependency InjectionģʽºÍService LocatorģʽÆäʵ²¢Ã»ÓÐÌ«´óÇø±ð£ºÁ½Õß¶¼Äܹ»ºÜºÃµØÖ§³Öα×é¼þµÄ²åÈë¡£Ö®ËùÒԺܶàÈËÓÐDependency Injectionģʽ¸üÀûÓÚ²âÊÔµÄÓ¡Ïó£¬ÎÒ²ÂÊÇÒòΪËûÃDz¢Ã»ÓÐŬÁ¦±£Ö¤·þÎñ¶¨Î»Æ÷µÄ¿ÉÌæ»»ÐÔ¡£ÕâÕýÊdzÖÐø²âÊÔÆð×÷Óõĵط½£ºÈç¹ûÄã²»ÄÜÇáËɵØÓÃһЩα×é¼þ½«Ò»¸ö·þÎñ¼ÜÆðÀ´ÒÔ±ã²âÊÔ£¬Õâ¾ÍÒâζ×ÅÄãµÄÉè¼Æ³öÏÖÁËÑÏÖØµÄÎÊÌâ¡£

µ±È»£¬Èç¹û×é¼þ»·¾³¾ßÓзdz£Ç¿µÄÇÖÂÔÐÔ£¨¾ÍÏñEJB¿ò¼ÜÄÇÑù£©£¬²âÊÔµÄÎÊÌâ»á¸ü¼ÓÑÏÖØ¡£ÎҵĹ۵ãÊÇ£ºÓ¦¸Ã¾¡Á¿¼õÉÙÕâÀà¿ò¼Ü¶ÔÓ¦ÓóÌÐò´úÂëµÄÓ°Ïì£¬ÌØ±ðÊDz»Òª×öÈκοÉÄÜʹ±à¼­-Ö´ÐеÄÑ­»·±äÂýµÄÊÂÇé¡£Óòå¼þ£¨plugin£©»úÖÆÈ¡´úÖØÁ¿¼¶×é¼þ»á¶Ô²âÊÔ¹ý³ÌÓкܴó°ïÖú£¬ÕâÕýÊDzâÊÔÇý¶¯¿ª·¢£¨Test Driven Development£¬TDD£©Ö®Ààʵ¼ùµÄ¹Ø¼üËùÔÚ¡£

ËùÒÔ£¬Ö÷ÒªµÄÎÊÌâÔÚÓÚ£º´úÂëµÄ×÷ÕßÊÇ·ñÏ£Íû×Ô¼º±àдµÄ×é¼þÄܹ»ÍÑÀë×Ô¼ºµÄ¿ØÖÆ¡¢±»Ê¹ÓÃÔÚÁíÒ»¸öÓ¦ÓóÌÐòÖС£Èç¹û´ð°¸Êǿ϶¨µÄ£¬ÄÇôËû¾Í²»ÄܶԷþÎñ¶¨Î»Æ÷×öÈκμÙÉ衪¡ªÄÄÅÂ×îСµÄ¼ÙÉèÒ²»á¸øÊ¹ÓÃÕß´øÀ´Âé·³¡£

¹¹Ô캯Êý×¢Èë vs. ÉèÖµ·½·¨×¢Èë

ÔÚ×éºÏ·þÎñʱ£¬Äã×ܵÃ×ñÑ­Ò»¶¨µÄÔ¼¶¨£¬²Å¿ÉÄܽ«ËùÓж«Î÷Æ´×°ÆðÀ´¡£ÒÀÀµ×¢ÈëµÄÓŵãÖ÷ÒªÔÚÓÚ£ºËüÖ»ÐèÒª·Ç³£¼òµ¥µÄÔ¼¶¨¡ª¡ªÖÁÉÙ¶ÔÓÚ¹¹Ô캯Êý×¢ÈëºÍÉèÖµ·½·¨×¢ÈëÀ´ËµÊÇÕâÑù¡£Ïà±ÈÓÚÕâÁ½Õߣ¬½Ó¿Ú×¢ÈëµÄÇÖÂÔÐÔҪǿµÃ¶à£¬±ÈÆðService LocatorģʽµÄÓÅÊÆÒ²²»ÄÇôÃ÷ÏÔ¡£ËùÒÔ£¬Èç¹ûÄãÏëÒªÌṩһ¸ö×é¼þ¸ø¶à¸öʹÓÃÕߣ¬¹¹Ô캯Êý×¢ÈëºÍÉèÖµ·½·¨×¢Èë¿´ÆðÀ´ºÜÓÐÎüÒýÁ¦¡£Äã²»±ØÔÚ×é¼þÖмÓÈëÊ²Ã´Ï£Ææ¹Å¹ÖµÄ¶«Î÷£¬×¢ÈëÆ÷¿ÉÒÔÏ൱ÇáËɵذÑËùÓж«Î÷ÅäÖÃÆðÀ´¡£

ÉèÖµº¯Êý×¢ÈëºÍ¹¹Ô캯Êý×¢ÈëÖ®¼äµÄÑ¡ÔñÏ൱ÓÐȤ£¬ÒòΪËüÕÛÉä³öÃæÏò¶ÔÏó±à³ÌµÄһЩ¸üÆÕ±éµÄÎÊÌ⣺Ӧ¸ÃÔÚÄÄÀïÌî³ä¶ÔÏóµÄ×ֶΣ¬¹¹Ô캯Êý»¹ÊÇÉèÖµ·½·¨£¿

Ò»Ö±ÒÔÀ´£¬ÎÒÊ×Ñ¡µÄ×ö·¨ÊǾ¡Á¿ÔÚ¹¹Ôì½×¶Î¾Í´´½¨ÍêÕû¡¢ºÏ·¨µÄ¶ÔÏ󡪡ªÒ²¾ÍÊÇ˵£¬ÔÚ¹¹Ô캯ÊýÖÐÌî³ä¶ÔÏó×ֶΡ£ÕâÑù×öµÄºÃ´¦¿ÉÒÔ×·Ëݵ½Kent BeckÔÚSmalltalk Best Practice PatternsÒ»ÊéÖнéÉܵÄÁ½¸öģʽ£ºConstructor MethodºÍConstructor Parameter Method¡£´øÓвÎÊýµÄ¹¹Ô캯Êý¿ÉÒÔÃ÷È·µØ¸æËßÄãÈçºÎ´´½¨Ò»¸öºÏ·¨µÄ¶ÔÏó¡£Èç¹û´´½¨ºÏ·¨¶ÔÏóµÄ·½Ê½²»Ö¹Ò»ÖÖ£¬Ä㻹¿ÉÒÔÌṩ¶à¸ö¹¹Ô캯Êý£¬ÒÔ˵Ã÷²»Í¬µÄ×éºÏ·½Ê½¡£

¹¹Ô캯Êý³õʼ»¯µÄÁíÒ»¸öºÃ´¦ÊÇ£ºÄã¿ÉÒÔÒþ²ØÈκβ»¿É±äµÄ×ֶΡª¡ªÖ»Òª²»ÎªËüÌṩÉèÖµ·½·¨¾ÍÐÐÁË¡£ÎÒÈÏΪÕâºÜÖØÒª£ºÈç¹ûij¸ö×Ö¶ÎÊDz»Ó¦¸Ã±»¸Ä±äµÄ£¬Ã»ÓÐÕë¶Ô¸Ã×ֶεÄÉèÖµ·½·¨¾ÍºÜÇå³þµØËµÃ÷ÁËÕâÒ»µã¡£Èç¹ûÄãͨ¹ýÉèÖµ·½·¨Íê³É³õʼ»¯£¬±©Â¶³öÀ´µÄÉèÖµ·½·¨ºÜ¿ÉÄܳÉΪÄãÐÄÍ·ÓÀÔ¶µÄÍ´¡££¨Êµ¼ÊÉÏ£¬ÔÚÕâÖÖʱºòÎÒ¸üÔ¸Òâ»Ø±Üͨ³£µÄÉèÖµ·½·¨Ô¼¶¨£¬¶øÊÇʹÓÃÖîÈçinitFooÖ®ÀàµÄ·½·¨Ãû£¬ÒÔ±íÃ÷¸Ã·½·¨Ö»Ó¦¸ÃÔÚ¶ÔÏó´´½¨Ö®³õµ÷Óᣣ©

²»¹ý£¬ÊÀÊÂ×ÜÓÐÀýÍâ¡£Èç¹û²ÎÊýÌ«¶à£¬¹¹Ô캯Êý»áÏÔµÃÁèÂÒ²»¿°£¬ÌرðÊǶÔÓÚ²»Ö§³Ö¹Ø¼ü×Ö²ÎÊýµÄÓïÑÔ¸üÊÇÈç´Ë¡£µÄÈ·£¬Èç¹û¹¹Ô캯Êý²ÎÊýÁбíÌ«³¤£¬Í¨³£±êÖ¾×ŶÔÏóÌ«¹ý·±Ã¦£¬ÀíÓ¦½«Æä²ð·Ö³É¼¸¸ö¶ÔÏ󣬵«ÓÐЩʱºòҲȷʵÐèÒªÄÇô¶àµÄ²ÎÊý¡£Èç¹ûÓв»Ö¹Ò»Öֵķ½Ê½¿ÉÒÔ¹¹ÔìÒ»¸öºÏ·¨µÄ¶ÔÏó£¬Ò²ºÜÄÑͨ¹ý¹¹Ô캯ÊýÃèÊöÕâÒ»ÐÅÏ¢£¬ÒòΪ¹¹Ô캯ÊýÖ®¼äÖ»ÄÜͨ¹ý²ÎÊýµÄ¸öÊýºÍÀàÐͼÓÒÔÇø·Ö¡£Õâ¾ÍÊÇFactory MethodģʽÊÊÓõij¡ºÏÁË£¬¹¤³§·½·¨¿ÉÒÔ½èÖú¶à¸ö˽Óй¹Ô캯ÊýºÍÉèÖµ·½·¨µÄ×éºÏÀ´Íê³É×Ô¼ºµÄÈÎÎñ¡£¾­µäFactory MethodģʽµÄÎÊÌâÔÚÓÚ£ºËüÃÇÍùÍùÒÔ¾²Ì¬·½·¨µÄÐÎʽ³öÏÖ£¬ÄãÎÞ·¨ÔÚ½Ó¿ÚÖÐÉùÃ÷ËüÃÇ¡£Äã¿ÉÒÔ´´½¨Ò»¸ö¹¤³§À࣬µ«ÄÇÓÖ±ä³ÉÁíÒ»¸ö·þÎñʵÌåÁË¡£¹¤³§·þÎñÊÇÒ»ÖÖ²»´íµÄ¼¼ÇÉ£¬µ«ÄãÈÔÈ»ÐèÒªÒÔijÖÖ·½Ê½ÊµÀý»¯Õâ¸ö¹¤³§¶ÔÏó£¬ÎÊÌâÈÔȻûÓнâ¾ö¡£

Èç¹ûÒª´«ÈëµÄ²ÎÊýÊÇÏñ×Ö·û´®ÕâÑùµÄ¼òµ¥ÀàÐÍ£¬¹¹Ô캯Êý×¢ÈëÒ²»á´øÀ´Ò»Ð©Âé·³¡£Ê¹ÓÃÉèÖµ·½·¨×¢Èëʱ£¬Äã¿ÉÒÔÔÚÿ¸öÉèÖµ·½·¨µÄÃû×ÖÖÐ˵Ã÷²ÎÊýµÄÓÃ;£»¶øÊ¹Óù¹Ô캯Êý×¢Èëʱ£¬ÄãÖ»ÄÜ¿¿²ÎÊýµÄλÖÃÀ´¾ö¶¨Ã¿¸ö²ÎÊýµÄ×÷Ó㬶ø¼Çס²ÎÊýµÄÕýȷλÖÃÏÔȻҪÀ§Äѵöࡣ

Èç¹û¶ÔÏóÓжà¸ö¹¹Ô캯Êý£¬¶ÔÏóÖ®¼äÓÖ´æÔڼ̳йØÏµ£¬ÊÂÇé¾Í»á±äµÃÌØ±ðÌÖÑᡣΪÁËÈÃËùÓж«Î÷¶¼ÕýÈ·µØ³õʼ»¯£¬Äã±ØÐ뽫¶Ô×ÓÀ๹Ô캯ÊýµÄµ÷ÓÃת·¢¸ø³¬ÀàµÄ¹¹Ô캯Êý£¬È»ºó´¦Àí×Ô¼ºµÄ²ÎÊý¡£Õâ¿ÉÄÜÔì³É¹¹Ô캯Êý¹æÄ£µÄ½øÒ»²½ÅòÕÍ¡£

¾¡¹ÜÓÐÕâЩȱÏÝ£¬µ«ÎÒÈÔÈ»½¨ÒéÄãÊ×ÏÈ¿¼Âǹ¹Ô캯Êý×¢Èë¡£²»¹ý£¬Ò»µ©Ç°ÃæÌáµ½µÄÎÊÌâÕæµÄ³ÉÁËÎÊÌ⣬Äã¾ÍÓ¦¸Ã×¼±¸×ªÎªÊ¹ÓÃÉèÖµ·½·¨×¢Èë¡£

ÔÚ½«Dependecy Injection ģʽ×÷Ϊ¿ò¼ÜµÄºËÐIJ¿·ÖµÄ¼¸Ö§ÍŶÓÖ®¼ä£¬¹¹Ô캯Êý×¢È뻹ÊÇÉèÖµ·½·¨×¢ÈëÒý·¢Á˺ܶàµÄÕùÂÛ¡£²»¹ý£¬ÏÖÔÚ¿´À´£¬¿ª·¢ÕâЩ¿ò¼ÜµÄ´ó¶àÊýÈ˶¼ÒѾ­Òâʶµ½£º²»¹Ü¸üϲ»¶ÄÄÖÖ×¢Èë»úÖÆ£¬Í¬Ê±ÎªÁ½ÕßÌṩ֧³Ö¶¼ÊÇÓбØÒªµÄ¡£

´úÂëÅäÖà vs. ÅäÖÃÎļþ

ÁíÒ»¸öÎÊÌâÏà¶Ô¶ÀÁ¢£¬µ«Ò²¾­³£ÓëÆäËûÎÊÌâÇ£ÉæÔÚÒ»Æð£ºÈçºÎÅäÖ÷þÎñµÄ×é×°£¬Í¨¹ýÅäÖÃÎļþ»¹ÊÇÖ±½Ó±àÂë×é×°£¿¶ÔÓÚ´ó¶àÊýÐèÒªÔÚ¶à´¦²¿ÊðµÄÓ¦ÓóÌÐòÀ´Ëµ£¬Ò»¸öµ¥¶ÀµÄÅäÖÃÎļþ»á¸üºÏÊÊ¡£ÅäÖÃÎļþ¼¸ºõ¶¼ÊÇXML Îļþ£¬XML Ò²µÄÈ·ºÜÊʺÏÕâÒ»ÓÃ;¡£²»¹ý£¬ÓÐЩʱºòÖ±½ÓÔÚ³ÌÐò´úÂëÖÐʵÏÖ×°Åä»á¸ü¼òµ¥¡£Æ©ÈçÒ»¸ö¼òµ¥µÄÓ¦ÓóÌÐò£¬Ò²Ã»ÓкܶಿÊðÉϵı仯£¬ÕâʱÓü¸¾ä´úÂëÀ´ÅäÖþͱÈXML ÎļþÒªÇåÎúµÃ¶à¡£

ÓëÖ®Ïà¶ÔµÄ£¬ÓÐʱӦÓóÌÐòµÄ×é×°·Ç³£¸´ÔÓ£¬Éæ¼°´óÁ¿µÄÌõ¼þ²½Öè¡£Ò»µ©±à³ÌÓïÑÔÖеÄÅäÖÃÂß¼­¿ªÊ¼±äµÃ¸´ÔÓ£¬Äã¾ÍÓ¦¸ÃÓÃÒ»ÖÖºÏÊʵÄÓïÑÔÀ´ÃèÊöÅäÖÃÐÅÏ¢£¬Ê¹³ÌÐòÂß¼­±äµÃ¸üÇåÎú¡£È»ºó£¬Äã¿ÉÒÔ±àдһ¸ö¹¹ÔìÆ÷£¨builder£©ÀàÀ´Íê³É×°Å乤×÷¡£Èç¹ûʹÓù¹ÔìÆ÷µÄÇé¾°²»Ö¹Ò»ÖÖ£¬Äã¿ÉÒÔÌṩ¶à¸ö¹¹ÔìÆ÷À࣬Ȼºóͨ¹ýÒ»¸ö¼òµ¥µÄÅäÖÃÎļþÔÚËüÃÇÖ®¼äÑ¡Ôñ¡£

ÎÒ³£³£·¢ÏÖ£¬ÈËÃÇÌ«¼±ÓÚ¶¨ÒåÅäÖÃÎļþ¡£±à³ÌÓïÑÔͨ³£»áÌṩ¼ò½Ý¶øÇ¿´óµÄÅäÖùÜÀí»úÖÆ£¬ÏÖ´ú±à³ÌÓïÑÔÒ²¿ÉÒÔ½«³ÌÐò±àÒë³ÉСµÄÄ£¿é£¬²¢½«Æä²åÈë´óÐÍϵͳÖС£Èç¹û±àÒë¹ý³Ì»áºÜ·ÑÁ¦£¬½Å±¾ÓïÑÔÒ²¿ÉÒÔÔÚÕâ·½ÃæÌṩ°ïÖú¡£Í¨³£ÈÏΪ£¬ÅäÖÃÎļþ²»Ó¦¸ÃÓñà³ÌÓïÑÔÀ´±àд£¬ÒòΪËüÃÇÐèÒªÄܹ»±»²»¶®±à³ÌµÄϵͳ¹ÜÀíÈËÔ±±à¼­¡£µ«ÊÇ£¬ÕâÖÖÇé¿ö³öÏֵļ¸ÂÊÓжà´óÄØ£¿ÎÒÃÇÕæµÄÏ£Íû²»¶®±à³ÌµÄϵͳ¹ÜÀíÈËÔ±À´¸Ä±äÒ»¸ö¸´ÔӵķþÎñÆ÷¶ËÓ¦ÓóÌÐòµÄÊÂÎñ¸ôÀëµÈ¼¶Âð£¿Ö»ÓÐÔڷdz£¼òµ¥µÄʱºò£¬·Ç±à³ÌÓïÑÔµÄÅäÖÃÎļþ²ÅÓÐ×îºÃµÄЧ¹û¡£Èç¹ûÅäÖÃÐÅÏ¢¿ªÊ¼±äµÃ¸´ÔÓ£¬¾ÍÓ¦¸Ã¿¼ÂÇÑ¡ÔñÒ»ÖÖºÏÊʵıà³ÌÓïÑÔÀ´±àдÅäÖÃÎļþ¡£

ÔÚJava ÊÀ½çÀÎÒÃÇÌýµ½ÁËÀ´×ÔÅäÖÃÎļþµÄ²»ºÍгÒô¡ª¡ªÃ¿¸ö×é¼þ¶¼ÓÐËü×Ô¼ºµÄÅäÖÃÎļþ£¬¶øÇÒ¸ñʽ»¹¸÷²»Ïàͬ¡£Èç¹ûÄãҪʹÓÃÒ»´òÕâÑùµÄ×é¼þ£¬Äã¾ÍµÃά»¤Ò»´òµÄÅäÖÃÎļþ£¬ÄÇ»áºÜ¿ìÈÃÄã·³ËÀ¡£

ÔÚÕâÀÎҵĽ¨ÒéÊÇ£ºÊ¼ÖÕÌṩһÖÖ±ê×¼µÄÅäÖ÷½Ê½£¬Ê¹³ÌÐòÔ±Äܹ»Í¨¹ýͬһ¸ö±à³Ì½Ó¿ÚÇáËɵØÍê³ÉÅäÖù¤×÷¡£ÖÁÓÚÆäËûµÄÅäÖÃÎļþ£¬½ö½ö°ÑËüÃǵ±×÷Ò»ÖÖ¿ÉÑ¡µÄ¹¦ÄÜ¡£½èÖúÕâ¸ö±à³Ì½Ó¿Ú£¬¿ª·¢Õß¿ÉÒÔÇáËɵعÜÀíÅäÖÃÎļþ¡£Èç¹ûÄã±àдÁËÒ»¸ö×é¼þ£¬Ôò¿ÉÒÔÓÉ×é¼þµÄʹÓÃÕßÀ´Ñ¡ÔñÈçºÎ¹ÜÀíÅäÖÃÐÅÏ¢£ºÊ¹ÓÃÄãµÄ±à³Ì½Ó¿Ú¡¢Ö±½Ó²Ù×÷ÅäÖÃÎļþ¸ñʽ£¬»òÕß¶¨ÒåËûÃÇ×Ô¼ºµÄÅäÖÃÎļþ¸ñʽ£¬²¢½«ÆäÓëÄãµÄ±à³Ì½Ó¿ÚÏà½áºÏ¡£

·ÖÀëÅäÖÃÓëʹÓÃ

ËùÓÐÕâÒ»ÇеĹؼüÔÚÓÚ£º·þÎñµÄÅäÖÃÓ¦¸ÃÓëʹÓ÷ֿª¡£Êµ¼ÊÉÏ£¬ÕâÊÇÒ»¸ö»ù±¾µÄÉè¼ÆÔ­Ôò¡ª¡ª·ÖÀë½Ó¿ÚÓëʵÏÖ¡£ÔÚÃæÏò¶ÔÏó³ÌÐòÀÎÒÃÇÔÚÒ»¸öµØ·½ÓÃÌõ¼þÂß¼­À´¾ö¶¨¾ßÌåʵÀý»¯ÄÄÒ»¸öÀ࣬ÒÔºóµÄÌõ¼þ·ÖÖ§¶¼Óɶà̬À´ÊµÏÖ£¬¶ø²»ÊǼÌÐøÖØ¸´Ç°ÃæµÄÌõ¼þÂß¼­£¬Õâ¾ÍÊÇ·ÖÀë½Ó¿ÚÓëʵÏÖµÄÔ­Ôò¡£

Èç¹û¶ÔÓÚÒ»¶Î´úÂë¶øÑÔ£¬½Ó¿ÚÓëʵÏֵķÖÀ뻹ֻÊÇÓÐÓõϰ£¬ÄÇôµ±ÄãÐèҪʹÓÃÍâ²¿ÔªËØ£¨ÀýÈç×é¼þºÍ·þÎñ£©Ê±£¬Ëü¾ÍÊÇÉúËÀØü¹ØµÄ´óÊ¡£ÕâÀïµÄµÚÒ»¸öÎÊÌâÊÇ£ºÄãÊÇ·ñÏ£Íû½«Ñ¡Ôñ¾ßÌåʵÏÖÀàµÄ¾ö²ßÍÆ³Ùµ½²¿Êð½×¶Î¡£Èç¹ûÊÇ£¬ÄÇôÄãÐèҪʹÓòåÈë¼¼Êõ¡£Ê¹ÓÃÁ˲åÈë¼¼ÊõÖ®ºó£¬²å¼þµÄ×°ÅäÔ­ÔòÉÏÊÇÓëÓ¦ÓóÌÐòµÄÆäÓಿ·Ö·Ö¿ªµÄ£¬ÕâÑùÄã¾Í¿ÉÒÔÇáËɵØÕë¶Ô²»Í¬µÄ²¿ÊðÌæ»»²»Í¬µÄÅäÖá£ÕâÖÖÅäÖûúÖÆ¿ÉÒÔͨ¹ý·þÎñ¶¨Î»Æ÷À´ÊµÏÖ£¨Service Locatorģʽ£©£¬Ò²¿ÉÒÔ½èÖúÒÀÀµ×¢ÈëÖ±½ÓÍê³É£¨Dependency Injection ģʽ£©¡£

¸ü¶àµÄÎÊÌâ

ÔÚ±¾ÎÄÖУ¬ÎÒ¹Ø×¢µÄ½¹µãÊÇʹÓÃDependency InjectionģʽºÍService Locatorģʽ½øÐзþÎñÅäÖõĻù±¾ÎÊÌâ¡£»¹ÓÐһЩÓëÖ®Ïà¹ØµÄ»°ÌâÖµµÃ¹Ø×¢£¬µ«ÎÒÒѾ­Ã»ÓÐʱ¼ä¼ÌÐøÉîÈëÏÂÈ¥ÁË¡£ÌرðÖµµÃ×¢ÒâµÄÊÇÉúÃüÖÜÆÚÐÐΪµÄÎÊÌ⣺ijЩ×é¼þ¾ßÓÐÌØ¶¨µÄÉúÃüÖÜÆÚʼþ£¬ÀýÈçÍ£Ö¹¡¢¿ªÊ¼µÈµÈ¡£ÁíÒ»¸öÖµµÃ×¢ÒâµÄÎÊÌâÊÇ£ºÔ½À´Ô½¶àµÄÈ˶ÔÈçºÎÔÚÕâЩÈÝÆ÷ÖÐÔËÓÃÃæÏò·½Ã棨aspectoriented£©µÄ˼Ïë²úÉúÁËÐËȤ¡£¾¡¹ÜĿǰ»¹Ã»ÓÐÈÏÕæ×¼±¸¹ýÕâ·½ÃæµÄ²ÄÁÏ£¬µ«ÎÒÒ²ºÜÏ£ÍûÒÔºóÄÜÔÚÕâ¸ö»°ÌâÉÏдһЩ¶«Î÷¡£

¹ØÓÚÕâЩÎÊÌ⣬ÄãÔÚרעÓÚÇáÁ¿¼¶ÈÝÆ÷µÄÍøÕ¾ÉÏ¿ÉÒÔÕÒµ½ºÜ¶à×ÊÁÏ¡£ä¯ÀÀPicoContainer£¨ http://www.picocontainer.org£©»òÕßSpring£¨ http://www.springframework.org£©µÄÍøÕ¾£¬Äã¿ÉÒÔÕÒµ½´óÁ¿Ïà¹ØµÄÌÖÂÛ£¬²¢ÓÉ´ËÒýÉê³ö¸ü¶àµÄ»°Ìâ¡£

½áÂÛºÍ˼¿¼

ÔÚʱÏÂÁ÷ÐеÄÇáÁ¿¼¶ÈÝÆ÷¶¼Ê¹ÓÃÁËÒ»¸ö¹²Í¬µÄģʽÀ´×é×°Ó¦ÓóÌÐòËùÐèµÄ·þÎñ£¬ÎÒ°ÑÕâ¸öģʽ³ÆÎªDependency Injection£¬Ëü¿ÉÒÔÓÐЧµØÌæ´úService Locatorģʽ¡£ÔÚ¿ª·¢Ó¦ÓóÌÐòʱ£¬Á½Õß²»ÏàÉÏÏ£¬µ«ÎÒÈÏΪService LocatorģʽÂÔÓÐÓÅÊÆ£¬ÒòΪËüµÄÐÐΪ·½Ê½¸üΪֱ¹Û¡£µ«ÊÇ£¬Èç¹ûÄ㿪·¢µÄ×é¼þÒª½»¸ø¶à¸öÓ¦ÓóÌÐòȥʹÓã¬ÄÇôDependency Injectionģʽ»áÊǸüºÃµÄÑ¡Ôñ¡£

Èç¹ûÄã¾ö¶¨Ê¹ÓÃDependency Injectionģʽ£¬ÕâÀﻹÓм¸ÖÖ²»Í¬µÄ·ç¸ñ¿É¹©Ñ¡Ôñ¡£ÎÒ½¨ÒéÄãÊ×ÏÈ¿¼Âǹ¹Ô캯Êý×¢È룻Èç¹ûÓöµ½ÁËÄ³Ð©ÌØ¶¨µÄÎÊÌ⣬ÔÙ¸ÄÓÃÉèÖµ·½·¨×¢Èë¡£Èç¹ûÄãҪѡÔñÒ»¸öÈÝÆ÷£¬ÔÚÆäÖ®ÉϽøÐпª·¢£¬ÎÒ½¨ÒéÄãÑ¡Ôñͬʱ֧³ÖÕâÁ½ÖÖ×¢È뷽ʽµÄÈÝÆ÷¡£

Service Locator ģʽºÍDependency Injection ģʽ֮¼äµÄÑ¡Ôñ²¢ÊÇ×îÖØÒªµÄ£¬¸üÖØÒªµÄÊÇ£ºÓ¦¸Ã½«·þÎñµÄÅäÖúÍÓ¦ÓóÌÐòÄÚ²¿¶Ô·þÎñµÄʹÓ÷ÖÀ뿪¡£

ÖÂл

ÔÚ´Ë£¬ÎÒÒªÏò°ïÖúÎÒÀí½â±¾ÎÄÖÐËùÌáµ½µÄÎÊÌâ¡¢²¢¶Ô±¾ÎÄÌá³ö±¦¹óÒâ¼ûµÄ¼¸¸öÈ˱íʾ¸Ðл£¬ËûÃÇÊÇRod Johnson¡¢Paul Hammant¡¢Joe Walnes¡¢Aslak Hellesoy¡¢Jon TirsenºÍBill Caputo¡£ÁíÍ⣬Berin LoritschºÍHamilton Verissimo de OliveiraÔÚAvalon·½Ãæ¸øÁËÎҷdz£ÓÐÓõĽ¨Ò飬һ²¢ÏòËûÃDZíʾ¸Ðл¡£

   
1610 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ