gpt4 book ai didi

java - 带有 Spring 注解的 Bean 的多种配置

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:46:31 25 4
gpt4 key购买 nike

在我这里的示例中,我有一个“Hero”bean,它可以与“Weapon”bean 一起注入(inject)。英雄和武器都是原型(prototype)范围的(我们可以有多个英雄,他们不会共享武器)。

我想要的是一个名为“战士”的英雄配置,其中注入(inject)了“剑”武器,以及一个名为“弓箭手”的英雄配置,其中注入(inject)了“弓”武器。然后在我的应用程序中我会调用

context.getBean("Warrior");

每次我都想得到一个新的战士。

我知道如何用 XML 做到这一点,但我想知道是否可以用注释来做到这一点?如果是这样,我该怎么做?我正在使用 Spring 4。

最佳答案

LuiggiMendoza 的评论示例( Autowiring 和限定 setter)

坚持接口(interface)编程的脚本,我们有Hero接口(interface)

public interface Hero {
void killOrBeKilled();
}

我们还将有一个 AbstractHero 抽象类来组合一些常用功能。请注意,我们没有实现 setWeapon 方法。我们将把它留给具体类。

public abstract class AbstractHero implements Hero {
protected Weapon weapon;

public void killOrBeKilled() {
weapon.secretWeaponManeuver();
}

protected abstract void setWeapon(Weapon weapon);
}

这里是 Qualifiers我们会用。请注意,您没有创建自己的限定符。您可以简单地使用 @Qualifer("qualifierName") 进行匹配。我这样做只是因为我可以 :P

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
public @interface BowType { }

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
public @interface SwordType { }

对于Warrior,我们将使用@SwordType 限定符

@Component  
public class Warrior extends AbstractHero {
@SwordType
@Autowired
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
}

对于 Archer,我们将使用 @BowType 限定符

@Component
public class Archer extends AbstractHero {
@BowType
@Autowired
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
}

在我们的Weapons 具体类中,我们还需要使用适当的限定符来注释这些类

public interface Weapon {
void secretWeaponManeuver();
}

@BowType
@Component
public class Bow implements Weapon {
public void secretWeaponManeuver() {
System.out.println("Bow goes Slinnnggggg!");
}
}

@SwordType
@Component
public class Sword implements Weapon {
public void secretWeaponManeuver() {
System.out.println("Sword goes Slassshhhh!");
}
}

当我们运行应用程序时,武器类型将根据我们的限定符正确注入(inject)

@Configuration  
@ComponentScan(basePackages = {"com.stackoverflow.spring.hero"})
public class Config { }

public class Application {
public static void main(String[] args) {
AbstractApplicationContext context =
new AnnotationConfigApplicationContext(Config.class);

Hero warrior = context.getBean(Warrior.class);
warrior.killOrBeKilled();

Hero archer = context.getBean(Archer.class);
archer.killOrBeKilled();

context.close();
}
}

结果

Sword goes Slassshhhh!
Bow goes Slinnnggggg!

附言我忘记了 @Scope("prototype") 注释。

关于java - 带有 Spring 注解的 Bean 的多种配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com