gpt4 book ai didi

java - 为什么这个 Spring Boot Web 应用程序不需要 @Repository?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:44:18 24 4
gpt4 key购买 nike

我正在学习 Spring Boot 和 JPA、Spring Data Rest、H2 数据库,我找到了一个教程。我试图理解它,这是一个简单的例子,但我不明白。为什么没有必要将 @Repository@Component 放在 AlienRepo 类中?

AlienController类中注入(inject)了repo对象,我从之前的教程中了解到需要使用@Component或者@Repository .我认为必须使用此注释。

Controller :

package com.dgs.springbootjpa.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.dgs.springbootjpa.dao.AlienRepo;
import com.dgs.springbootjpa.model.Alien;

@Controller
public class AlienController {

@Autowired
AlienRepo repo;

@RequestMapping("/")
public String home() {

return "home.jsp";
}

@RequestMapping("/addAlien")
public String addAlien(Alien alien) {

repo.save(alien);
return "home.jsp";
}

}

POJO:

package com.dgs.springbootjpa.model;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Alien {

@Id
private int aid;

private String aname;

public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}

@Override
public String toString() {

return "Alien [aid=" + aid + ", aname=" + aname + "]";
}
}

dao 接口(interface):

package com.dgs.springbootjpa.dao;

import org.springframework.data.repository.CrudRepository;

import com.dgs.springbootjpa.model.Alien;

public interface AlienRepo extends CrudRepository<Alien, Integer> {

}

可以看到AlienRepo界面中没有@Repository@Component,代码运行成功。

谢谢!

更新--------------------------------------------

我想从数据库中获取数据并添加以下代码。我想问你为什么@RequestParam 不是必须的?如果我删除 @RequestParam,应用程序将成功运行。

@RequestMapping("/getAlien")
public ModelAndView addAlien(@RequestParam int aid) {

ModelAndView mv = new ModelAndView("showAlien");
Alien alien = repo.findById(aid).orElse(new Alien());
mv.addObject(alien);
return mv;
}

最佳答案

你注意到了吗,CrudRepository@NoRepositoryBean注释和此注释使 CrudRepository一个中间接口(interface)。一个中间接口(interface)基本上是添加派生存储库的一般功能。

如果使用 @NoRepositoryBean 注释的任何类,Spring Data 不会在运行时创建实例。因为它是中间类,并且创建它是为了为派生类添加功能。

如果您扩展一个具有@NoRepositoryBean 的接口(interface)并且您的派生接口(interface)没有@NoRepositoryBean Spring 知道您正在尝试在您的真实存储库中使用该功能界面如此添加@Repository注释很冗长。


编辑:为什么@RequestParam 不是强制性的?

来自 the official documentation你可以看到“Controller method argument”表,表的最后一行说:

任何其他参数:

If a method argument is not matched to any of the above, by default it is resolved as an @RequestParam if it is a simple type, as determined by BeanUtils#isSimpleProperty, or as an @ModelAttribute otherwise.

因此,如果您省略了“ Controller 方法参数”的注释并且您没有编写类似 @MatrixVariable 的内容, @PathVariable@RequestParam .它默认为 @RequestParam

关于java - 为什么这个 Spring Boot Web 应用程序不需要 @Repository?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51918181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com