Dear All --

I was having an issue with @SpringBean injection -- my dao class was not initialized properly with the dependent beans. I spent some time exploring internals of CGLib and Spring Injections and then a thought struck me: how really helpful is this injection?

Consider this code:

        class MyPage extends Page {
           ...
           @SpringBean
           MyDAO dao;
           ...
        }

vs. this code:

        class MyPage {
           ...
           MyDAO dao= Locator.find("myDAO", MyDAO.class);
           ...
        }

The Locator is a pretty straightforward guy who pulls ApplicationContext out of thin air^^^^^ThreadLocal variable and looks up on it, see the example code below.

The former uses annotations, CGLIB and delicate injection. The latter uses nothing and is a lot simpler and robust. Aside from marginal savings in typing I couldn't find any advantages of the former approach. Can you?

Unless convinced otherwise, I am going to skip the @SpringBean altogether and use the Locator thing in my application.

Thanks,
-- Sasha

-----------------------------------------------------------------------
public abstract class Locator {
        
        abstract Object find(String name);
        
        static Locator locator= null;
        
        public static Locator register(Locator inLocator) {
                Locator result= locator;
                locator= inLocator;
                return result;
        }
        
        public static class SpringLocator extends Locator {
ApplicationContext context= WebApplicationContextUtils.getRequiredWebApplicationContext(
                                WebApplication.get().getServletContext());
                Object find(String name) {
                        return context.getBean(name);
                }
        }
        
        /** To be called in the application initialization */
        public static void registerSpringLocator() {
                register(new SpringLocator());
        }
        
        /** Use for unit tests */
        public static class MockLocator extends Locator {
                @Override
                Object find(String name) {
                        // TODO implement
                        return null;
                }
        }
        
        public static<T> T find(String name, Class<T> clazz) {
                Object found= locator.find(name);
                if (found==null)
                        return null;
                return clazz.cast(found);
        }
}
-----------------------------------------------------------------------


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to