elv*_*vis 3 java spring spring-mvc spring-data-jpa spring-boot
我正在学习有关Spring Boot和JPA,Spring Data Rest,H2数据库的知识,并且找到了一个教程。我试图理解它,这是一个简单的例子,但我不明白。为什么没有必要放置@Repository或@Component加入AlienRepo类?
回购对象被注入到AlienController类中,从以前的教程中我知道您需要使用@Component或@Repository。我认为使用此批注是强制性的。
控制器:
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";
}
}
Run Code Online (Sandbox Code Playgroud)
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 + "]";
}
}
Run Code Online (Sandbox Code Playgroud)
dao接口:
package com.dgs.springbootjpa.dao;
import org.springframework.data.repository.CrudRepository;
import com.dgs.springbootjpa.model.Alien;
public interface AlienRepo extends CrudRepository<Alien, Integer> {
}
Run Code Online (Sandbox Code Playgroud)
您可以看到在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;
}
Run Code Online (Sandbox Code Playgroud)
@Component并且@Repository可以用在类上以将它们用作 Spring Bean。然而,AlienRepo它不是一个类,它是一个扩展 Spring Data 接口的接口。Spring Data 不使用注释,它通过扫描类路径并查看接口的层次结构来检测接口,以查看 Spring Data 接口是否已扩展。如果是这种情况,它会在运行时为每个接口创建一个实现,然后将其作为 Spring Bean 添加到应用程序上下文中。这就是为什么您不需要在 Spring Data 接口上添加任何注释。
您是否注意到,CrudRepository具有@NoRepositoryBean批注,并且此批注使CrudRepository成为中间接口。中间接口基本上是为派生的存储库添加常规功能。
如果有任何用@NoRepositoryBeanSpring Data 注释的类在运行时不创建实例。因为它是中间类,所以创建它是为派生类添加功能。
如果您扩展了一个接口,@NoRepositoryBean而您的派生接口则没有@NoRepositoryBean,那么Spring会知道您正在尝试在真正的Repository接口中使用该功能,因此添加@Repository注解很冗长。
编辑:为什么@RequestParam不是强制性的?
从官方文档,你可以看到“控制器方法的参数”表,该表的最后一行说:
任何其他参数:
如果方法参数与以上任何参数都不匹配,则默认情况下,如果它是由BeanUtils#isSimpleProperty确定的简单类型,则将其解析为@RequestParam,否则将其解析为@ModelAttribute。
因此,如果省略了“ Controller Method Argument”的注释,并且您未编写类似@MatrixVariable,@PathVariable或@RequestParam的内容。默认为@RequestParam。
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |