[jboss-dev-forums] [Design the new POJO MicroContainer] - Lazy bean behaviour
alesj
do-not-reply at jboss.com
Mon Oct 8 18:34:29 EDT 2007
I'm doing (apart from AS5_PS ... no worries ;-)) some GUI example console for MC and was missing the following feature - lazy 'instantiation/install' of the bean.
e.g. I have some service that has many dependencies - many injected beans. One of them is rarely used and/or is fully installed in some later-on deployment unit. But I would still like to have that first service up and running.
So, I hacked a lazy notion to our beans - lazy proxies.
What you can do now is the following XML
| <bean name="bean" class="org.jboss.test.kernel.lazy.support.RareBean"/>
|
| <lazy name="proxy" bean="bean" exposeClass="true">
| <interface>org.jboss.test.kernel.lazy.support.IRare</interface>
| </lazy>
|
or the straight API
| AbstractLazyMetaData lazy = new AbstractLazyMetaData("bean");
| lazy.setInterfaces(Collections.singleton(IRare.class.getName()));
|
And the test to show that lazyness :-)
| AbstractBeanMetaData bean = new AbstractBeanMetaData("bean", RareBean.class.getName());
| bean.setMode(ControllerMode.MANUAL);
|
| KernelControllerContext beanContext = controller.install(bean);
| controller.change(beanContext, ControllerState.NOT_INSTALLED);
|
| ModifiedLazyMetaData lazy = new ModifiedLazyMetaData("bean", getFactoryClassName());
| lazy.setInterfaces(Collections.singleton(IRare.class.getName()));
| KernelControllerContext lazyContext = controller.install(lazy);
|
| assertNotNull(lazyContext);
| assertEquals(ControllerState.DESCRIBED, lazyContext.getState());
|
| controller.change(beanContext, ControllerState.DESCRIBED);
| controller.change(lazyContext, ControllerState.INSTALLED);
|
| IRare lazyRare = (IRare)lazyContext.getTarget();
| assertNotNull(lazyRare);
|
| try
| {
| lazyRare.getHits();
| throw new RuntimeException("Should not be here.");
| }
| catch(Throwable t)
| {
| assertInstanceOf(t, IllegalArgumentException.class);
| }
|
| controller.change(beanContext, ControllerState.INSTALLED);
|
| assertEquals(0, lazyRare.getHits());
| lazyRare.setHits(10);
| assertEquals(5, lazyRare.checkHits(15));
|
The code checks for the first available proxy generator - Javassist, JBossAOP (wip), JDK, ... (possible additions CGLIB, ASM, ...)
| static
| {
| initializerMap = new LinkedHashMap<String, String>();
| // test class name, actual LazyInitializer implementation
| initializerMap.put("javassist.util.proxy.ProxyObject", "org.jboss.kernel.plugins.lazy.JavassistLazyInitializer");
| initializerMap.put("org.jboss.aop.proxy.container.AOPProxyFactoryParameters", "org.jboss.aop.microcontainer.lazy.JBossAOPLazyInitializer");
| initializerMap.put("java.lang.reflect.Proxy", "org.jboss.kernel.plugins.lazy.JDKLazyInitializer");
| }
|
| /**
| * Get the LazyInitializater instance.
| *
| * @param configurator the configurator
| * @return initializer instance
| */
| protected static LazyInitializer getInitializer(KernelConfigurator configurator)
| {
| if (initializer == null)
| {
| for(Map.Entry<String, String> entry : initializerMap.entrySet())
| {
| if (testLibExists(entry.getKey()))
| {
| initializer = createInitializer(configurator, entry.getValue());
| if (initializer != null)
| break;
| }
| }
| }
| if (initializer == null)
| throw new IllegalArgumentException("Cannot initialize LazyInitializater, check classpath for missing classes.");
| return initializer;
| }
|
The proxies use KernelBus to do the invocation.
Currently you need to specify which interfaces are exposed.
Perhaps this can be done automa(g|t)ically?
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4092782#4092782
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4092782
More information about the jboss-dev-forums
mailing list