简单的Spring Java @Configuration到@Autowire而没有@Bean

时间:2019-05-30 08:48:52

标签: java spring configuration autowired

我想在java rest项目中使用spring @Autowired。在最后的日子里,我试图用Java配置来建立一个简单的Spring Java项目,而没有显式的bean配置来检查该功能。但是我无法正常工作。我可能缺少一些基本知识。

到目前为止,我在网络上和在此站点上找不到的任何方法都解决了我的问题。我也找不到我想要达到的目标的样本。这主要是由于在网络上散布着不同的Spring版本和方法。

这是我想出的Java Spring rest示例一样容易的方法。我在解释弹簧注释时添加了一些注释,我也可能在这里犯错:

应用基本类

package restoverflow;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/")
public class App extends Application {

}

配置类

package restoverflow;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration  //this is a configuration class and also found by spring scan
@ComponentScan  //this package and its subpackages are being checked for components and its subtypes
public class AppConfig {

}

一些Pojo

package restoverflow;

public class Pojo {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

服务

package restoverflow;

import org.springframework.stereotype.Service;

@Service //this is a subtype of component and found by the componentscan
public class PojoService {
    public Pojo getPojo(){
        Pojo pojo = new Pojo();
        pojo.setName("pojoName");
        return pojo;
    }
}

最后是应该自动装配服务的资源

package restoverflow;

import javax.ws.rs.GET;

import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/resource")
@Controller //this is a subtype of component and found by the componentscan
public class Resource {

    @Autowired //this tells to automatically instantiate PojoService with a default contructor instance of PojoService
    private PojoService pojoService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Pojo getPojo() {
        return pojoService.getPojo();
    }
}

Pom:

...
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.1.7.RELEASE</version>
</dependency>
...

我希望实例化pojoService。但是我得到了NullPointerException。

2 个答案:

答案 0 :(得分:0)

您似乎正在使用场级注入。

请通过下面的链接了解所有类型的注射剂: https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/

看不到pojoService变为null的任何明确原因。 请检查pojoService bean是否已正确初始化。可能是由于pojoService bean尚未初始化,并且控制器中的null导致的。

答案 1 :(得分:0)

nullpointer代替NoSuchBeanDefinitionException更表明Spring上下文根本没有加载,而不是不正确地加载。

如果您使用的是Spring Boot,请修改主类以初始化Spring:

@SpringBootApplication
@ApplicationPath("/")
public class App extends Application {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

否则(由于pom.xml代码片段未提及Spring引导),请通过初始化ClassPathXmlApplicationContext并将<context:component-scan base-package="restoverflow" />添加到applicationContext.xml中来手动初始化Spring。