Õ¾ÄÚËÑË÷: ÇëÊäÈëËÑË÷¹Ø¼ü´Ê

µ±Ç°Ò³Ãæ: ¿ª·¢×ÊÁÏÊ×Ò³ ¡ú Eclipse רÌâ ¡ú ÔÚEclipse RCPÖÐʵÏÖ·´×ª¿ØÖÆ(IoC)

ÔÚEclipse RCPÖÐʵÏÖ·´×ª¿ØÖÆ(IoC)

ÕªÒª: Eclipse¸»¿Í»§Æ½Ì¨(RCP)ÊÇÒ»¸ö¹¦ÄÜÇ¿´óµÄÈí¼þƽ̨£¬Ëü»ùÓÚ²å¼þ¼äµÄ»¥Á¬ÓëЭ×÷£¬ÔÊÐí¿ª·¢ÈËÔ±¹¹½¨Í¨ÓõÄÓ¦ÓóÌÐò¡£
¡¡¡¡Eclipse¸»¿Í»§Æ½Ì¨(RCP)ÊÇÒ»¸ö¹¦ÄÜÇ¿´óµÄÈí¼þƽ̨£¬Ëü»ùÓÚ²å¼þ¼äµÄ»¥Á¬ÓëЭ×÷£¬ÔÊÐí¿ª·¢ÈËÔ±¹¹½¨Í¨ÓõÄÓ¦ÓóÌÐò¡£RCPʹ¿ª·¢ÈËÔ±¿ÉÒÔ¼¯Öо«Á¦½øÐÐÓ¦ÓóÌÐòÒµÎñ´úÂëµÄ¿ª·¢£¬¶ø²»ÐèÒª»¨·Ñʱ¼äÖØз¢Ã÷ÂÖ×Ó±àдӦÓóÌÐò¹ÜÀíµÄÂß¼­¡£

¡¡¡¡·´×ª¿ØÖÆ(Inversion of Control, IoC)ºÍÒÀÀµ×¢Èë(Dependency Injection, DI)ÊÇÁ½ÖÖ±à³Ìģʽ£¬¿ÉÓÃÓÚ¼õÉÙ³ÌÐò¼äµÄñîºÏ¡£ËüÃÇ×ñÑ­Ò»¸ö¼òµ¥µÄÔ­Ôò£ºÄã²»Òª´´½¨ÄãµÄ¶ÔÏó£»ÄãÃèÊöËüÃÇÓ¦µ±ÈçºÎ±»´´½¨¡£Ä㲻ҪʵÀý»¯ÄãµÄ²¿¼þËùÐèÒª¶ÔÏó»òÖ±½Ó¶¨Î»ÄãµÄ²¿¼þËùÐèÒªµÄ·þÎñ£»Ïà·´£¬ÄãÃèÊöÄĸö²¿¼þÐèÒªÄÄЩ·þÎñ£¬ÆäËüÈË(ͨ³£ÊÇÒ»¸öÈÝÆ÷)¸ºÔð½«ËüÃÇÁ¬½Óµ½Ò»Æð¡£ÕâÒ²±»ÈÏΪÊǺÃÀ³Îë·¨Ôò£ºdon't call us--we'll call you¡£

¡¡¡¡±¾ÎĽ«ÃèÊöÒ»¸ö¼òµ¥µÄ·½Ê½ÔÚEclipse RCPÓ¦ÓóÌÐòÖÐʹÓÃÒÀÀµ×¢È롣ΪÁ˱ÜÃâÎÛȾEclipse ƽ̨µÄ»ù´¡½á¹¹ÒÔ¼°Í¸Ã÷µØÔÚRCPÖ®ÉÏÌí¼ÓIoC¿ò¼Ü£¬ÎÒÃǽ«½áºÏʹÓÃÔËÐÐʱ×Ö½ÚÂë²Ù×÷¼¼Êõ(ʹÓà ObjectWeb ASM¿â)¡¢JavaÀà¼ÓÔØ´úÀí(ʹÓÃjava.lang.instrument°ü)ÒÔ¼°Java annotation¡£

¡¡¡¡Ê²Ã´ÊÇEclipse¸»¿Í»§Æ½Ì¨?

