Announcement Announcement Module
Collapse
No announcement yet.
Spring Dependency Injection and Plugin Jar Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Spring Dependency Injection and Plugin Jar

    I have web application running with a default impl of a backend service. One should be able to implement the interface and drop the jar into the plugins folder (which is not in the apps classpath). Once the server is restarted, the idea is to load the new jar into the classloader, and have it take part in dependency injection. I am using Spring DI using @Autowired. The new plugin service impl will have @Primary annotation. So given two impls of the interface, the primary should be loaded.

    I got the jar loaded into the classloader and can invoke the impl manually. But I haven't been able to get to to participate in the Dependency Injection, and have it replace the default impl.

    Here's a simplified example:

    Code:
        @Controller
        public class MyController {
           @Autowired
           Service service;
        }
        
        //default.jar
        @Service
        DefaultService implements Service {
           public void print() {
               System.out.println("printing DefaultService.print()");
           } 
        }
        
        //plugin.jar not in classpath yet
        @Service
        @Primary
        MyNewService implements Service {
           public void print() {
              System.out.println("printing MyNewService.print()");
           } 
        }
      
    
    //For lack of better place, I loaded the plugin jar from the ContextListener  
    
        public class PluginContextLoaderListener extends org.springframework.web.context.ContextLoaderListener {
        
                @Override
                protected void customizeContext(ServletContext servletContext,
                                                ConfigurableWebApplicationContext wac) {
                        System.out.println("Init Plugin");
                        PluginManager pluginManager = PluginManagerFactory.createPluginManager("plugins");
                        pluginManager.init();
            
                            //Prints the MyNewService.print() method  
                            Service service = (Service) pluginManager.getService("service");
                            service.print();                  
                    }
            }
            
             <listener>
                    <listener-class>com.plugin.PluginContextLoaderListener</listener-class>
             </listener>
    Even after I have loaded the jar into the classloader, DefaultService is still being injected as service. Any idea how I get the plugin jar to participate into the spring's DI lifecycle? Or should I avoid going this route at all?
    Last edited by CrystalCracker; Oct 18th, 2011, 10:48 AM.

  • #2
    To put it simply, I have a war file that has a few plugin jars in a plugins directory inside the war. Based on a value from a configuration file that the app looks at, when the app is started, I want to load that particular plugin jar and run the application with it. That way, I can distribute the war to anyone, and they can choose which plugin to run based on a config value without having to to repackage everything. This is the problem I am trying to solve.

    Comment

    Working...
    X