SpringBoot @Been和@Import
@Bean
在启动类中编写
1 2 3 4 5 6 7 8 9 10 11 12
| @SpringBootApplication public class Demo16Application { public static void main(String[] args) { ApplicationContext run = SpringApplication.run(Demo16Application.class, args); LoaderOptions bean = run.getBean(LoaderOptions.class); System.out.println(bean); } @Bean public LoaderOptions getLoaderOptions(){ return new LoaderOptions(); } }
|
在配置类中编写
在启动类包中创建config文件夹接着在创建配置类
1 2 3 4 5 6 7
| @Configuration public class MyConfig { @Bean public LoaderOptions getLoaderOptions(){ return new LoaderOptions(); } }
|
@Import
当启动类中的@ComponentScan找不到配置文件时可以用@Import导入
常规用法
在启动类中添加@Import(MyConfig.class),就可以导入配置类,MyConfig为配置类的名字
配置类中的信息与上文的一致,只是路径发生改变,导致@SpringBootApplication无法找到该配置类
ImportSelector接口
新建SelectImport文件在实现ImportSelector,接着在添加配置类的路径
1 2 3 4 5 6
| public class SelectImport implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.example.config.MyConfig"}; } }
|
启动类中修改@Import中的参数@Import(SelectImport.class)
引入resources中imports文件
在resources文件夹中创建common.imports文件,imports中的信息为配置类的路径,可存放多个配置类
接着将该文件中的信息导入导SelectImport类中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class SelectImport implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { List<String> imports = new ArrayList<>(); InputStream resourceAsStream = SelectImport.class.getClassLoader().getResourceAsStream("common.imports"); BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream)); String line = null; try{ while((line = br.readLine())!= null){ imports.add(line); } }catch (IOException e){ throw new RuntimeException(e); }finally { if (br!=null){ try{ br.close(); }catch (IOException e){ throw new RuntimeException(e); } } } return imports.toArray(new String[0]); } }
|
注册条件
@ConditionalOnProperty
配置文件中存在对应的属性,才声明该bean
prefix为Property文件中的student类,name为student中的属性名
当没有Properties的数据传入该bean就不会将该bean带入ioc容器中
1 2 3 4 5 6 7 8 9
| @Configuration public class MyConfig { @Bean @ConditionalOnProperty(prefix = "student",name={"name","id"}) @ConfigurationProperties(prefix = "student") public Student getStudent(){ return new Student(); } }
|
@ConditionalOnMissingBean
当不存在当前类型的bean时,才声明该bean
当容器中有Teacher时Student不创建,有前后之分
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Configuration public class MyConfig { @Bean public Teacher getTeacher(){ return new Teacher(); } @Bean @ConditionalOnMissingBean(Teacher.class) @ConfigurationProperties(prefix = "student") public Student getStudent(){ return new Student(); } }
|
@ConditionalOnClass
当前环境存在指定的这个类时,才声明该bean
name未指定类的全类名
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class MyConfig { @Bean @ConditionalOnClass(name="org.springframework.web.servlet.DispatcherServlet") public Teacher getTeacher(){ return new Teacher(); } @Bean @ConditionalOnMissingBean(Teacher.class) @ConfigurationProperties(prefix = "student") public Student getStudent(){ return new Student(); } }
|