springboot

springboot-自动装配-ImportBeanDefini

2020-07-26  本文已影响0人  愤怒的奶牛

本次我们来了解目前为止最后一种自动装配机制编程接口ImportBeanDefinitionRegistrar。

/**
 * 需要被spring 管理的Bean
 */
public class UserService {

    public String getUser() {
        return "ImportBeanDefinitionRegistrar 自动装配。。。";
    }
}
================UserServiceConfig=======================
package com.boot.study.importBeanDefinitionRegistrar;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration 配置类
 */
@Configuration
public class UserServiceConfig {

    @Bean
    public UserService userService () {
        return new UserService();
    }
}

====================MyImportBeanDefinitionRegistrar 重点==========================
package com.boot.study.importBeanDefinitionRegistrar;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * 注册 BeanDefinition
     * @param importingClassMetadata
     * @param registry
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

        String beanName = "userService";
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
        rootBeanDefinition.setBeanClass(UserService.class);
        registry.registerBeanDefinition(beanName, rootBeanDefinition);
    }
}


==================@EnableUserService========================

package com.boot.study.importBeanDefinitionRegistrar;

import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MyImportBeanDefinitionRegistrar.class)
public @interface EnableUserService {
}

package com.example.enabledemo;

import com.boot.study.demo.TestDemo;
import com.boot.study.importBeanDefinitionRegistrar.EnableUserService;
import com.boot.study.importBeanDefinitionRegistrar.UserService;
import com.boot.study.importselecter.EnableDemo;
import com.boot.study.importselecter.ImportSelectorDemo;
import com.example.enabledemo.helloworld.HelloWorld;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@EnableUserService
//@EnableDemo
@RestController
@SpringBootApplication
public class EnableDemoApplication {

//    @Autowired
//    private TestDemo testDemo;
//    //运行时注入
//    @Autowired
//    private ImportSelectorDemo importSelectorDemo;
    //运行时注入
    @Autowired
    private UserService userService;

    public static void main(String[] args) {
        SpringApplication.run(EnableDemoApplication.class, args);
    }

    @GetMapping
    public String hello () {
//        return testDemo.hello();
//        return importSelectorDemo.hello();
        return userService.getUser();
    }
}

运行结果,访问http://127.0.0.1:8080, 返回:ImportBeanDefinitionRegistrar 自动装配。。。

总结:
编程步骤或者说需要提供的类大致和 ImportSelector 接口编程思路是一致的,只是使用的具体的接口不一样,这里使用的加载Bean 定义的接口 ImportBeanDefinitionRegistrar。

现在我们基本就介绍完了springboot 实现自动装配的几种方式,注意,这里是介绍了最简单的编程方式,没有加入 条件装配机制,原因是为了我们能够先知道最简单的方式,然后我们可以在这个基础上再慢慢添加一些复杂的东西。

再了解了如何使用springboot 的自动装配以后,我们可以尝试着分析一下原理,看看springboot是如何做到的,能够加载外部模块的Bean,让spring容器管理。

上一篇 下一篇

猜你喜欢

热点阅读