Felépités

A keretrendszer két forrásból szerez információkat a komponensek egymás közötti függéseir?l, egyrészt van az úgy nevezett Registry, amiben le van irva, hogy egy adott osztályból való komponenst hogyan kell inicalizálni, milyen más komponensekt?l függ.

Illetve vannak az egyes példányok konfigurációját leiró Repository, ami alapján a rendszer eldönti, hogy milyen sorrendben kell létrehozni az egyes objektumokat, milyen settereket kell meghivni, valamint milyen konfigurációt kapjanak az egyes példányok.

Szóismétlés...

Az els? komponens

A bigyo müködtetéséhez értelemszerüen létre kell hozni el?ször a megfelel? Repository-t, valamint a tényleges futtatáshoz kellenek az egyes példányok konfigurációjának leirása. Szerencsére az egész egyszerübb mint megcsinálni, mint elmagyarázni :).

A repository-t (jelenleg) egyetlen xml irja le, lehet kézzel szerkeszteni, de egyszerübb generálni megfelel? javadoc-al ellátott osztályokból.
Ami a példából majd rögtön látszódni is fog

Az els? komponensük konfigurációja álljon a következ? javabean -b?l:

                    public class MyConfig {
                        List words;
                        int number;
					
                        String comment;
						
                        ....mindenféle setter/getter
                    }
				

S akkor az els? komponensünk legyen:

				
                    /**
                     * @bigyo-component my-component
                     */
                    public class MyComponent {
					
                        private MyConfig config;

                        /**
                         * @bigyo-constructor
                         */
                        public MyComponent(MyConfig config) {
                    	this.config = config;
                        }


                        /**
                         * @bigyo-start
                         */
                        public void init() {
							System.out.println("Component inited!");
                        }
						
                        public void addToList(String line) {
                    		List result = config.getWords();
                    		if (result==null) {
                    			result = new ArrayList();
                    		}
                    		result.add(line);
                    		config.setWords(result);
                    		config.setNumber( config.getNumber() + line.length() );
                    		System.out.println(config.getComment() + ':'+ config.getNumber());
                    	}
                    }	
					
				

Telepités

Most már csak pár példányt kell definiálni, ahhoz, hogy élvezhessük a bigyo el?nyeit :) Az egyes objektumokat egy-egy xml irja le, amiket egy könyvtárba kell elhelyezni, s onnan fogja beolvasni.
Fontos:az xml fájloknak .conf.xml kiterjesztéssel kell rendelkezniük, a többi tipust nem veszi figyelembe!

	<config classAlias="my-component" instanceName="myComp-0">
	  <configBean class-name="my-component" number="15" comment="My First Component" >
	    <words>
	      <string>elso</string>
		  <string>masodik</string>
	    </words>
	  </configBean>
	</config>
				

A minimál container

Ezután csak az utolsó lépés van hátra: müködésre birni az egészet a következ? kódrészlettel:

    import net.sf.bigyo.container.Main;

    .
    .
    .
	
    Main container = new Main("config/registry.xml");
	
    // ennek magyarázata az ikszedik részben lesz :)
	
    container.setProfileChecker(new AllProfile()); 

    // a config/components egy könyvtár
    container.loadConfigurations(new File("config/components")); 

    container.startup();
	
    .
    .
    .
	
	
    MyComponent myComp = (MyComponent) container.getComponent("myComp-0");
	
    myComp.addToList("hello world!");
	
    .
    .
    .
	
    container.stop();
					
				
S kész is vagyunk. Mikor a kódban lekérjük a myComp-0 komponenst, akkor egy felinicalizált példányt kapunk vissza, amin szabadon ügyködhetünk belátásunk szerint.

Így egy egyszerü, ámde teljesen minimalista containert kapunk,
  • nem frissiti a beállitásokat, ha változott a fájl rendszerben
  • ami nem menti el a változtatásokat
Szerencsére mindkét funkcionalitást hozzáadhatjuk szerverünkhöz.

A fejlettebb container

Szeretnénk azt, ha minden 53. másodpercben a containerünk ellenörizné, hogy nem történt e valami változás a fájlrendszerben?

Mi sem egyszerübb, adjuk hozzá a következ? sorokat az inicalizáláshoz:

     container.getRepository().setConfigurationStrategy(new PreGeneratedWrapperStrategy());
					
     Thread t = new Thread(container.new ConfigurationChecker("src/demo-components",53000), "Configuration Checker");
     t.setDaemon(true);
     t.start();

				
Sajnos, ez jelenleg még nem elég, de szinte kész is vagyunk. Ugyanis,a konfigurációt a rendszer két féle képpen tudja frissiteni:
  • A registry generálásához használt ant task generál pár helper osztályt a komponenseinkhez, nevezetesen minden konfigurációs osztályunkhoz egy leszármazott wrapper osztályt {konfig-bean}Wrapper néven. Ha ilyen nevü osztályt talál futás közben, akkor azt fogja használni, az eredeti osztályunk helyett, igy tudja frissiteni a konfigurációnkat a komponens értesítése nélkül is.
  • Ha szeretnénk explicit üzenetet kapni a konfiguráció megváltozásáról, akkor implementáljuk a Reconfigurable interfészt, s ekkor az új konfigurációt megkapjuk a reconfigure paramétereként. (A hint jelenleg mindig null)