本次我们来了解目前为止最后一种自动装配机制编程接口ImportBeanDefinitionRegistrar。
- 工程目录
因为本次演示案例和 ImportSelector 编程接口的思路时一样的,所以工程结构和上次时一样的。 - 案例代码:
/**
* 需要被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容器管理。
网友评论