Spring Boot专栏五:Spring Boot中的注解的解释(一)

本节专栏我们对之前遇到过的注解(主要是上一节专栏中用到的所有注解)做一个解释。具体代码在这里:Spring Boot专栏四:使用Spring Boot的框架,进行数据库的操作

对每一层的注解进行简单的解释

Model类

Model类中主要是lombok依赖下的几个注解,即:
@Data / @AllArgsConstructor / @NoArgsConstructor / @EqualsAndHashCode / @Log4j / @Setter / @Getter,它们主要是为了使得该Model类成为一个POJO类,而不需要我们多去写一些set/get方法。

  1. @Data:我个人理解为建了一个POJO类,实际上它包含了以下的其他几个注解;
  2. @AllArgsConstructor:对该类自动生成一个全参构造方法
  3. @NoArgsConstructor:对该类自动生成一个无参构造方法
  4. @EqualsAndHashCode:自动生成equals(Object other)和hashCode()方法;
  5. @Log4j用来获取日志
  6. @Setter:对该类的一个实例属性自动生成一个Setter方法
  7. @Getter:对该类的一个实例属性自动生成一个Getter方法

需要注意的是,@Getter注解和@AllArgsConstructor注解在实践中有些问题,接下来我会讲一个小例子,在实践中,等到我们讲完如何在前后端通过JSON字符串传递一个对象时,可以看到问题到底出在哪。

Dao层

Dao层需要写一个接口,和一个XML文件。XML文件中的内容等我们讲JDBC写sql语句时来介绍,本节只讲Dao接口中的注解。
Dao接口中的注解主要就是三个:@Mapper / @Repository(“xxxDao”) / @Param(“xxx”),其中xxxDao是Dao接口的名字。

  1. @Mapper 是 Mybatis 的注解,和 Spring 没有关系。
    在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解;
  2. @Repository 是 Spring 的注解,用于声明一个 Bean.
    @Repository注解则是用于基于代码的开发,简单来说就是手写 JDBC。
  3. @Param 后面跟着一个参数,参数是字符串型的,这个参数可以和方法的参数名不同,比如可以这样写:
    List show_user_by_user_name(@Param(“userName”) String user_name);
    如果这样写,那么在xml文件中,数据库访问时,应该这么写
    select user_name, user_password, register_time, login_time
    from user_
    where user_name=#{userName}
    也就是说,@Param注解里的参数和Mapper操作读取数据库有关。后面跟着的这个参数可以称为“别名”

在这里我也提一下,当Dao接口非常多时,可以在所有接口中省略@Mapper注解,直接在启动类DemoApplication.java中加上注解@MapperScan(“com.example.demo.dao”),引号里的内容是dao文件夹的位置,这样也能实现Mybatis 需要找到对应的 mapper的功能,同时也减少了代码量,在我们正式进行项目实战时,我们默认这么操作。

Service层

Service层的接口是没有注解的,注解都是在实现类xxxServiceImple.java中,其中有两个注解:@Service(“xxxService”) / @Autowired,其中xxxService是Service接口的名字。

  1. @Service是用来定义业务层Bean的;
  2. @Autowired注解可以自动注入一个已经存在的Bean类,并生成一个相关的Bean对象。在ServiceImpl实现类中通过该注解引入Dao层对象,在Controller层将通过该注解引入Service层对象。

Controller层

