亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當有兩個相同名稱和不同類的 bean 時,如何按名稱獲取正確的 bean

當有兩個相同名稱和不同類的 bean 時,如何按名稱獲取正確的 bean

qq_遁去的一_1 2021-10-20 11:33:58
我有兩個春豆。它們名稱相同,但類別不同。這是bean定義。這是第一個。@Bean(name = "approve_sign_up_project_request|Task_1tm7e53")    public StudentTaskToResponseDataConverter perfectUserProfileVO() {        return studentTaskVO -> {            ResponseVo vo = toResponseVO(studentTaskVO);            vo.setData(new PerfectUserProfileVO());            return vo;        };    }這是第二個@Bean(name = "approve_sign_up_project_request|Task_1tm7e53")    public UserTaskCompleter perfectUserProfile() {        return new UserTaskCompleter() {            @Override            public void validate(Task task, CompleteUserTaskDTO dto) throws RuntimeException {                Long studentId = getStudentId(task);                UserProfileIntegrityValidatedResultDTO results = userService.                        validateTheIntegrityOfUserProfile(studentId);                if (results.getComplete()) {                    //nothing to do for now                }else {                    LOGGER.error("Validated failed cause the student -- {} not yet perfected the profile",                            studentId);                    throw new UserProfileImperfectException("Missing fields are " + results.getMissingFields());                }            }            @Override            public void executeBusinessLogic(Task task, CompleteUserTaskDTO dto) {            }            @Override            public Map<String, Object> getTheVariablesForCompleterUserTask(Task task, CompleteUserTaskDTO dto) {                return null;            }        };    }當我使用下面的代碼來獲取 bean 時,spring 會拋出異常。但我不明白其中的原因。我想當我使用bean名稱和bean類來獲取它時,spring會給我正確的bean。但實際上我錯了,春天沒有給它。這是獲取bean的代碼private UserTaskCompleter getBean(CompleteUserTaskDTO dto) {        String beanName = dto.getProcessDefinitionKey() + "|" + dto.getActivityId();        return applicationContext.getBean(beanName, UserTaskCompleter.class);    }
查看完整描述

2 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

Himly 引用的答案,不會讓 Spring 創建同名的 bean。它實際上阻止它啟動,因為構建應用程序將失敗。

如果多個 bean 被定義為同名,那么稍后定義的 bean 將覆蓋之前定義的 bean。因此,在您的情況下,只有一個名為的 beanapprove_sign_up_project_request|Task_1tm7e53將存在,除非您禁用 bean 定義覆蓋。


查看完整回答
反對 回復 2021-10-20
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

我已經明白原因了。


當定義兩個同名不同類型的bean時。春天會選擇最后一個來壓倒其他的。


就我而言,只有一個名為“approve_sign_up_project_request|Task_1tm7e53”的 bean,類型為 StudentTaskToResponseDataConverter。


當我使用名稱和 UserTaskCompleter 類型來獲取 bean 表單 beanFactory 時

,spring 找不到它,然后 spring 將拋出異常。


如何讓spring創建同名bean?


我從這里找到答案


這是答案的導入部分


您可以在構建 Spring Boot 應用程序時使用初始化程序:


@SpringBootApplication

public class SpringBootApp {


    public static void main(String... args) {

        new SpringApplicationBuilder(SpringBootApp.class)

            .initializers(new ApplicationContextInitializer<GenericApplicationContext>() {

                @Override

                public void initialize(GenericApplicationContext applicationContext) {

                    applicationContext.setAllowBeanDefinitionOverriding(false);

                }

            })

        .run(args);


    }

}

或者使用 java 8:


new SpringApplicationBuilder(SpringBootApp.class)

    .initializers((GenericApplicationContext c) -> c.setAllowBeanDefinitionOverriding(false) )

    .run(args);


查看完整回答
反對 回復 2021-10-20
  • 2 回答
  • 0 關注
  • 424 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號