- 首页 > 生活百科 > >
SpringBoot 常用注解的原理和使用( 二 )
ImportBeanDefinitionRegistrar
接口的实现 。@Import
的配置
@Configuration@Import(value = https://www.huyubaike.com/biancheng/{TestA.class, TestB.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})public class ConfigurationTest {}
导入一个普通类
package com.example.ssmpdemo.entity;public class TestA {public void fun(){System.out.println("testA");}}
导入一个配置类
package com.example.ssmpdemo.entity;import org.springframework.context.annotation.Configuration;@Configurationpublic class TestB {public void fun(){System.out.println("testB");}}
通过实现
ImportSelector
接口
import org.springframework.context.annotation.ImportSelector;import org.springframework.core.type.AnnotationMetadata;public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.example.ssmpdemo.entity.TestC"};}}
通过重写
ImportBeanDefinitionRegistrar
的
registerBeanDefinitions
方法 。
import com.example.ssmpdemo.entity.TestD;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 {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {RootBeanDefinition root = new RootBeanDefinition(TestD.class);registry.registerBeanDefinition("testD", root);}}
@ConfigurationProperties
- 支持常见的下划线、中划线和驼峰的转换 。支持对象引导 。比如:
user.friend.name
代表的是user对象中的friend对象中的name - 需要有
set()
方法 - 只添加
@ConfigurationProperties(prefix = "xxx")
并不会生效,需要配合 @Configuration
让容器识别到 。 @EnableConfigurationProperties(value = https://www.huyubaike.com/biancheng/ConfigData.class )
会将value中指定的类注册为Bean,可直接用 @AutoWired
引用 。
- 定义一个类用来记录所有字段 , 并使用
@ConfigurationProperties(prefix = "xxx")
将数据注入到ConfigData
中 。
package com.example.ssmpdemo.entity;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;/** * 用来记录Configuration的数据 * @author wangc */@Data@ConfigurationProperties(value = "https://www.huyubaike.com/biancheng/spring.datasource.druid")public class ConfigData {private String driverClassName;private String url;private String username;private String password;}# 对应的yml文件spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:5506/ssmpdemo?serverTimezone=UTCusername: rootpassword: xxxx
- 使用
@EnableConfigurationProperties(JDBCProperties.class)
将 ConfigData
注册为Bean,并提供给ConfigurationTest
使用。可将ConfigData
作为参数注入到构造函数和普通函数中 。
- 可以用以下方式引用被
@ConfigurationProperties(value = "https://www.huyubaike.com/biancheng/spring.datasource.druid")
修饰的ConfigData
- 可以直接把
ConfigData
当成Bean
使用/*** 可直接被注入*/@Autowiredprivate ConfigData configData;
- 可以用构造函数传入进来
@Data@Configuration@EnableConfigurationProperties(value = https://www.huyubaike.com/biancheng/ConfigData.class )public class ConfigurationTest {private ConfigData configData2;/*** 作为构造函数的参数注入* @param data*/ConfigurationTest(ConfigData data){this.configData2 = data;}
- 也可以作为
@Bean
的方法函数的参数 。只有当前类(ConfigurationTest
)才可/*** 直接作为函数的参数* @param data* @return*/@Bean(name = "configData2")HashMap<String, String> getBean(ConfigData data){return new HashMap<>(0);}
- 可以省略
ConfigData
直接将字段注入到返回结果中 。@Bean@ConfigurationProperties(value = "https://www.huyubaike.com/biancheng/spring.datasource.druid")HashMap<String, String> getBean2(ConfigData data){// 会自动为hashMap赋值,或使用set方法为对象赋值return new HashMap<>();}
EnableConfigurationProperties
注解的内部如下,它导入了一个实现了
ImportBeanDefinitionRegistrar
接口的类 。
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(EnableConfigurationPropertiesRegistrar.class)
推荐阅读
-
2021年瘦西湖夜游 2023瘦西湖夜游有哪些好玩的
-
excel怎么核对两个表格的名字相同 两个excel表快速核对重复名字
-
奥运冠军吴敏霞官宣二胎! 疑 怀胎超4个月,挺孕肚看比赛激动尖叫 ...
-
高速公路快车道停车追尾后谁的责任 死亡 高速公路快车道停车追尾后谁的责任
-
-
北京倡导13日居家办公14日15日居家休息:居家办公细则怎么制定?
-
-
-
笔记本电脑怎么投屏到投影仪,笔记本电脑怎么投屏到电视
-
-
-
彼岸花的花语是什么可以养家里吗 彼岸花的花语是什么,象征了什么??
-
-
-
-
-
-
为什么手机usb连不上电脑 为什么手机usb连不上液晶电视
-
-