@Qualifier、@Named、Provider<T>源码翻译

package javax.inject;

import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.Documented;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;

/**
 * 标识@Qualifier注解,任何人都能够定义新的限定符
 * 一个qualifier注解应该满足如下条件:
 *     a. 定义的注解类有@Qualifier,@Retention(RUNTIME)和@Documented
 *     b. 可以有属性
 *     c. 可以是公共API的一部分
 *     d. 可以用@Target注解限定使用范围
 * @author TCM
 * @create 2017年10月19日上午10:31:48
 * @see javax.inject.Named @Named
 */
@Target(ANNOTATION_TYPE)
@Retention(RUNTIME)
@Documented
public @interface Qualifier {}

package javax.inject;

import java.lang.annotation.Retention;
import java.lang.annotation.Documented;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 基于{@linkplain Qualifier qualifier},目的:可以注解有值的bean名(定义bean名称)
 * public class Car {
 *    @Inject @Named("driver") Seat driverSeat;
 *    @Inject @Named("passenger") Seat passengerSeat;
 *    ...
 * }
 * 注意:@Named可以有值,如果没有值生成的Bean名称默认和类名相同。
 * @author TCM
 * @create 2017年10月19日下午3:33:08
 */
@Qualifier
@Documented
@Retention(RUNTIME)
public @interface Named {

    /** 注入的bean名*/
    String value() default "";
}

package javax.inject;
/**
 * 目的:提供实例
 * 通过注入实现获取T实例(泛型)
 * 获取注入实例T,可以使用Provider<T>,或注解注入T,两者有什么区别:
 *    a. Provider<T>可以获取多个实例
 *    b. 实例可以延迟或可选的检索
 *    c. 阻断循环依赖
 *    d. 小范围内查看实例
 * 例如:
 * class Car {
 *    @Inject 
 *    Car(Provider<Seat> seatProvider) {
 *      Seat driver = seatProvider.get();
 *      Seat passenger = seatProvider.get();
 *      ...
 *    }
 * }
 * @author TCM
 * @create 2017年10月19日下午3:38:26
 */
public interface Provider<T> {

    /**
     * 提供构造器,注入一个实例T
     * Provides a fully-constructed and injected instance of {@code T}.
     * @throws RuntimeException 
     */
    T get();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据你提供的代码,出现报错的原因是在 `TaskletContext` 类的 `setTaskletService` 方法中存在多个符合条件的 `TaskletService<T>` bean。 为了解决这个问题,你可以尝试以下几种方法: 1. 使用 `@Qualifier` 注解明确指定要注入的 bean。你可以在 `setTaskletService` 方法上添加 `@Qualifier` 注解,并指定要注入的 bean 的名称,如下所示: ```java @Autowired public void setTaskletService(@Qualifier("adLoanEntity4Tasklet") TaskletService<T> taskletService) { this.taskletService = taskletService; } ``` 在这个示例中,我们使用 `@Qualifier("adLoanEntity4Tasklet")` 来明确指定要注入的是名为 "adLoanEntity4Tasklet" 的 bean。请确保在相应的类上添加了 `@Component("adLoanEntity4Tasklet")` 注解来标识该 bean。 2. 使用 `@Primary` 注解来指定默认的 bean。你可以在实现 `TaskletService<T>` 接口的类上添加 `@Primary` 注解,如下所示: ```java @Component @Primary public class ADLoanEntity4Tasklet implements TaskletService<LoanEntity> { // ... } ``` 在这个示例中,我们使用 `@Primary` 注解来标识 `ADLoanEntity4Tasklet` 类是默认的 bean。当存在多个匹配的 bean 时,Spring 会优先选择带有 `@Primary` 注解的 bean。 3. 手动指定要注入的 bean。你可以直接在 `main` 方法中手动指定要注入的 bean,如下所示: ```java public static void main(String[] args) { // ... // 使用 ADLoanEntity4Tasklet 执行 main.taskletContext.setTaskletService(main.adLoanEntity4Tasklet); // ... // 使用 AFFLoanEntity4Tasklet 执行 main.taskletContext.setTaskletService(main.affLoanEntity4Tasklet); // ... } ``` 在这个示例中,我们手动指定了要注入的 `adLoanEntity4Tasklet` 和 `affLoanEntity4Tasklet` 对象。 请根据你的实际需求选择适合的解决方法,并确保只有一个唯一的 bean 被注入到 `setTaskletService` 方法中。如果问题仍然存在,请提供更多的代码和配置信息,以便我更好地帮助你解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值