Springboot,使用Rest Controller从对象访问字段

时间:2018-04-16 05:55:53

标签: java spring-boot

使用Springboot创建API并了解Beans如何工作时遇到一些麻烦。

我有三个课程,我尽可能地简化了课程;

ClassA的

public class ClassA()
{
    private variable neededVar;

    public ClassA()
    {
        //initialise other variables;
    }

    public start()
    {
        /initialise neededVar;
    }

    @Bean
    public variable getNeededVar()
    {
        return neededVar;
    }
}

应用

@SpringBootApplication
public class Application
{
    private static ClassA myClass;

    public static void main( String[] args )
    {
        myClass = new ClassA();
        ClassA.start();

        SpringApplication.run( Application.class, args );
    }
}

控制器

@RestController
public class Controller
{
    @Autowired
    private variable neededVar;

    @RequestMapping( "/temp" )
    public string getVar()
    {
        return neededVar.toString();
    }
}

我的问题是在控制器中,我没有从创建的ClassA对象myClass获取neededVar,我实际上不确定我得到了什么。

我也尝试过这种方式,结果相似。

@SpringBootApplication
public class Application
{
    private static ClassA myClass;
    private static variable myNeededVar;

    @Bean
    public variable getNeededVar()
    {
        return myNeededVar;
    }

    public static void main( String[] args )
    {
        myClass = new ClassA();
        myNeededVar = myClass.getNeededVar();
        ClassA.start();

        SpringApplication.run( Application.class, args );
    }
}

如果有人能指出我从应用程序中实例化的ClassA到我的休息控制器(以及随后我将创建的所有其他人)中获取needVar的正确方向,那将非常感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

  • 春天并没有以你期望的方式运作。您 应该将对象的生命周期委托给spring。即,您无需手动创建ClassA对象并调用其start方法。
  • @Bean注释用于通知spring您要创建一个不属于spring autoscan机制的类的对象。
  • 为了将类对象管理委托给spring,类应该使用@Component注释,或者使用@Controller@Service等其他变体,或者你应该告诉spring如何使用@Bean注释创建该类的对象。

要说明如何使用@Component@Bean,我会将A类标记为组件,并将Variable注入@Bean

 @Component
    public class ClassA()
    {
         /*
          * Notice this autowired annotation. It tells spring to insert Variable object.
          * What you were trying to do with getNeededVar() is done using Autowired annotation
          */
        @Autowired
        private Variable neededVar;

    }

现在告诉spring如何创建Variable对象,因为它没有标记为@Component

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

  // This is how you register non spring components to spring context.
  // so that you can autowire them wherever needed
   @Bean
   public Variable variable() { 
      return new Variable();
   }
}

您的其他控制器代码保持不变。 由于Variable被注册为@Bean课程中的SpringApplication,因此您并非真正需要ClassA。 您可以将其删除。

@RestController
public class Controller
{
    @Autowired
    private Variable neededVar;

    @RequestMapping( "/temp" )
    public string getVar()
    {
        return neededVar.toString();
    }
}