2017-09-02 46 views
1

我正在学习春季,但我不明白我必须填补我的结构......例如,我想要一个队列表,其中每个球队都有一个球员列表。Spring简单示例:在JavaConfig中创建bean的列表?

这是代码,我有我的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?但这种方式我一直同DATAS ......在一个简单的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我将总是得到相同的名字/年龄)?
  • 我在哪里到创建我的列表团队? TeamApplication中的getBean之后?

亲切的问候!

+0

你的意思是你想加载的球队和球员从DB ?!然后展示他们?! –

+0

是的,在这种情况下,从db加载的团队和玩家是豆吗? – Hazlo8

回答

1

我创建GitHub上一个quick example项目。我需要强调的是,这不是一个生产就绪代码,你不应该遵循它的模式,因为我没有重构它,而是相当易懂而且简单。

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

Spring如何知道我的db表结构和数据库表< - > Java对象映射?如果你想坚持你的球队和球员一些数据库,你应该用Spring的注释标记它们。在示例项目中,我将@Entity注释给他们,以便Spring知道它必须存储它们。Spring使用约定而不是配置,所以如果我没有定义任何数据库表名,Spring会从实体类名中生成一些,在这种情况下,PLAYERTEAMTEAM_PLAYERS。我还注释了我想用以下注释存储的Java类字段:

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

Spring如何知道数据库的URL?因为我在maven的pom.xml中导入了H2数据库,Spring将使用它,并且没有任何配置它会将数据存储在内存中(这将在应用程序重新启动之间丢失)。如果你看application.yaml你可以找到DB的配置,而Spring'll也是这样。如果您取消评论行的注释Spring会将您的数据存储在您的主目录下。

Spring如何将这些实体同步到数据库?我已经创建了两个存储库,Spring会使用它们来保存,删除和查找数据。它们是接口(PlayerRepositoryTeamRepository),它们扩展了CrudRepository接口,这使得它们可以在不做任何进一步工作的情况下进行一些基本的CRUD操作。

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

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

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

结论:

  • 我的Spring管理类:

    • @EntityPlayerTeam
    • RepositoryPlayerRepositoryTeamRepository
    • @RestControllerPlayerControllerTeamController
  • 呼叫的流程:User - (HTTP) - >@RestController - >Repository(Entity) - >DB

+0

哇,令人惊叹的答案!:DI需要大量的工作来学习所有这些!谢谢!! – Hazlo8

+0

谢谢!:)我记得当我开始学习Spring和微服务的世界时,感觉和你一样现在,不要担心,时间会更加清晰,加上这些技巧的学习可能会令人兴奋,如果您发现我的答案有帮助,请将其标记为您问题的答案。 –

1

Spring并不是真的用来定义类似于你的Player和Team类的bean,它们基本上是POJO,它们在每种情况下可能都不相同。 Spring beans真正发光的地方在于定义单身人士,这些单身人士将被注入到其他bean或组件(例如控制器,服务或类似组件)中。

也就是说,可以定义不是单例的bean。只要改变bean的范围为原型,像这样:

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

嗨,谢谢...所以在我的例子中,团队和玩家不是春豆吗?如何在Spring应用程序中转换此场景?另外,如果我使用原型,我需要填写我的列表吗? – Hazlo8

+0

这取决于你的用例。每次运行应用程序时,你的团队和玩家总是一样吗?他们是否是其他对象的成员?一般来说,我会说这样的POJO不应该是Spring Beans,但这取决于你想要做什么。 – user1438560

+0

不,我一般我希望团队和运动员都加载数据库数据,问题是,我不明白在哪个方向去:( – Hazlo8