Java Can';在Spring Booot中实现控制器的依赖注入

Java Can';在Spring Booot中实现控制器的依赖注入,java,spring-boot,spring-mvc,Java,Spring Boot,Spring Mvc,我是SpringMVC框架的新手,目前正在一个web应用程序中工作,该应用程序使用会话范围的bean来控制一些数据流。 我可以使用@Autowired注释在我的应用程序上下文中访问这些bean,而控制器中没有任何问题。当我在服务层中使用没有任何请求映射(@RequestMapping、@GetMapping或@PostMapping)注释的类时,就会出现问题。 当我尝试直接访问应用程序上下文或使用@Autowired甚至@Resource注释时,bean有一个空值 我有一个配置类,如下所示: @

我是SpringMVC框架的新手,目前正在一个web应用程序中工作,该应用程序使用会话范围的bean来控制一些数据流。 我可以使用@Autowired注释在我的应用程序上下文中访问这些bean,而控制器中没有任何问题。当我在服务层中使用没有任何请求映射(@RequestMapping、@GetMapping或@PostMapping)注释的类时,就会出现问题。 当我尝试直接访问应用程序上下文或使用@Autowired甚至@Resource注释时,bean有一个空值

我有一个配置类,如下所示:

@Configuration
@EnableAspectJAutoProxy
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class, basePackages = "com.quantumx.nitididea.NITIDideaweb.repository")
public class AppConfig implements WebMvcConfigurer {
    
    @Bean (name = "lastTemplate")
    @SessionScope
    public LastTemplate getlastTemplate() {
        return new LastTemplate();
    }
//Some extra code

}
POJO类定义为:

public class LastTemplate {
    
    private Integer lastId;
    
    public LastTemplate(){
        
    }

    public Integer getLastId() {
        return lastId;
    }

    public void setLastId(Integer lastId) {
        this.lastId = lastId;
    }

}
I有一个被注释为服务的测试类,并且没有任何请求映射注释方法:

//@Controller
@Service
public class Test {
    
//   @Autowired
//   private ApplicationContext context;    
    
//  @Autowired
    @Resource(name = "lastTemplate")
    public LastTemplate lastTemplate;
    
//  @Autowired
//  public void setLastTemplate(LastTemplate lastTemplate) {
//      this.lastTemplate = lastTemplate;
//  }

    public Test() {
    }
    
//  @RequestMapping("/test")
    public String testing() {
//      TemplateForma last = (TemplateForma) context.getBean("lastInsertedTemplate");
//      System.out.println(last);
        System.out.println(lastTemplate);
//      System.out.println(context.containsBean("lastTemplate"));
//      System.out.println(context.getBean("lastTemplate"));
        System.out.println("Testing complete");
        return "Exit from testing method";
//      return "/Messages/Success";
    }
}
如您所见,有许多注释代码显示了我尝试访问应用程序上下文的所有方式,包括使用应用程序上下文依赖项、自动连接、声明资源和尝试使用请求映射。如果未使用控制器注释和请求映射方法,则bean为null,并且在使用context getBean()方法时引发java null指针异常

最后,我只是在我应用程序中的控制器中测试我的类:

@RequestMapping("/all")
    public String showAll(Model model) {
        
        Test test = new Test();
        test.testing();

        return "/Administrator/test";
    }
值得一提的是,我还尝试将bean的作用域更改为应用程序作用域和单例,但没有成功。如何在不通过控制器映射请求的情况下访问服务类中的应用程序上下文

值得一提的是,我还尝试将bean的作用域更改为应用程序作用域和单例,但没有成功

在这种情况下,它应该起作用

如何在不通过控制器映射请求的情况下访问服务类中的应用程序上下文

请尝试以下方法之一:-

@Autowired private ApplicationContext-appContext

在要访问接口的类中实现
ApplicationContextAware
接口

编辑:

如果您仍然希望从非spring托管类访问
ApplicationContext
。下面是文章的链接,展示了如何实现这一目标


对我有效的是,必须在应用程序配置声明中删除会话范围的bean,并移动到POJO定义,如下所示:

@Component
@SessionScope    
public class LastTemplate {
    
    private Integer lastId;
    
    public LastTemplate(){
        
    }

    public Integer getLastId() {
        return lastId;
    }

    public void setLastId(Integer lastId) {
        this.lastId = lastId;
    } 
}

我只是使用@Autowired annotation调用bean。

您不能从应用程序范围的bean访问会话范围的bean;在几乎所有情况下,最好将“会话”之类的概念隔离到Web层(控制器),并将任何必要的每请求对象作为参数传递。控制器的会话范围将不是我的方式。您希望控制器和服务是幂等无状态的。您的控制器应注入服务。你是春天的新手。正确处理这件事很重要。你发布的代码让我很困惑。我建议暂时不要参加考试。模拟是进行单元测试的更好方法。