¡¡¡¡ÓÃÒ»¾ä»°À´½²£¬¸»¿Í»§Æ½Ì¨ÊÇÒ»¸öÀà¿â¡¢Èí¼þ¿ò¼ÜµÄ¼¯ºÏ£¬ËüÊÇÒ»¸öÓÃÓÚ¹¹½¨µ¥»úºÍÁ¬ÍøÓ¦ÓóÌÐòµÄÔËÐÐʱ»·¾³¡£

¡¡¡¡¾¡¹ÜEclipse±»ÈÏΪÊǹ¹½¨¼¯³É¿ª·¢»·¾³(IDE)µÄ¿ò¼Ü£¬´Ó3.0¿ªÊ¼£¬EclipseÕû¸ö²úÆ·½øÐÐÁËÖع¹£¬·Ö¸î³É¸÷ÖÖ²»Í¬µÄ²¿¼þ£¬ËüЩ²¿¼þ¿ÉÒÔÓÃÓÚ¹¹½¨ÈÎÒâµÄÓ¦ÓóÌÐò¡£ÆäÖеÄÒ»¸ö×Ó¼¯¹¹³ÉÁ˸»¿Í»§Æ½Ì¨£¬Ëü°üº¬ÒÔÏÂÔªËØ£º»ù±¾µÄÔËÐÐʱ»·¾³¡¢Óû§½çÃæ×é¼þ(SWTºÍJFace)¡¢²å¼þÒÔ¼° OSGI²ã¡£Í¼1ÏÔʾÁËEclipseƽ̨µÄÖ÷Òª²¿¼þ¡£


ͼ1. Eclipseƽ̨µÄÖ÷Òª²¿¼þ

¡¡¡¡Õû¸öEclipseƽ̨ÊÇ»ùÓÚ²å¼þºÍÀ©Õ¹µã¡£Ò»¸ö²å¼þÊÇÒ»¸ö¿ÉÒÔ¶ÀÁ¢¿ª·¢ºÍ·¢²¼µÄ×îСµÄ¹¦Äܵ¥Ôª¡£Ëüͨ³£´ò°ü³ÉÒ»¸öjarÎļþ£¬Í¨¹ýÌí¼Ó¹¦ÄÜ(ÀýÈ磬һ¸ö±à¼­Æ÷¡¢Ò»¸ö¹¤¾ßÀ¸°´Å¥¡¢»òÒ»¸ö±àÒëÆ÷)À´À©Õ¹Æ½Ì¨¡£Õû¸öƽ̨ÊÇÒ»¸öÏ໥Á¬½ÓºÍͨÐŵIJå¼þµÄ¼¯ºÏ¡£Ò»¸öÀ©Õ¹µãÊÇÒ»¸ö»¥ÏàÁ¬½ÓµÄ¶Ëµã£¬ÆäËü²å¼þ¿ÉÒÔÓÃËüÌṩ¶îÍâµÄ¹¦ÄÜ(ÔÚEclipseÖгÆΪÀ©Õ¹)¡£À©Õ¹ºÍÀ©Õ¹µã¶¨ÒåÔÚXMLÅäÖÃÎļþÖУ¬XMLÎļþÓë²å¼þÀ¦°óÔÚÒ»Æð¡£

¡¡¡¡²å¼þģʽ¼ÓÇ¿Á˹Ø×¢·ÖÀëµÄ¸ÅÄ²å¼þ¼äµÄÇ¿Á¬½ÓºÍͨѶÐèҪͨ¹ýÅäÏß½øÐÐÉèÖÃËüÃÇÖ®¼äµÄÒÀÀµ¡£µäÐ͵ÄÀý×ÓÔ´×ÔÐèÒª¶¨Î»Ó¦ÓóÌÐòËùÐèÒªµÄµ¥×Ó·þÎñ£¬ÀýÈçÊý¾Ý¿âÁ¬½Ó³Ø¡¢ÈÕÖ¾´¦Àí»òÓû§±£´æµÄÊ×Ñ¡Ïî¡£·´×ª¿ØÖƺÍÒÀÀµ×¢ÈëÊÇÏû³ýÕâÖÖÒÀÀµµÄ¿ÉÐнâ¾ö·½°¸¡£

