2010-04-13 12 views
3

J'ai été chargé de faire un travail de refactoring sur la façon dont nous démarrons les applications. Fondamentalement, nous avons un tas d'applications console qui dépendaient du code de démarrage de l'application GUI, provoquant de fausses dépendances qui ont des effets de démarrage pour quelles bibliothèques nous devons expédier, et quelles dépendances les autres modules doivent déclarer. J'ai donc écrit un cadre de démarrage simple où je jette simplement un tas d'objets Runnable dans une liste, puis les exécuter dans l'ordre - et cela fonctionne.Contrôle de l'ordre de démarrage de PicoContainer

Mais je pensais - nous avons déjà PicoContainer dans notre projet, de sorte que toutes ces choses qui ont besoin d'être exécuté au démarrage pourrait éventuellement être jeté dans une PicoContainer, et si elles mettent en œuvre amorçable ils vont commencer ...

Mais dans certains cas, nous voulons spécifier l'ordre entre eux. Par exemple, je ne souhaite pas que d'autres composants écrivent dans le journal avant d'écrire un en-tête dans le journal indiquant que l'application démarre. Je sais que je peux introduire des commandes en introduisant des dépendances d'injection, mais cela ressemble à un hack dans ce cas - je devrais ajouter l'éditeur d'en-tête de journal en tant que dépendance pour tous les autres composants qui pourraient écrire dans le journal. tout.

Néanmoins, il semblerait que ce serait bien de contrôler l'ordre de démarrage de PicoContainer, alors y a-t-il peut-être un autre moyen? Alternativement, je pourrais simplement rester simple et coller à ma liste de Runnable

Cela fonctionne après tout.

Répondre

0

Comment vos composants écrivent-ils actuellement dans le journal? Je m'attendrais à ce qu'il y ait une dépendance (picocontainer) dans le journal, puis le constructeur de ce journal écrira l'en-tête. Si la journalisation n'est pas injectée et contourne complètement PicoContainer, je n'apporterais pas seulement la partie d'en-tête, je garderais cela séparé, comme le reste de la journalisation.

+0

En fait, le composant qui écrit l'en-tête de démarrage dans l'enregistreur est un composant distinct de l'enregistreur lui-même (principe de la responsabilité unique, et tout cela). – Trejkaz

2

Vous ne pouvez pas contrôler l'ordre de démarrage/arrêt par défaut, mais vous pouvez certainement commander votre propre cycle de vie.

exemple:

1) Faites votre MyStartable d'interface ayant des méthodes init() et l'extension Comparable.

2) ajouter le composant conteneur MyStart initialisé avec la liste ou le tableau de MyStartable.

3) démarrer MyStart manuellement ou avec démarrage standard/arrêt du cycle de vie

4) MyStart trier juste la liste/réseau selon l'ordre naturel que vous devriez remplacer.

5) invoquer init() sur chaque MyStartable

Je suppose qu'il n'y a plus moyen de le faire « natif », par les gestionnaires du cycle de vie, mais ont besoin d'explorer les sources.