需要在一个Java类中创建一个接口的两个对象。
在这段内容中,我们可以看到有关自动装配和搜索的注解,以及创建两个接口对象的问题。在Java类中,如果我们想要创建一个接口的两个对象,我们需要使用自动装配或搜索来实现。
自动装配是一种将一个bean注入到另一个bean中的机制。在这段内容中,我们可以看到两个自动装配的选项:按类型和按名称。按类型是指根据bean的类型来自动装配,而按名称是指根据bean的名称来自动装配。
在这个问题中,我们需要在一个Java类中创建两个接口对象。为了实现这个目标,我们可以使用自动装配或搜索。然而,我们需要注意的是,如果我们选择自动装配,我们需要添加相应的注解。
解决这个问题的方法是在Java类中添加相应的注解。在这段内容中,我们可以看到两种方法:一种是在构造函数中添加注解,另一种是在属性中添加注解。在构造函数中添加注解的方法是在构造函数的参数中添加相应的注解,在属性中添加注解的方法是在属性的声明中添加相应的注解。
如果我们不想添加这两个注解,我们可以使用另一种方法来解决这个问题。在这种方法中,我们可以在属性的声明中添加相应的注解,并使用变量名称来指定要注入的bean的名称。
总结起来,要在一个Java类中创建两个接口对象,我们可以使用自动装配或搜索来实现。如果我们选择自动装配,我们需要在构造函数或属性中添加相应的注解。如果我们不想添加这些注解,我们可以在属性中使用变量名称来指定要注入的bean的名称。
更多关于这个问题的信息可以在链接中找到。
在一个Java类中创建一个接口的两个对象的问题出现的原因是因为在使用Spring框架时,如果存在模糊的bean类型,Spring会要求显式选择bean,并提供限定符。为了解决这个问题,可以使用限定符来明确选择bean。
可以通过在构造函数上使用注解`@Qualifier`来提供限定符。下面是一个示例:
public interface Person {} @Qualifier("staff") public class Staff implements Person {} @Qualifier("employee") public class Manager implements Person {} public class Payroll { private Person person; public Payroll(@Qualifier("employee") Person person){ this.person = person; } }
另外,在Lombok 1.18.4版本中,可以通过使用`@Qualifier`注解来避免构造函数注入时的样板代码,示例如下:
@Qualifier("staff") public class Staff implements Person {} @Qualifier("employee") public class Manager implements Person {} public class Payroll { @Qualifier("employee") private final Person person; }
为了使用新的lombok.config规则`copyableAnnotations`,需要在项目根目录下的lombok.config文件中添加以下内容:
# Copy the Qualifier annotation from the instance variables to the constructor # see https://github.com/rzwitserloot/lombok/issues/745 lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
这个功能最近在最新的lombok 1.18.4版本中引入。
在使用字段注入或setter注入时,需要将`@Qualifier`注解放在字段或setter函数的上方。如果使用构造函数注入,则应将注解放在构造函数上。示例如下:
public class Payroll { @Qualifier("employee") private final Person person; }
或者
public class Payroll { private final Person person; @Qualifier("employee") public void setPerson(Person person) { this.person = person; } }
如果将属性声明为final,setter方法是否起作用?
参考链接:
- [博客文章](https://ath3nd.wordpress.com/2018/12/13/spring-lombok-or-injection-just-became-a-bit-easier-part-2-of-2/)
- [GitHub上的原始问题](https://github.com/rzwitserloot/lombok/issues/745)
- [一个小的GitHub项目以查看示例](https://github.com/lc-nyovchev/lombok-spring-qualifier)
问题的出现原因是在一个Java类中需要创建两个实现同一接口的对象。这时候会出现自动装配冲突的问题。解决方法是使用@Qualifier
注解来解决自动装配冲突。这个注解可以用在任何被@Autowired
注解修饰的类上,或者用在被@Autowired
注解修饰的方法上。此外,这个注解还可以用在构造函数的参数或者方法的参数上。以下是一个示例:
public interface Vehicle { public void start(); public void stop(); } @Qualifier("car") public class Car implements Vehicle { public void start() { System.out.println("Car started"); } public void stop() { System.out.println("Car stopped"); } } @Qualifier("bike") public class Bike implements Vehicle { public void start() { System.out.println("Bike started"); } public void stop() { System.out.println("Bike stopped"); } } public class VehicleService { @Autowired @Qualifier("bike") private Vehicle vehicle; public void service() { vehicle.start(); vehicle.stop(); } }
在上述代码中,VehicleService
类中通过使用@Qualifier
注解将Bike对象注入到vehicle
字段中。如果没有使用@Qualifier
注解,会抛出NoUniqueBeanDefinitionException
异常。
参考:[annotation example](https://adnjavainterview.blogspot.com/2018/01/spring-qualifier-annotation-with-example.html)