Spring Boot专栏五:Spring Boot中的注解的解释(一)
本节专栏我们对之前遇到过的注解(主要是上一节专栏中用到的所有注解)做一个解释。具体代码在这里:Spring Boot专栏四:使用Spring Boot的框架,进行数据库的操作
对每一层的注解进行简单的解释
Model类
Model类中主要是lombok依赖下的几个注解,即:
@Data / @AllArgsConstructor / @NoArgsConstructor / @EqualsAndHashCode / @Log4j / @Setter / @Getter,它们主要是为了使得该Model类成为一个POJO类,而不需要我们多去写一些set/get方法。
- @Data:我个人理解为建了一个POJO类,实际上它包含了以下的其他几个注解;
- @AllArgsConstructor:对该类自动生成一个全参构造方法
- @NoArgsConstructor:对该类自动生成一个无参构造方法
- @EqualsAndHashCode:自动生成equals(Object other)和hashCode()方法;
- @Log4j用来获取日志
- @Setter:对该类的一个实例属性自动生成一个Setter方法
- @Getter:对该类的一个实例属性自动生成一个Getter方法
需要注意的是,@Getter注解和@AllArgsConstructor注解在实践中有些问题,接下来我会讲一个小例子,在实践中,等到我们讲完如何在前后端通过JSON字符串传递一个对象时,可以看到问题到底出在哪。
Dao层
Dao层需要写一个接口,和一个XML文件。XML文件中的内容等我们讲JDBC写sql语句时来介绍,本节只讲Dao接口中的注解。
Dao接口中的注解主要就是三个:@Mapper / @Repository(“xxxDao”) / @Param(“xxx”),其中xxxDao是Dao接口的名字。
- @Mapper 是 Mybatis 的注解,和 Spring 没有关系。
在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解; - @Repository 是 Spring 的注解,用于声明一个 Bean.
@Repository注解则是用于基于代码的开发,简单来说就是手写 JDBC。 - @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接口的名字。
- @Service是用来定义业务层Bean的;
- @Autowired注解可以自动注入一个已经存在的Bean类,并生成一个相关的Bean对象。在ServiceImpl实现类中通过该注解引入Dao层对象,在Controller层将通过该注解引入Service层对象。
Controller层
在Controller层,注解就多了,总共有5个:@RestController / @RequestMapping / @Autowired / @RequestMethod / @RequestParam,其中RequestMethod虽然前面一般不带@,但也算作是注解。
- @RestController:该注解相当于@ResponseBody + @Controller合在一起的作用,@ResponseBody注解我们以后会经常遇到,是用来返回json等内容到浏览器页面或前端;@Controller注解加在对应的方法或类上时,视图解析器可以解析return的jsp或html页面,并且跳转到相应页面。
- @RequestMapping:该注解映射URL到控制器类,通过不同的URL将每个功能分配到不同html页面。该注解有多个参数,我们主要用到两个:value和method,value参数即URL的路径,method中可以选择RequestMethod.POST, RequestMethod.GET等,与前端的需求有关,我们在@RequestMethod注解中详细介绍。
- @Autowired:前面已经介绍过,可以自动注入一个已经存在的Bean类,并生成一个相关的Bean对象,在Controller层就是通过该注解注入Service层对象。
- @RequestMethod:其实它并不是一个注解,而是RequestMapping注解中的一个参数。它表示请求输入的类型,和我们获得输入的方法息息相关。我们目前只要用到method = {RequestMethod.GET}就可以了,有关于它的内容,我放到以后的专栏里去专门讲解。
- @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语句