2017-09-02 122 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