Je travaille depuis quelques temps sur une bibliotheque Java appelee Fuse que j'ai cree pour les besoins d'un projet chez Sun. Comme la version 0.2 vient de sortir, j'en profite pour vous la presenter. Cette bibliotheque est disponible sous licence BSD sur fuse.dev.java.net. Fuse permet de faire de l'injection de ressources dans des objets Java, en particulier dans des composants graphiques Swing, AWT et SWT.
Le concept est similaire aux conteneurs d'IoC. Normalement, un composant charge ses ressources lors de son initialisation. Voici par exemple comment un composant Swing chargerait une image :
class CustomComponent extends JComponent {
private Image background;
CustomComponent() {
try {
background = ImageIO.read(
getClass().getResource("/resources/background.png"));
} catch (IOException e) {
}
}
}
Cette solution a de nombreux desavantages, le principal etant qu'il devient difficile de localiser la gestion des ressources dans le code. En phase de conception de l'interface graphique, cette methode rend egalement les tests fastidieux. L'approche proposee par Fuse est beaucoup plus simple:
class CustomComponent extends JComponent {
@InjectedResource
private Image background;
}
Dans ce nouvel exemple, le composant ne va pas chercher la ressource lui-meme mais definit seulement quel(s) champ(s) correspondent a des ressources. Pour que le composant fonctionne il faut lui injecter les ressources :
ResourceInjector.get().load("mes.ressources");
CustomComponent c = new CustomComponent();
ResourceInjector.get().inject(c);
La premiere ligne charge les ressources depuis un fichier texte tandis que la derniere ligne realise l'injection a proprement parler. Voici le contenu du fichier mes.ressources :
CustomComponent.background=/background.png
Cette technique permet de modifier les ressources de l'interface graphique tres simplement. Fuse sait gerer par defaut un nombre consequent de types de donnees. Vous pouvez ainsi definir des couleurs, des degrades, des polices de caracteres, des dates, des URL, des formes, etc. Le site du projet propose une liste complete des differents types reconnus par Fuse.
Fuse propose en outre de nombreuses autres fonctionnalites comme les hives (demo) qui servent a recharger les ressources et a rafraichir l'interface graphique en cours d'execution. Vous pouvez egalement creer des definitions pour des composants dont vous n'avez pas le code source, forcer le nommage des ressources, charger des ressources depuis autre chose qu'un fichier texte (XML, base de donnees, etc.), utiliser plusieurs injecteurs a la fois...
Si cette breve description vous a interesse, je vous conseille de consulter la documentation et le blog Fuse maintenu par Daniel Spiewak.
Je vous conseille enfin de consulter l'exemple plus avance que j'ai ecrit il y a quelques semaines. Cet exemple montre l'utilisation des references mais donne surtout une meilleure idee des differentes sortes de ressources que l'on peut injecter. Vous y trouverez notamment des exemples d'injection de couleur et de degrades.
Cette news a été rédigée en écoutant The Strokes - Someday