博客
关于我
SpringBoot零配置,注解大全一:配置类相关注解
阅读量:182 次
发布时间:2019-02-28

本文共 6038 字,大约阅读时间需要 20 分钟。

Spring Boot注解深入解析

1. @Configuration注解

@Configuration注解用于将一个类定义为Spring Boot的IOC容器入口。类中的某个方法如果使用@Bean注解,则该方法返回的对象会被注册为IOC容器中的Bean。需要注意的是,@Configuration注解本身并不影响Bean的注册,它主要是标记作用,配合@Bean注解使用。

@Configurationpublic class MyConfig {    @Bean("person2")    public Person person() {        return new Person();    }}public class MyTest {    @Test    public void test() {        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);        Object obj = context.getBean("person2");        System.out.println(obj.toString());    }}public class Person {    private String name;    private String age;    public Person() {}    public Person(String name, String age) {        this.name = name;        this.age = age;    }    public String getName() { return name; }    public void setName(String name) { this.name = name; }    public String getAge() { return age; }    public void setAge(String age) { this.age = age; }    @Override    public String toString() {        return "Person{" +               "name='" + name + '\'' +               ", age='" + age + '\'' +               '}';    }}

2. @ComponentScan注解

@ComponentScan注解用于启用组件扫描功能,它可以自动发现包路径下所有标有@Component、@Service等注解的类。默认情况下,@ComponentScan会扫描当前类所在包及子包中的所有类。

@ComponentScan(value = "com.example.springbootapp")public class MyConfig {}public class MyTest {    @Test    public void test() {        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);        System.out.println(context.getBeanDefinitionCount());        String[] beanNames = context.getBeanDefinitionNames();        System.out.println(Arrays.toString(beanNames).replaceAll("[|]", "").replaceAll(",", "\n"));    }}

3. @Scope注解

@Scope注解用于定义Bean的作用域。Spring Boot默认的作用域包括:

  • prototype:每次请求都会创建新的实例
  • singleton:只创建一个实例
  • request:每次请求创建一个实例
  • session:每次会话创建一个实例
@Configurationpublic class MyConfig {    @Scope("singleton")    @Bean("person2")    public Person person() {        return new Person();    }}public class MyTest {    @Test    public void test() {        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);        Object obj1 = context.getBean("person2");        Object obj2 = context.getBean("person2");        System.out.println(obj1 == obj2); // 加了@Scope("prototype")表示原型,会重新拷贝    }}

4. @Lazy注解

@Lazy注解用于延迟初始化Bean。与@Lazy配合使用时,Bean在IOC容器初始化时不会立即加载,只有在首次通过context.getBean()获取时,才会进行初始化。

@Configurationpublic class MyConfig {    @Lazy    @Bean    public Person person() {        System.out.println("将对象添加到IOC容器中");        return new Person();    }}public class MyTest {    @Test    public void test() {        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);        System.out.println("IOC容器创建完成");        context.getBean("person");    }}

5. @Conditional注解

@Conditional注解用于根据条件注册Bean。从Spring Boot 4开始引入,通过实现Condition接口,可以根据特定的条件判断来决定是否注册Bean。

@Configurationpublic class MyConfig {    @Conditional(WinConditional.class)    @Bean    public Person jason() {        System.out.println("将jason 添加到容器");        return new Person("jason", "18");    }    @Conditional(LinuxConditional.class)    @Bean    public Person jerry() {        System.out.println("jerry 添加到容器");        return new Person("jerry", "18");    }    @Bean    @Conditional(WinConditional.class)    public Person tom() {        System.out.println("tom 添加到容器");        return new Person("tom", "18");    }}public class LinuxConditional implements Condition {    @Override    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();        Environment environment = conditionContext.getEnvironment();        String osName = environment.getProperty("os.name");        System.out.println(osName);        return osName.contains("Linux");    }}public class WinConditional implements Condition {    @Override    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();        Environment environment = conditionContext.getEnvironment();        String osName = environment.getProperty("os.name");        System.out.println("-----------------------------------------" + osName);        return osName.contains("Win");    }}

6. @Import注解

@Import注解用于导入外部资源,支持导入XML文件、Properties文件、Excel文件等。可以通过指定value属性导入多个Bean。

@Configuration@Import(value = {Cat.class, MyImportSelector.class, MyImportDefinitionRegistrar.class})public class MyConfig {    @Bean    public Person person() {        return new Person();    }    @Bean    public MyFactoryBean monkey() {        return new MyFactoryBean();    }}public class MyFactoryBean implements FactoryBean {    @Override    public Monkey getObject() throws Exception {        return new Monkey();    }    @Override    public Class
getObjectType() { return Monkey.class; } @Override public boolean isSingleton() { return true; }}

7. @Import的多种使用场景

  • 通过@Import注解直接指定Bean

    @Import(value = {MyImportDefinitionRegistrar.class})public class MyConfig {}
  • 通过实现ImportSelector接口

    public class MyImportSelector implements ImportSelector {    @Override    public String[] selectImports(AnnotationMetadata annotationMetadata) {        return new String[]{"com.example.springbootapp.entity.Company", "com.example.springbootapp.entity.Member"};    }}
  • 通过自定义过滤器

    public class MyTypeFilter implements TypeFilter {    @Override    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {        Set
    annotationTypes = metadataReader.getAnnotationTypes(); boolean flag = false; for (String str : annotationTypes) { if (str.contains(Controller.class.getName()) || str.contains(Service.class.getName())) { flag = true; break; } } return flag; }}

通过这些注解的合理组合,可以实现对Spring Boot应用的精细化配置和管理。

转载地址:http://upsn.baihongyu.com/

你可能感兴趣的文章
Linux下的系统监控与性能调优:从入门到精通
查看>>
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
查看>>
localhost:5000在MacOS V12(蒙特利)中不可用
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
Moment.js常见用法总结
查看>>