spring boot 獲取bean注入bean

SpringContextUtil

public class SpringContextUtil {
    private static ApplicationContext applicationContext;
    //獲取上下文
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    //設(shè)置上下文
    public static void setApplicationContext(ApplicationContext applicationContext) {
        SpringContextUtil.applicationContext = applicationContext;
    }
    //通過名字獲取上下文中的bean
    public static Object getBean(String name){
        return applicationContext.getBean(name);
    }
    //通過類型獲取上下文中的bean
    public static Object getBean(Class<?> requiredType){
        return applicationContext.getBean(requiredType);
    }
}

啟動類

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext app =  SpringApplication.run(Application.class, args);
        SpringContextUtil.setApplicationContext(app);
    }
}

測試bean

@Component
public class TestService {
    public String doService(String contxt){
        System.err.printf(contxt+"hello service");
        return  "hello service";
    }
}

//無注入
public class TestController implements InitializingBean {

    @Autowired
    private TestService testService;

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("我是動態(tài)注冊的你,不是容器啟動的時候注冊的你");
    }

    public String toAction(String content){
        return "-->" +  testService.doService(content);
    }
}

測試

@RestController
public class CallCSBController {

    @GetMapping("/bean")
    public String registerBean() {
        //將applicationContext轉(zhuǎn)換為ConfigurableApplicationContext
        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) SpringContextUtil.getApplicationContext();

        // 獲取bean工廠并轉(zhuǎn)換為DefaultListableBeanFactory
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();

        // 通過BeanDefinitionBuilder創(chuàng)建bean定義
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestController.class);

        // 設(shè)置屬性userService,此屬性引用已經(jīng)定義的bean:userService,這里userService已經(jīng)被spring容器管理了.
//        beanDefinitionBuilder.addPropertyReference("testService", "testService");

        // 注冊bean
        defaultListableBeanFactory.registerBeanDefinition("testController", beanDefinitionBuilder.getRawBeanDefinition());


        TestController userController = (TestController) SpringContextUtil.getBean("testController");

        return userController.toAction("動態(tài)注冊生成調(diào)用");

        //刪除bean.
        //defaultListableBeanFactory.removeBeanDefinition("testService");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容