簡體   English   中英

Java Spring應用程序@autowired返回空指針異常

[英]Java Spring application @autowired returns null pointer exception

我對Java Spring IoC相當陌生,這是我的問題

我有一個FactoryConfig類,其中包含所有bean和注釋@Configuration和@ComponentScan,如下所示。

import org.springframwork.*

@Configuration
@ComponentScan(basePackages="package.name")
public class FactoryConfig {

    public FactoryConfig() {

    }

    @Bean
    public Test test(){
         return new Test();
    }

    //And few more @Bean's
}

我的Test類有一個簡單的Print方法

public class Test {

    public void Print() {
        System.out.println("Hello Test");

    }
}

現在,在我的主類中,Ive創建了FactoryConfig的ApplicationContentext。 (我期望工廠配置中的所有@Beans都將被初始化。但是,當我使用@Autowired訪問Test類時,它返回null。

我的主班

public class Main {

     @Autowired
     protected static Test _autoTest;

     public static void main(String[] args) throws InterruptedException {
          // TODO Auto-generated method stub
     ApplicationContext context = 
               new AnnotationConfigApplicationContext(FactoryConfig.class);

     FactoryConfig config = context.getBean(FactoryConfig.class);

     config.test().Print();  

    // _autoTest.Print();   <--- Im getting NULL Pointer Ex here 
   }

}

@Autowire和使用對象/ bean的正確方法是什么? 任何更清晰的解釋將不勝感激。

只有Spring管理的bean才能具有@Autowire注釋。 您的主類不是由Spring管理的:它是由您創建的,並且未在Spring上下文中聲明:Spring對您的類一無所知,並且不會注入該屬性。

您可以使用以下方法在主要方法中訪問Test bean:

context.getBean(Test.class).Print();

通常,您會從上下文中獲得一個“引導程序”,並調用該引導程序來啟動您的應用程序。

此外:

  • 在Java上,方法不應以大寫開頭。 您的Test類應該具有print方法,而不是Print
  • 如果您從Spring開始,則應該嘗試Spring Boot

Spring不管理您的Main類,這就是為什么您得到Nullpointer Exception的原因。 使用ApplicationContext加載bean,您可以像已經做的那樣獲取bean和訪問Methods-

ApplicationContext context = 
           new AnnotationConfigApplicationContext(FactoryConfig.class);

 FactoryConfig config = context.getBean(FactoryConfig.class);

 config.test().Print();  

刪除受保護的靜態參數Test _autoTest;

你的班

public class Test {
    public void Print() {
        System.out.println("Hello Test");
    }
}

對Spring不可見。 嘗試向其添加適當的注釋,例如@Component

原因是您的Main不是由Spring管理的。 將其作為Bean添加到您的配置中:

import org.springframwork.*

@Configuration
@ComponentScan(basePackages="package.name")
public class FactoryConfig {

    public FactoryConfig() {

    }

    @Bean
    public Test test(){
         return new Test();
    }

    @Bean
    public Main main(){
         return new Main();
    }

    //And few more @Bean's
}

然后,您可以按以下方式編輯main()

public class Main {

     @Autowired
     protected Test _autoTest;

     public static void main(String[] args) throws InterruptedException {
         ApplicationContext context = 
               new AnnotationConfigApplicationContext(FactoryConfig.class);

         Test test = context.getBean(Test.class);
         Main main = context.getBean(Main.class);

         test.Print();  
         main._autoTest.Print();
     }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM