Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring简单示例:在哪里创建JavaConfig中的bean列表?_Java_Spring_Spring Boot_Spring Java Config_Spring Bean - Fatal编程技术网

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

Spring简单示例:在哪里创建JavaConfig中的bean列表?,java,spring,spring-boot,spring-java-config,spring-bean,Java,Spring,Spring Boot,Spring Java Config,Spring Bean,我正在学习Spring,但我不知道我该在哪里填充我的结构。。。例如,我想要一个球队列表,每个球队都有一个球员列表 这是代码,我有我的团队应用程序: @SpringBootApplication public class TeamApplication { public static void main(String[] args) { SpringApplication.run(TeamApplication.class, args); Annotat

我正在学习Spring,但我不知道我该在哪里填充我的结构。。。例如,我想要一个球队列表,每个球队都有一个球员列表

这是代码,我有我的团队应用程序:

@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");
    }

}
然后我创建我的团队:

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);
List l1=新的LinkedList();
l1.添加(p1);
l1.添加(p2);
团队t1=新团队();
t1.设置列表播放器(l1);
列表l2=新的LinkedList();
l2.添加(p3);
团队t2=新团队();
t1.设置列表播放器(l2);
所以。。。春天:

  • 我在哪里可以初始化我的玩家(在赛后我将得到相同的名字/年龄)
  • 我在哪里创建我的列表团队?在TeamApplication中的getBean之后

亲切的问候

Spring并不是用来定义像Player和Team类这样的bean,它们基本上是pojo,在每个实例中可能会有所不同。SpringBean真正的亮点在于定义将注入其他Bean或组件(如控制器、服务或类似组件)的单例

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

@Bean
@Scope("prototype")
public Team team() {
    return new Team();
}
我在GitHub上创建了一个项目。我需要强调的是,这不是一个可用于生产的代码,您不应该遵循它的模式,因为我没有将其重构为美观、易懂和简单的代码

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

Spring是如何知道my db table结构和db table Java对象映射的?如果你想让你的团队和玩家保留一些db,你应该用Spring的注释来标记他们。在示例项目中,我将
@实体
注释放在它们上面,这样Spring就知道它必须存储它们。Spring使用约定而不是配置,因此如果我没有定义任何db表名称,Spring将从实体类名称中生成一些名称,在本例中是
PLAYER
TEAM
TEAM\u PLAYERS
。我还用以下注释注释了我想要存储的Java类字段:

  • @Column
    :此字段将存储在DB列中。没有任何进一步的配置,Spring将生成其列的名称
  • @Id
    @GeneratedValue
    :Spring将自动生成持久化实体的Id,并将其值存储在此注释字段中
  • @OneToMany
    :此注释告诉Spring在两个实体之间创建关系。由于此注释,Spring将创建
    TEAM_PLAYERS
    join表,并在其中存储TEAM player id对
Spring如何知道数据库的URL?当我在maven的pom.xml中导入H2 db时,Spring将使用它,并且在没有任何配置的情况下,它将数据存储在内存中(在应用程序重新启动之间会丢失数据)。如果查看application.yaml,您可以找到DB的配置,Spring也会这样做。如果取消注释注释,Spring会将数据存储在主目录下

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

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

如果您使用maven构建并启动它,并通过curl或导航到page向这些端点发送一些查询,则可以尝试此示例

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

结论:

  • 我的Spring管理课程是:

    • @实体
      玩家
      团队
    • Repository
      PlayerRepository
      TeamRepository
    • @RestController
      PlayerController
      TeamController
  • 调用流程:
    User
    -(HTTP)->
    @RestController
    ->
    存储库(实体)
    ->
    DB


你好,谢谢。。。所以在我的例子中,让团队和玩家不是SpringBean?如何在Spring应用程序中转换此场景?另外,如果我使用原型,我应该在哪里填写我的列表?这取决于您的用例。每次运行应用程序时,您的团队和玩家是否总是相同的?它们是其他对象的成员吗?一般来说,我会说像那样的POJO不应该是SpringBean,但这取决于你正在尝试做什么。不,我一般我希望球队和比赛都加载db数据,问题是我不知道该怎么做:(那么我会说这些不应该是SpringBean。我认为负责加载数据的DAO类可以是bean或组件。嗯,好吧,即使新手很难理解:(,你能给我一些代码示例吗?很好,你是说你会吗
@Bean
@Scope("prototype")
public Team team() {
    return new Team();
}