SpringBootApplication注解的简要说明
@SpringBootApplication的最核心的三个注解依次如下
-
@SpringBootConfiguration
- 这个注解等同于@Configuration
- 这个注解等同于@Configuration
-
@EnableAutoConfiguration
- 这个注解是springboot中比较核心的注解
-
@ComponentScan
- 这个注解只是单纯扫描自定义类并且将扫描到的类托管至spring容器而已
获取配置文件的内容
@Autowired private Environment env; | env.getProperty("local.ip") | 默认application.properties |
@PropertySource("classpath:jdbc.properties") | @Value("${jdbc.url}") | resources/jdbc.properties |
@ConfigurationProperties(prefix = "tomcat") | private String url; setter/getter method | 默认application.properties 当然二和三可以联合使用 并且必须要和EnableConfigurationProperties联动使用 |
Condition和Conditional配合使用
- 配置Condition类
public class Utf8Condition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String encoding = System.getProperty("file.encoding");
if (!StringUtils.isEmpty(encoding)) {
return encoding.equalsIgnoreCase("utf-8");
}
return false;
}
}
- 使用@Conditional注解配置Condition类
@SpringBootConfiguration
public class EncodeConverConfig {
@Bean
@Conditional(Utf8Condition.class)
public EncodeConvert createUtf8() {
return new Utf8EncodeConvert();
}
@Bean
@Conditional(GbkCondition.class)
public EncodeConvert createGbk() {
return new GbkEncodeConvert();
}
}
@Import【ImportSelector/ImportBeanDefinitionRegistrar】的使用及说明
- 定义ImportSelector实现类
- 定义ImportBeanDefinitionRegistrar的实现类
- 定义配置类 引入上面的实现类
public class MyBeanDefinedRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition("huan11.song.springboot.model.Role");
registry.registerBeanDefinition("role",builder.getBeanDefinition());
}
}
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"huan11.song.springboot.model.User"};
}
}
@SpringBootConfiguration
@Import({MyImportSelector.class, MyBeanDefinedRegister.class})
public class EnableConfig {
}
Enable配合Import使用 例如springboot的封装类【EnableConfigurationProperties】
- 创建业务类 EchoBeanPostProcessor
- 创建Import类 EchoImportSelector 操作业务类(获取注解信息-->装配业务需要的对象)
- 创建注解类 EnableEcho 需要引入Import类
public class EchoBeanPostProcessor implements BeanPostProcessor {
private String[] packages;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
for (String pack : packages) {
if (bean.getClass().getName().startsWith(pack)) {
System.out.println(bean.getClass().getName());
}
}
return bean;
}
public String[] getPackages() {
return packages;
}
public void setPackages(String[] packages) {
this.packages = packages;
}
}
public class EchoImportSelector implements ImportBeanDefinitionRegistrar {
// @Override
// public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// Map<String,Object > map = importingClassMetadata.getAnnotationAttributes(EnableEcho.class.getName());
// String[] packages = (String[])map.get("packages");
// BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(EchoBeanPostProcessor.class);
// builder.addPropertyValue("packages",packages);
// return new String[]{"huan11.song.springboot.dao.impl.EchoBeanPostProcessor"};
// }
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
Map<String,Object > map = importingClassMetadata.getAnnotationAttributes(EnableEcho.class.getName());
String[] packages = (String[])map.get("packages");
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(EchoBeanPostProcessor.class);
builder.addPropertyValue("packages",packages);
// BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition("huan11.song.springboot.model.Role");
registry.registerBeanDefinition("echoBeanPostProcessor",builder.getBeanDefinition());
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Import(EchoImportSelector.class)
public @interface EnableEcho {
String[] packages();
}
@SpringBootConfiguration
@Import({MyImportSelector.class, MyBeanDefinedRegister.class})
@EnableEcho(packages = {"huan11.song.springboot.condition.test1","huan11.song.springboot.condition.test2"})
public class EnableConfig {
}