title: Basic AOP program throws BeanCurrentlyInCreationException
body: <p>I am creating a simple AOP program and starting getting <code>BeanCurrentlyInCreationException</code> exception with it.</p>
  
  <p>Here is my code:</p>
  
  <p><strong>MyAspect.java</strong></p>
  
  <pre><code>package aspect;
  
  import org.aspectj.lang.annotation.Aspect;
  import org.aspectj.lang.annotation.Before;
  import org.aspectj.lang.annotation.Pointcut;
  import org.springframework.stereotype.Component;
  
  @Aspect
  //@Component
  public class MyAspect {
  
      @Pointcut("execution(public * *(..))")
      private void anyPublicOperation() {
      }
  
      @Before("anyPublicOperation()")
      private void beforePointCut(){
          System.out.println("Inside before pointcut of MyAspect");
      }
  }
  </code></pre>
  
  <p><strong>Calculator.java</strong></p>
  
  <pre><code>package program;
  
  import org.springframework.stereotype.Component;
  
  @Component
  public class Calculator {
  
      public int add(int i, int j) {
          return i + j;
      }
  }
  </code></pre>
  
  <p><strong>Config.java</strong></p>
  
  <pre><code>import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.ComponentScan;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.context.annotation.EnableAspectJAutoProxy;
  
  import aspect.MyAspect;
  
  
  @Configuration
  //Enable AspectJ auto proxying
  @EnableAspectJAutoProxy
  @ComponentScan(basePackages={"program"})
  public class Config {
  
      //Declare a bean
      @Bean
      public MyAspect aspect() {
          return new MyAspect();
      }
  }
  </code></pre>
  
  <p><strong>App.java</strong> - It contains the main program:</p>
  
  <pre><code>import org.springframework.context.ApplicationContext;
  import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  
  import program.Calculator;
  
  public class App {
      public static void main(String[] args) throws Exception {
  
          ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
  
          System.out.println("=======Calling methods========");
  
          Calculator cal = ctx.getBean(Calculator.class);
          int result = cal.add(10,20);
          System.out.println(result);
      }
  }
  </code></pre>
  
  <p>If I run my program, I am getting this exception:</p>
  
  <pre><code>Aug 13, 2015 2:44:10 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
  INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@17ab5d6d: startup date [Thu Aug 13 14:44:10 IST 2015]; root of context hierarchy
  Aug 13, 2015 2:44:10 PM org.springframework.context.annotation.AnnotationConfigApplicationContext refresh
  WARNING: Exception encountered during context initialization - cancelling refresh attempt
  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'aspect' defined in Config: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [aspect.MyAspect]: Factory method 'aspect' threw exception; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'aspect': Requested bean is currently in creation: Is there an unresolvable circular reference?
      at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1111)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1006)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
      at org.springframework.context.annotation.AnnotationConfigApplicationContext.&lt;init&gt;(AnnotationConfigApplicationContext.java:84)
      at App.main(App.java:10)
  </code></pre>
  
  <p>As per my program I do not have any circular dependency, then what is causing this exception.</p>
  
  <p>Also if I do small changes to my code, then it is working fine. Here are the changes that I have done to make it work:</p>
  
  <p>1) Commented the bean declaration in Config.java code:</p>
  
  <pre><code>@Configuration
  //Enable AspectJ auto proxying
  @EnableAspectJAutoProxy
  @ComponentScan(basePackages={"aspects","program"})
  public class Config {
  
      // bean declaration is removed here and updated basePackages for @ComponentScan
  
  }
  </code></pre>
  
  <p>Enabled <code>@Component</code> annotation on my aspect class like this:</p>
  
  <pre><code>@Aspect
  @Component
  public class MyAspect {
  
      // same as earlier code.
  }
  </code></pre>