Cause: Because two open need to modify the source code, the source framework is Guice, to springboot related need to access each other’s bean objects, etc

1. Access Spring’s utility classes

import com.google.inject.AbstractModule; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.name.Names; import org.apache.log4j.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import org.springframework.web.context.WebApplicationContext; @component Public class GuiceBeanProviderFactory<T> extends AbstractModule implements ApplicationContextAware, BeanFactoryAware { private final Logger log = Logger.getLogger(GuiceBeanProviderFactory.class); protected WebApplicationContext applicationContext; protected static BeanFactory beanFactory; private static BeanFactory getBeanFactory() { return beanFactory; } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (! (applicationContext instanceof WebApplicationContext)) { this.log.warn("Application context is not instance of WebApplicationContext unable to provide Guice registersthrough Spring."); } this.applicationContext = ((WebApplicationContext) applicationContext); } public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } public T get(Class clazz) throws ClassNotFoundException { return (T) injector().getInstance(clazz); } public Provider<T> getNamed(final Class clazz, final String name) { return new Provider() { public Object get() { return GuiceBeanProviderFactory.this.injector().getInstance(Key.get(clazz, Names.named(name))); }}; } @Override protected void configure() { BeanFactory beanFactory = getBeanFactory(); if (beanFactory ! = null) { bind(BeanFactory.class).toInstance(beanFactory); } else this.log.warn("BeanFactory not initialized Spring -> Guice Integration will not function"); } protected Injector injector() { return (Injector) this.applicationContext.getServletContext().getAttribute("guice-injector"); }}Copy the code

2. Access guice’s configuration core (groups use this)

@Component
public class ComposeApplicationRunner implements ApplicationRunner {

    @Autowired
    ApiComposeProperties apiComposeProperties;
    private Injector injector;

    {
        Injector bootstrapInjector = Guice.createInjector(new BootstrapModule());
        ModulesProvider modulesProvider = bootstrapInjector.getInstance(ModulesProvider.class);
        injector = Guice.createInjector(modulesProvider.get());
    }

    @Bean
    public Injector injector(){
        return injector;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
Copy the code

3. Spring injection

import cn.getech.poros.apicompose.service.IComposeService; import com.google.inject.Injector; import com.netflix.conductor.service.WorkflowService; import org.springframework.stereotype.Service; /** * <p> * * </p> * * @author [email protected] * @since 2021/5/31 15:55 */ @Service public class ComposeServiceImpl implements IComposeService { private final WorkflowService workflowService; ComposeServiceImpl(Injector injector){ workflowService = injector.getInstance(WorkflowService.class); } @Override public void getHttpTask() { System.out.println("----------"); }}Copy the code