¡¡¡¡·´×ª¿ØÖƺÍÒÀÀµ× ¢Èë

¡¡¡¡·´×ª¿ØÖÆÊÇÒ»ÖÖ±à³Ìģʽ£¬Ëü¹Ø×¢·þÎñ(»òÓ¦ÓóÌÐò²¿¼þ)ÊÇÈçºÎ¶¨ÒåµÄÒÔ¼°ËûÃÇÓ¦¸ÃÈçºÎ¶¨Î»ËûÃÇÒÀÀµµÄÆäËü·þÎñ¡£Í¨³££¬Í¨¹ýÒ»¸öÈÝÆ÷»ò¶¨Î»¿ò¼ÜÀ´»ñµÃ¶¨ÒåºÍ¶¨Î»µÄ·ÖÀ룬ÈÝÆ÷»ò¶¨Î»¿ò¼Ü¸ºÔð£º
  • ±£´æ¿ÉÓ÷þÎñµÄ¼¯ºÏ
  • ÌṩһÖÖ·½Ê½½«¸÷ÖÖ²¿¼þÓëËüÃÇÒÀÀµµÄ·þÎñ°ó¶¨ÔÚÒ»Æð
  • ΪӦÓóÌÐò´úÂëÌṩһÖÖ·½Ê½À´ÇëÇóÒÑÅäÖõĶÔÏó(ÀýÈ磬һ¸öËùÓÐÒÀÀµ¶¼Âú×ãµÄ¶ÔÏó)£¬ ÕâÖÖ·½Ê½¿ÉÒÔÈ·±£¸Ã¶ÔÏóÐèÒªµÄËùÓÐÏà¹ØµÄ·þÎñ¶¼¿ÉÓá£
¡¡¡¡ÏÖÓеĿò¼Üʵ¼ÊÉÏʹÓÃÒÔÏÂÈýÖÖ»ù±¾¼¼ÊõµÄ¿ò¼ÜÖ´ÐзþÎñºÍ²¿¼þ¼äµÄ°ó¶¨:
  • ÀàÐÍ1 (»ùÓÚ½Ó¿Ú): ¿É·þÎñµÄ¶ÔÏóÐèҪʵÏÖÒ»¸öרÃŵĽӿڣ¬¸Ã½Ó¿ÚÌṩÁËÒ»¸ö¶ÔÏ󣬿ÉÒÔ´ÓÓÃÕâ¸ö¶ÔÏó²éÕÒÒÀÀµ(ÆäËü·þÎñ)¡£ÔçÆÚµÄÈÝÆ÷ExcaliburʹÓÃÕâÖÖģʽ¡£
  • ÀàÐÍ2 (»ùÓÚsetter): ͨ¹ýJavaBeanµÄÊôÐÔ(setter·½·¨)Ϊ¿É·þÎñ¶ÔÏóÖ¸¶¨·þÎñ¡£HiveMindºÍSpring²ÉÓÃÕâÖÖ·½Ê½¡£
  • ÀàÐÍ3 (»ùÓÚ¹¹Ô캯Êý): ͨ¹ý¹¹Ô캯ÊýµÄ²ÎÊýΪ¿É·þÎñ¶ÔÏóÖ¸¶¨·þÎñ¡£PicoContainerֻʹÓÃÕâÖÖ·½Ê½¡£HiveMindºÍSpringҲʹÓÃÕâÖÖ·½Ê½¡£
¡¡¡¡ÎÒÃǽ«²ÉÓõڶþÖÖ·½Ê½µÄÒ»¸ö±äÖÖ£¬Í¨¹ý±ê¼Ç·½Ê½À´Ìṩ·þÎñ(ÏÂÃæʾÀý³ÌÐòµÄÔ´´úÂë¿ÉÒÔÔÚ×ÊÔ´²¿·ÖµÃµ½)¡£ ÉùÃ÷Ò»¸öÒÀÀµ¿ÉÒÔ±íʾΪ:

