Spring简单示例:在JavaConfig中创建bean列表?

时间:2017-09-02 17:19:40

标签: java spring spring-boot spring-java-config spring-bean

我学习Spring但我不明白我必须填写我的结构...例如,我想要一个团队列表,其中每个团队都有一个列表球员。

这是代码,我有我的TeamApplication:

@SpringBootApplication
public class TeamApplication {

    public static void main(String[] args) {
        SpringApplication.run(TeamApplication.class, args);

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        Team team = context.getBean(Team.class);
        Player player = context.getBean(Player.class);
    }
}

然后我有AppConfig:

@Configuration
public class AppConfig {
    @Bean
    public Team team() {
        return new Team();
    }

    @Bean
    public Player player() {
        return new Player();
    }
}

所以玩家是:

public class Player {
    private static final Logger LOG = LoggerFactory.getLogger(Player.class);

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @PostConstruct
    public void init() {
        LOG.info("Player PostConstruct");
    }

    @PreDestroy
    public void destroy() {
        LOG.info("Player PreDestroy");
    }

}

和团队是:

public class Team {
    private static final Logger LOG = LoggerFactory.getLogger(Team.class);

    private String name;
    private List<Player> listPlayer;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Player> getListPlayer() {
        return listPlayer;
    }

    public void setListPlayer(List<Player> listPlayer) {
        this.listPlayer = listPlayer;
    }

    @PostConstruct
    public void init() {
        LOG.info("Team PostConstruct");
    }

    @PreDestroy
    public void destroy() {
        LOG.info("Team PreDestroy");
    }

}

现在: - 我必须填写这些清单?在PostConstruct?但是通过这种方式,我总是拥有相同的数据......在一个简单的Java应用程序中,我首先创建了玩家:

Player p1 = new Player();
p1.setName("A");
p1.setAge(20);
Player p2 = new Player();
p1.setName("B");
p1.setAge(21);
Player p3 = new Player();
p1.setName("C");
p1.setAge(22);

然后我创建我的团队:

List<Person> l1 = new LinkedList<>();
l1.add(p1);
l1.add(p2);
Team t1 = new Team();
t1.setListPlayer(l1);

List<Person> l2 = new LinkedList<>();
l2.add(p3);
Team t2 = new Team();
t1.setListPlayer(l2);

所以...在春天:

  • 我可以在哪里初始化我的玩家(在PostConstruct中我会得到相同的名字/年龄)?
  • 我要在哪里创建我的listTeam ?在TeamApplication中使用getBean后?

亲切的问候!

2 个答案:

答案 0 :(得分:1)

Spring并不是真正用于定义像Player和Team类这样的bean,它们基本上是POJO,在每个实例中可能会有所不同。 Spring bean真正发挥作用的地方在于定义将被注入其他bean或组件的单例,例如Controller,服务或类似的东西。

也就是说,可以定义不是单例的bean。只需将bean的范围更改为原型,如下所示:

@Bean
@Scope("prototype")
public Team team() {
    return new Team();
}

答案 1 :(得分:1)

我在GitHub上创建了一个 quick example 项目。我需要强调的是,这不是一个生产就绪的代码,你不应该遵循它的模式,因为我做了重构而不是很容易理解和简单。

首先,您不必定义一组球队和球员。正如您所说,数据将从数据库加载,因此让用户完成这项工作。 :)相反,您需要定义服务(作为spring bean),其中包含用户执行任务的业务逻辑。

Spring如何知道我的数据库表结构和数据库表&lt; - &gt; Java对象映射?如果你想让你的团队和玩家坚持一些数据库,你应该用Spring的注释标记它们。在示例项目中,我将@Entity注释添加到它们中,以便Spring知道它必须存储它们。 Spring使用约定优于配置,因此如果我没有定义任何db表名,Spring将从实体类名生成一些,在本例中为PLAYERTEAMTEAM_PLAYERS。另外,我使用以下注释注释了我想要存储的Java类字段:

  • @Column:此字段将存储在数据库列中。没有任何进一步的配置,Spring将生成它的名称列。
  • @Id@GeneratedValue:Spring会自动生成持久化实体的ID,并将其存储在此带注释的字段中。
  • @OneToMany:此注释告诉Spring在两个实体之间创建关系。 Spring会因为这个注释而创建TEAM_PLAYERS连接表,并将团队成员ID对存储在其中。

Spring如何知道数据库的URL?当我在maven的pom.xml中导入H2 db时,Spring将使用它,并且没有任何配置它会&#l; ll将数据存储在内存中(在应用程序重启之间会丢失)。如果您查看 application.yaml ,您可以找到数据库的配置,Spring也会这样做。如果您取消注释注释行,Spring会将您的数据存储在您的主目录下。

Spring如何将这些实体同步到数据库?我已创建了两个存储库,Spring将使用它们来保存,删除和查找数据。它们是接口(PlayerRepositoryTeamRepository),它们扩展了CrudRepository接口,为它们提供了一些基本的CRUD操作,而无需进一步的工作。

到目前为止一切顺利,但用户如何使用这些服务?我已通过HTTP端点(PlayerControllerTeamController)发布了这些功能。我将它们标记为@RestController s,因此spring会将一些HTTP查询映射到它们。通过它们,用户可以创建,删除,查找球员和球队,并将球员分配给球队或从球队中移除一名球员。

如果您使用maven构建并启动它,可以尝试此示例,并通过curl或导航到http://localhost:8080/swagger-ui.html页面向这些端点发送一些查询。

我已为此项目完成了更多配置,但这些与您的问题无关。我还没有更深入地解释这个项目,但你可以对我的解决方案进行一些调查,你可以在Spring的网站上找到文档。

<强>结论:

  • 我的Spring托管类是:

    • @EntityPlayerTeam
    • RepositoryPlayerRepositoryTeamRepository
    • @RestControllerPlayerControllerTeamController
  • 通话流程:User - (HTTP) - &gt; @RestController - &gt; Repository(Entity) - &gt; DB