Spring @PostConstruct dependency

Let's say I have this dependency in Spring @Configuration

:

@Bean
public SomeClass someClass(SomeClass1 someClass1, SomeClass2 someClass2, ...) {
  return new SomeClass(someClass1, someClass2, ...);
}

      

Let's say I want to do something in @PostConstruct

that includes a dependency someClass

:

@PostConstruct
public void init() {
  someClass.doSomething();
}

      

This cannot be entered:

@PostConstruct
public void init(SomeClass someClass) {
  someClass.doSomething();
}

      

the reasons:

Caused by: java.lang.IllegalStateException: Lifecycle method annotation requires a no-arg method: ...

      

It cannot be auto-updated in the same configuration like this:

@Autowire
private SomeClass someClass;

@Bean
public SomeClass someClass(SomeClass1 someClass1, SomeClass2 someClass2, ...) {
  return new SomeClass(someClass1, someClass2, ...);
}

      

as this results in:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'globalBus': Requested bean is currently in creation: Is there an unresolvable circular reference?

      

The config can be split (so @Bean

goes to a different config) and @Import

-ed by that, and it works fine. There are probably other solutes. creating a separate initialization bean or so.

Is there a way to do this within one @Configuration

?

Edit

As requested by @SotiriosDelimanolis, sscce for an exception when used @Autowired

:

public class ConfigPostConstructDependenciesPrb {
   public static void main(String[] args) {
      AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
      ctx.getBean(Service.class);
      ctx.close();
   }

   public static class Service {
      private final Dependency dependency;

      public Service(Dependency dependency) {
         this.dependency = dependency;
      }

      public void work() {
         System.out.println(dependency.getNum());
      }

      @Override
      public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append("Service [dependency=");
         sb.append(dependency);
         sb.append("]");
         return sb.toString();
      }
   }

   public static class Dependency {
      private final int num;

      public Dependency(int num) {
         this.num = num;
      }

      public int getNum() {
         return this.num;
      }

      @Override
      public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append("SomeClass1 [num=");
         sb.append(num);
         sb.append("]");
         return sb.toString();
      }
   }

   @Configuration
   public static class BaseConfig {
      @Autowired
      private Service service;

      @Bean
      public Dependency dependency() {
         return new Dependency(42);
      }

      @Bean
      public Service service(Dependency dependency) {
         return new Service(dependency);
      }

      @PostConstruct
      public void init() {
         service.work();
      }
   }

   @Configuration
   @Import(BaseConfig.class)
   public static class Config {
      @Autowired
      private Service service;
   }   
}

      

+3


source to share


1 answer


Try this way:



public class ConfigPostConstructDependenciesPrb  {

    public static void main(String[] args) {
        try {
            AnnotationConfigApplicationContext ctx =
                new AnnotationConfigApplicationContext(BaseConfig.class);

            ctx.registerShutdownHook();
            ctx.getBean(Service.class);
            ctx.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

@Configuration
class BaseConfig {

    @Autowired
    private Service service;

    @Bean
    public Dependency dependency() {
        return new Dependency(42);
    }

    @Bean
    public Service service(Dependency dependency) {
        return new Service(dependency);
    }

    @PostConstruct
    public void init() {
        this.service.work();
    }
}

class Dependency {

    private int num;

    public Dependency() {

    }

    public Dependency(int num) {
        this.num = num;
    }

    public int getNum() {
        return this.num;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("SomeClass1 [num=");
        sb.append(num);
        sb.append("]");
        return sb.toString();
    }
}

class Service {

    private Dependency dependency;

    public Service() {

    }

    public Service(Dependency dependency) {
        this.dependency = dependency;
    }

    public void work() {
        System.out.println(dependency.getNum());
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("Service [dependency=");
        sb.append(dependency);
        sb.append("]");
        return sb.toString();
    }
}

      

0


source







All Articles