@Autowired注解使用说明

@Autowired & @Qualifier

@Autowired 主要用来自动装配,在容器中找到我们需要的Bean

@Qualifer 则是当一个接口有多个实现类的时候,可以作为条件更精确的找到我们需要的Bean

js 复制代码
public interface PaymentService{
    void processPayment();
}


@Component("creditCardPaymentService")
public class CreditCardPaymentService implements PaymentService{
    @Override
    public void processPayment(){
        System.out.println("Card")
    }
}

public class PaypalPaymentService implements PyamentService{
    @Override
    public void processPayment(){
        System.out.println("Paypal")
    }
}

#使用,如果前面不区分,这里会报错,不知道使用哪一个
@Component
public class Shpping{

    @Autowired
    @Qualifer("creditCardPaymentService")
    private PaymentService paymentService
}

@Autowired的高级使用

当@Autowired注解一个方法,并且该方法的参数是一个接口的时候,Spring会自动收集这个接口的所有实现类

1.Spring的依赖注入,容器会扫描所有已注册的Bean,寻找和目标匹配的实例

2.当Spring遇到Collection,List, Set或者数组类型的依赖时,会自动收集所有匹配该泛型类型的Bean

3.当@Autowired用在方法上,Spring会在创建Bean后调用改方法,自动传入所有匹配的参数

js 复制代码
public interface PaymentProcessor{
    void process()
}

@Component
public class CreditCardProcessor implements PaymentProcessor{
    @Override
    pubic void process(){
    }
}

@Component
public class PaypalProcessor implements PaymentProcessor{
    @Override
    public void processor(){
    }
}

#使用@Autowired方法注入
@Service
public class PaymentService{

    private List<PaymentProcessor> processors;
    
    public void setProcessors(List<PaymentProcessor> processors){
        this.processors = processors;
    }
    
    //xxxxxxxxx

}

@Conditional

@Conditional是Spring Framework中实现条件化配置的核心方式。它允许根据特定的条件来决定是否注册一个Bean.

自定义Conditional

js 复制代码
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.core.env.Environment;


public class MyCustomCondition implements Condition{
    @Override
    public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){
        //从环境变量获取
        Environment env = context.getEnvironment();
        return "true".equals(env.getProperty("myapp.feature.enabled"))
    }
}

可以用在@Bean方法上,@Component类上或者@Configuration类上

js 复制代码
@Configuration
public class AppConfig{
    @Bean
    @Conditional(MyCustomCondition.class)
    public MyService(){
        return new MyService();
    }
}

SpringBoot 衍生注解

1.@ConditionalOnProperty 根据配置决定是否生效

2.@ConditionalOnBean 根据容器中是否存在Bean而生效

3.@ConditionalOnWebApplication 当前应用是否事Web应用而生效

js 复制代码
@Service
@ConditionalOnProperty(
    value = "myapp.feature.enabled",      //属性
    havingValue = "true",                 //属性值
    matchIfMissing = false                //如果属性缺失,是否匹配,false表示缺失不匹配
)
public class MyServiceImpl implements MyService{
    //  只有当myapp.feature.enable=true
}
相关推荐
京东云开发者2 小时前
如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具
后端
会飞的架狗师2 小时前
【MySQL体系】第1篇:从MySQL架构原理到存储的解析
后端·mysql
用户8356290780512 小时前
用Python高效处理Excel数据:Excel数据读取指南
后端·python
IT技术小密圈2 小时前
图解系统设计: 五分钟从单体架构到微服务(上)
后端
mudtools2 小时前
.NET驾驭Word之力:COM组件二次开发全攻略之连接Word与创建你的第一个自动化文档
后端·c#
文心快码BaiduComate2 小时前
“一人即团队”——一句话驱动智能体团队
前端·后端·程序员
bobz9652 小时前
kubeovn with metallb:service externalTraffcLocal
后端
小枫编程2 小时前
Spring Boot 与前端文件上传跨域问题:Multipart、CORS 与网关配置
前端·spring boot·后端
送秋三十五2 小时前
spring源码分析————ListableBeanFactory
java·后端·spring