使用Springboot创建API并了解Beans如何工作时遇到一些麻烦。
我有三个课程,我尽可能地简化了课程;
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的正确方向,那将非常感激。
谢谢!
答案 0 :(得分:0)
ClassA
对象并调用其start
方法。@Bean
注释用于通知spring您要创建一个不属于spring autoscan
机制的类的对象。@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();
}
}