首页 > 其他分享 >springboot学习之五(自动配置)

springboot学习之五(自动配置)

时间:2023-04-19 16:14:09浏览次数:41  
标签:springboot Conditional class 自动 User 之五 注解 public name

一、@Conditional源码

springboot的自动配置是通过@Conditional注解(条件判断)实现的.

@Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条件进行判断,把满足判断条件的bean注册到Spring容器。

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
    Class<? extends Condition>[] value();
}

@Conditional只有一个参数,并且这个参数要求是继承与Condition类,并且参数是个数组,也就是可以 传多个的。

Condition类是一个函数式接口(只有一个方法的接口被称为函数式接口)。matches方法就是比较方法,如果为true则注入,如果为false则不注入。

@FunctionalInterface
public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

 

二、@Conditional扩展注解

而除了@Conditional注解外,springboot通过@Conditional注解又扩展了很多注解出来,如下@ConditionalOnBean、@ConditionalOnClass等等…

 

三、@Conditional实战

需求:在spring的IOC容器中有一个User的Bean,先要求

1.导入Jedis坐标后,加载该Bean,没导入,则不加载。

2.将坐标类的判断设置成动态的,可以把Jedis随时当做参数替换成其他坐标。

 ------类似于ConditionalOnClass注解----

只要加了@Conditional注解,这个注解回传一个实现了Condition接口的实现类,这个类里面覆写一个matches方法返回值决定是否执行.

 步骤:

1.写一个自己的注解@Mycondition,加上@Conditional注解,

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention( RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyAnnoCondition.class)
public @interface Mycondition {
    public String [] name() default "";
}
//这样有@Contitional的条件判断,也可以携带自己的属性name[]

2.加的@Conditional注解要实现Condition接口的实现类MyAnnoCondition 

public class MyAnnoCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //context:上下文对象,可以获取环境,IOC容器,classLoader对象
        //metadata:注解元对象,可以获取注解定义的属性值

        //1.获取注解属性值
        Map<String, Object> map = metadata.getAnnotationAttributes(Mycondition.class.getName());
        //System.out.println(map);
        String[] name = (String[]) map.get("name");
        boolean flag = true;

        for (String className : name){
            try {
                Class<?> cls = Class.forName(className);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                flag = false;
            }
        }
        
        return flag;
    }
}

3.写一个User的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
}

4.把User实体类以注解配置@Configuration形式交由IOC容器管理

@Configuration
public class TestConfig {
    @Bean
    @Mycondition( name = "redis.clients.jedis.Jedis" )
    public User user(){
        System.out.println("User");
        return new User();
    }
}

5.现在就实验,pom.xml有无 jedis 坐标,来判断user是否被容器创建

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

springboot 启动main()方法

@SpringBootApplication
public class SpringbootRedisApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringbootRedisApplication.class, args);

        User user = (User) applicationContext.getBean("user");
        System.out.println(user);
    }
}

 

 

 

创建或不创建User,取决于Jedis坐标是否导入.

 

 

 

 

转 :https://blog.csdn.net/weixin_43888891/article/details/127503336

https://blog.csdn.net/baidu_37107022/article/details/88878703/

 

标签:springboot,Conditional,class,自动,User,之五,注解,public,name
From: https://www.cnblogs.com/fps2tao/p/17332804.html

相关文章

  • 漫谈前端自动化测试演进之路及测试工具分析
    作者:京东零售杜兴文随着前端技术的不断发展和应用程序的日益复杂,前端自动化测试也在不断演进。Web前端UI自动化测试发展史可以追溯到2000年,当时最早的Web应用程序越来越复杂,开发人员开始使用自动化测试工具来确保应用程序的正确性和可靠性。在早期,自动化测试是通过使用......
  • 创建idea springboot(spring Initializr项目)需要手动导包)
    用注解@RestController 的时候,报错:找不到符号原来是没有import这个包,复制粘贴 @RestController 的时候,idea并没有自动import这个包,导致找不到,要手动import。手动导入就行了。另外,如果是创建的maven项目,由于main类文件的放置位置不同,也会报错:nested exception is java.lang.I......
  • @SpringBootApplication等四个爆红
    在黑马的上面学习,按步骤做,出现爆红问题,之后尝试过很多方法,后发现没导包。导包后可以 ......
  • Theme——借助github的API来实现主题自动更新
    前言那么借助的是那个api呢?这里是为了方便测试,使用的是tags,如果是正式的那么应该使用releases,这个后面会直接接入主题;内容侧边公告栏<script>asyncfunctionrequest(url='',method='GET',data={},headers={}){letoptions={method:method,......
  • Java SpringBoot 加载 yml 配置文件中字典项
    将字典数据,配置在yml文件中,通过加载yml将数据加载到Map中SpringBoot中yml配置、引用其它yml中的配置。#在配置文件目录(如:resources)下新建application-xxx必须以application开头的yml文件,多个文件用","号分隔,不能换行项目结构文件application.ymlserver:po......
  • 塔猫之ChatPPT 国内一个AI自动生成PPT效率工具【使用后一点想法】
    我有个同事为了肝PPT熬夜到天明,结果第二天就生病了,抵抗力一落千丈啊! 做PPT可真是够折磨人的。我有个同事为了肝PPT熬夜到天明,结果第二天就生病了,抵抗力一落千丈啊!这种情况也真的很常见,毕竟制作一个好的演示文稿需要大量思考、设计、排版和修图等等工序,全程手动操作不仅费时费......
  • 漫谈前端自动化测试演进之路及测试工具分析
    作者:京东零售杜兴文随着前端技术的不断发展和应用程序的日益复杂,前端自动化测试也在不断演进。Web前端UI自动化测试发展史可以追溯到2000年,当时最早的Web应用程序越来越复杂,开发人员开始使用自动化测试工具来确保应用程序的正确性和可靠性。在早期,自动化测试是通过使用脚本......
  • springboot项目 宿舍管理系统 (源码+数据库文件+1w字论文+ppt)
    来了就点个赞再走呗,即将毕业的兄弟有福了文章底部获取源码springboot项目宿舍管理系统(源码+数据库文件+1w字论文+ppt)技术框架:java+springboot+vue+mysql后端框架:SpringBoot、SpringMVC、MyBatisPlus前端界面:vue、BootStrap、jQuery、ajxs系统共分为三种用户系统主要功......
  • springboot
    介绍springboot是spring项目中的一个子工程,前者的实现是基于spring的。springboot的特点:“开箱即用”和“约定大于配置”使用pom配置1)添加父工程依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>......
  • SpringBoot中配置Swagger2
    首先在pom.xml添加springfox-swagger2和springfox-swagger-ui两个依赖,并且spring-boot-starter-parent的版本不能太高,可以设置为2.1.6.RELEASE<!--https://mvnrepository.com/artifact/io.springfox/springfox-swagger2--><dependency> <groupId>io.springfox</groupId>......