簡體   English   中英

使用 xml 配置將依賴項注入 Spring-Boot 中的 @RestController

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM