[英]Injecting dependencies into @RestController in Spring-Boot using xml configuration
我有基本的 controller
@RestController
public class LoginController {
private RegisterService registerService;
@RequestMapping("/register")
public ResponseEntity registerUser(){
}
}
我想在我的 spring-boot 應用程序中使用 XML 配置進行 bean 定義。 我在用:
@SpringBootApplication
@ImportResource("classpath:/config/context.xml")
public class SplitBillApplication {
public static void main(String[] args) {
SpringApplication.run(SplitBillApplication.class, args);
}
}
但是我如何在這個配置中定義@RestController? 當我只是做
<bean id="loginController" class="com.splitbill.login.controller.LoginController">
<property name="registerService" ref="registerService"/>
</bean>
但是 @RestController 可能確實創建了相同的 bean,所以上面的代碼會拋出關於 bean 已經存在的錯誤。
我不介意由組件掃描或其他東西創建的控制器,但是我想使用 XML 配置創建服務並注入它。 有可能嗎? 或者我如何使用 XML 為 @RestControllers 定義配置?
感謝幫助!
由於@SpringBootApplication
注釋已經為您執行了組件掃描,因此您收到錯誤消息,因此@RestController
注釋的 bean 已經由 spring 構建。
無論如何,為了利用所有 spring mvc 功能,您應該使用注釋驅動的方法,我在談論 spring mvc 的東西。 然后,如果您更願意使用舊的 xml 方式,則可以將您的方法用於服務層,但不能用於 mvc。
在我的工作中,我看到一些能夠在 java 配置中配置 rest controller 的東西,但我不鼓勵這種做法
ps
@RestController 注解定義:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
這個注解是一個原型注解,@SpringBootApplication 加載所有這些 bean。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "nameGenerator"
)
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
如您所見,@SpringBootAnnotation 能夠從帶注釋的應用程序 class 的 package 開始遞歸地進行組件掃描
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.