在Controller层,注解就多了,总共有5个:@RestController / @RequestMapping / @Autowired / @RequestMethod / @RequestParam,其中RequestMethod虽然前面一般不带@,但也算作是注解。

  1. @RestController:该注解相当于@ResponseBody + @Controller合在一起的作用,@ResponseBody注解我们以后会经常遇到,是用来返回json等内容到浏览器页面或前端;@Controller注解加在对应的方法或类上时,视图解析器可以解析return的jsp或html页面,并且跳转到相应页面。
  2. @RequestMapping:该注解映射URL到控制器类,通过不同的URL将每个功能分配到不同html页面。该注解有多个参数,我们主要用到两个:value和method,value参数即URL的路径,method中可以选择RequestMethod.POST, RequestMethod.GET等,与前端的需求有关,我们在@RequestMethod注解中详细介绍。
  3. @Autowired:前面已经介绍过,可以自动注入一个已经存在的Bean类,并生成一个相关的Bean对象,在Controller层就是通过该注解注入Service层对象。
  4. @RequestMethod:其实它并不是一个注解,而是RequestMapping注解中的一个参数。它表示请求输入的类型,和我们获得输入的方法息息相关。我们目前只要用到method = {RequestMethod.GET}就可以了,有关于它的内容,我放到以后的专栏里去专门讲解。
  5. @RequestParam:和Dao层的@Param注解一样,也是给java方法的参数一个别名。@Param注解的别名是用到数据库sql语句中,@RequestParam是用到浏览器URL中的,朋友们可以尝试一下,我在这里不给出具体例子了。

具体介绍@Getter注解和@AllArgsConstructor注解的一些实践上的缺陷

这两个注解本身没有问题,它们本来就是为了方便我们编码而产生的,作用和其他的如@Setter注解是类似的。如果某个属性在整个项目中没有用,不存也不取,那么可以使用@Getter来注解,比如专栏第四节中user_id属性;如果某个类用不到全参构造的方法,那么可以使用@AllArgsConstructor来注解。
但是大家还是要注意这两个注解。接下来我来介绍一下什么情况下这两个注解会导致出错。
对于@Getter注解,我不推荐使用,而是推荐自己实现一个get方法的原因,首先,是我们在平时的使用中,往往会去对象中取出某个属性的值。如果只使用@Getter注解而不自己写get方法,是无法通过对象.get某属性方法得到值的;其次,在实践中我发现,当有前端与我们交互时,如果只有@Getter注解,就算构造方法等都是没问题的,可能我们取到的对象的这个属性的值就是为null。以后我们可以通过实例来验证这个现象。
对于@AllArgsConstructor注解,我们可以在专栏第四节的给的代码中做一些小调整,来看看结果有什么变化。
在UserDao.xml中,修改show_user_all对应的sql语句,select的是所有属性:

<select id="show_user_all" resultType="com.example.demo.entity.User">
	select *
	from user_
</select>

此时在浏览器中查看所有的用户信息,报出如下错误:
没有全参构造方法
最直接的提示就是"No constructor found in com.example.demo.entity.User matching…",也就是说User类没有对应的构造方法。
我们再在User.java中添加User类的全参构造方法(严格按照数据库中属性的排列顺序):

public User(int user_id, String user_name, String user_phone, String user_password, double user_wallet, String register_time, String login_time) {
	this.user_id = user_id;
	this.user_name = user_name;
	this.user_phone = user_phone;
	this.user_password = user_password;
	this.user_wallet = user_wallet;
	this.register_time = register_time;
	this.login_time = login_time;
}

再次查询所有用户,成功,并显示所有用户的所有信息:
有全参构造方法
这就告诉我们,如果某个类需要全参构造方法,则需要自己实现,@AllArgsConstructor只是告诉Spring Boot,这是一个POJO类,但是不能真的提供全参构造方法。

Spring Boot注解比较全的博客推荐

我们项目也没有完全写完,现在来把注解全部讲清楚比较难,所以我本节先讲一点,等到项目完全说得差不多了再开一节来讲一些新遇到的注解,大家如果有兴趣,完全可以自行百度、谷歌一些注解。
另外也可以阅读一些博客,这里我推荐我收藏的一个博客:springboot的注解的作用说明(全)。如果大家要针对某一层去看,或者针对某一个注解去看,还是自行百度、谷歌更好些。

谢谢大家的阅读。

专栏第六节已经更新啦,传送门:Spring Boot专栏六:在Dao.xml文件中写Mybatis语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值