@Injected public void aServicingMethod(Service s1, AnotherService s2) {

  // ½«s1ºÍs2±£´æµ½Àà±äÁ¿£¬ÐèҪʱ¿ÉÒÔʹÓÃ

}
¡¡¡¡·´×ª¿ØÖÆÈÝÆ÷½«²éÕÒInjected×¢ÊÍ£¬Ê¹ÓÃÇëÇóµÄ²ÎÊýµ÷Óø÷½·¨¡£ÎÒÃÇÏ뽫IoCÒýÈëEclipseƽ̨£¬·þÎñºÍ¿É·þÎñ¶ÔÏ󽫴ò°ü·ÅÈëEclipse²å¼þÖС£²å¼þ¶¨ÒåÒ»¸öÀ©Õ¹µã (Ãû³ÆΪcom.onjava.servicelocator.servicefactory)£¬Ëü¿ÉÒÔÏò³ÌÐòÌṩ·þÎñ¹¤³§¡£µ±¿É·þÎñ¶ÔÏóÐèÒªÅäÖÃʱ£¬²å¼þÏòÒ»¸ö¹¤³§ÇëÇóÒ»¸ö·þÎñʵÀý¡£ServiceLocatorÀཫÍê³ÉËùÓеŤ×÷£¬ÏÂÃæµÄ´úÂëÃèÊö¸ÃÀà(ÎÒÃÇÊ¡ÂÔÁË·ÖÎöÀ©Õ¹µãµÄ²¿·Ö£¬ÒòΪËü±È½ÏÖ±¹Û)£º

   /**

     * Injects the requested dependencies into the parameter object. It scans

     * the serviceable object looking for methods tagged with the

     * {@link Injected} annotation.Parameter types are extracted from the

     * matching method. An instance of each type is created from the registered

     * factories (see {@link IServiceFactory}). When instances for all the

     * parameter types have been created the method is invoked and the next one

     * is examined.

     * 

     * @param serviceable

     *            the object to be serviced

     * @throws ServiceException

     */

    public static void service(Object serviceable) throws ServiceException {

        ServiceLocator sl = getInstance();

        if (sl.isAlreadyServiced(serviceable)) {

            // prevent multiple initializations due to

            // constructor hierarchies

            System.out.println("Object " + serviceable

                    + " has already been configured ");

            return;

        }

        System.out.println("Configuring " + serviceable);

        // Parse the class for the requested services

        for (Method m : serviceable.getClass().getMethods()) {

            boolean skip = false;

            Injected ann = m.getAnnotation(Injected.class);

            if (ann != null) {

                Object[] services = new Object[m.getParameterTypes().length];

                int i = 0;

                for (Class£¼?£¾ class : m.getParameterTypes()) {

                    IServiceFactory factory = sl.getFactory(class, ann

                            .optional());

                    if (factory == null) {

                        skip = true;

                        break;

                    }

                    Object service = factory.getServiceInstance();

                    // sanity check: verify that the returned

                    // service's class is the expected one

                    // from the method

                    assert (service.getClass().equals(class) || class

                            .isAssignableFrom(service.getClass()));

                    services[i++] = service;

                }

                try {

                    if (!skip)

                        m.invoke(serviceable, services);

                } catch (IllegalAccessException iae) {

                    if (!ann.optional())

                        throw new ServiceException(

                                "Unable to initialize services on "

                                        + serviceable + ": " + iae.getMessage(), iae);

                } catch (InvocationTargetException ite) {

                    if (!ann.optional())

                        throw new ServiceException(

                                "Unable to initialize services on "

                                        + serviceable + ": " + ite.getMessage(), ite);

                }

            }

        }

        sl.setAsServiced(serviceable);

    }

¡¡¡¡ÓÉÓÚ·þÎñ¹¤³§·µ»ØµÄ·þÎñ¿ÉÄÜÒ²ÊÇ¿É·þÎñ¶ÔÏó£¬ÕâÖÖ²ßÂÔÔÊÐí¶¨Òå·þÎñµÄ²ã´Î½á¹¹(È»¶øÄ¿Ç°²»Ö§³ÖÑ­»·ÒÀÀµ)¡£


¡ü·µ»ØĿ¼
ǰһƪ: Eclipse RCP+Spring½¨ÅÖ¿Í»§¶ËWeb³ÌÐò
ºóһƪ: Eclipse µÄÀúÊ·¡¢ÏÖ×´ºÍδÀ´