我学习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);
所以...在春天:
亲切的问候!
答案 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将从实体类名生成一些,在本例中为PLAYER
,TEAM
和TEAM_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将使用它们来保存,删除和查找数据。它们是接口(PlayerRepository
和TeamRepository
),它们扩展了CrudRepository接口,为它们提供了一些基本的CRUD操作,而无需进一步的工作。
到目前为止一切顺利,但用户如何使用这些服务?我已通过HTTP端点(PlayerController
和TeamController
)发布了这些功能。我将它们标记为@RestController
s,因此spring会将一些HTTP查询映射到它们。通过它们,用户可以创建,删除,查找球员和球队,并将球员分配给球队或从球队中移除一名球员。
如果您使用maven构建并启动它,可以尝试此示例,并通过curl或导航到http://localhost:8080/swagger-ui.html页面向这些端点发送一些查询。
我已为此项目完成了更多配置,但这些与您的问题无关。我还没有更深入地解释这个项目,但你可以对我的解决方案进行一些调查,你可以在Spring的网站上找到文档。
<强>结论:强>
我的Spring托管类是:
@Entity
:Player
,Team
Repository
:PlayerRepository
,TeamRepository
@RestController
:PlayerController
,TeamController
通话流程:User
- (HTTP) - &gt; @RestController
- &gt; Repository(Entity)
- &gt; DB