springboot中的常用注解
@Mapper和@Repository的区别
@Repository和@Controller、@Service、@Component的作用差不多,都是把对象交给spring管理。@Repository用在持久层的接口上,这个注解是将接口的一个实现类交给spring管理。
@Mapper和@Repository是常用的两个注解,两者都是用在dao上,两者功能差不多,容易混淆,有必要清楚其细微区别;
区别:
@Mapper:是mybatis-plus注解
@Repository:是spring注解
@Mapper= @Repository + @MapperScan(basePackages = "{}")
@Repository需要在Spring中配置扫描包地址,然后生成Dao层的Bean才能被注入到Service层中:如下,在启动类中配置扫描地址:
@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
添加位置:是在Springboot启动类上面添加
@SpringBootApplication //添加启动类注解
@MapperScan("com.xz.springboot.mapper") //配置mapper扫描地址
public class application
{
public static void main(String[] args)
{
SpringApplication.run(application.class,args);
}
}
添加@MapperScan(“com.winter.dao”)注解以后,com.winter.dao包下面的接口类,在编译之后都会生成相应的实现类
3、使用@MapperScan注解多个包
(实际用的时候根据自己的包路径进行修改)
@MapperScan({"com.kfit.demo","com.kfit.user"})
@Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。
也就是@Repository多了一个配置扫描地址的步骤;
补充:
如果在接口上**@Mapper,然后再在 xml中的namespace指向mapper**,那么spring就能动态生成一个Mapper的bean,然后你在serviceImpl中的
@Autowired
pravate XXXMapper xxmapper;
就会被这个bean注进去。
如果在DaoImpl中加了@Repository,那么在spring的扫包机制下,也会生成这个dao的bean,注入你serviceImpl中的
@Autowired
private xxxDao xxxdao;
中去。这个机制就像@controller,@Service什么的一样的。
最后,一般不用@Repository,在spring boot中通常用@Mapper
总结:@Repository需要用@MapperScan扫描包mapper才能注入@Bean
而@Mapper注解相当于@Repository注解+@MapperScan注解,通过xml文件下的namespace命名空间自动注入bean
@PathVariable的作用
@PathVariable是用来赋予请求url中的动态参数,即:将请求URL中的模板变量映射到接口方法的参数上
则请求的URL会带上参数id作为URL的一部分
另:
@ApiImplicitParam(name = "id", value = "记录ID", required = true, paramType="path",dataType = "Integer")
可以设置属性defaultValue:默认值,来设置参数的默认值,即可访问默认URL
和@RequestParam的区别:
@PathVariable和@RequestParam的区别就在于:@RequestParam用来获得静态的URL请求参数;@PathVariable用来获得动态的URL请求入参
@RequestParam
@RequestParam和@PathVariable的区别就在于请求时当前参数是在url路由上还是在请求的body上,例如有下面一段代码:
@RequestMapping(value="", method=RequestMethod.POST)
public String postUser(@RequestParam(value="phoneNum", required=true) String phoneNum ) String userName) {
userService.create(phoneNum, userName);
return "success";
}
这个接口的请求url这样写:http://xxxxx?phoneNum=xxxxxx,也就是说被@RequestParam修饰的参数最后通过key=value的形式放在http请求的Body传过来,对比下上面的@PathVariable就很容易看出两者的区别了。
@responseBody
今天才明白@responseBody和异步ajax的关系:以前听xxx说异步的controller方法都要加注解@responseBody,不然就请求不到方法,我也就记住了,可今天才发现,原来有些异步请求的controller也可以不用@responseBody注解,也是可以请求到对应的方法的。根本原因还是我没有搞明白@responseBody注解的应用场景。
@responseBody的应用场景:
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
而以前说异步请求的controller方法都要有@responseBody注解,是因为那时用的异步都设定了返回数据类型为json,所以必须用@responseBody注解。而有些异步请求返回的jsp,或者是html类型的数据(load()方法请求返回的内容就不是json数据),此时controller映射的方法上就不能适应@responseBody注解了,否则会映射不到请求路径!
@RequsetBody
作用: