最近看了一下SpringBoot2的课程,发现好多的注解并不是很了解,只是简单的会用,但是真是发生的作用却不知道,最近花了一些时间把这些注解进行了一下整理,针对不同的层级进行了细致的划分,最近几天会依次给大家更新关于注解的内容,对大家有帮助的话点赞支持一下哦!
@Service注解一般写在业务层的接口实现类上,而不是接口上。
@Service : @Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容中。
@Service
public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{
...
}
复制代码
@Service("courseDAOImpl") :这个表示给类命名一个别名,方便注入到其他类中。不加这个参数值的话,默认别名就是当前类名,但是首字母小写。
在实际开发中,我们一般都直接使用 @Sevice
@Scope :Spring IOC 容器中的一个作用域,在 Spring IOC容器中,他用来配置Bean实例的作用域对象。
@Scope的几种作用域:
默认的作用域是:singleton(单实例)
@Reponsitory :@Reponsitory的作用与@Controller,@Service的作用都是把对象交给Spring管理。@Reponsitory是标注在Dao层接口上,作用是将接口的一个实现类交给Spring管理。
注意:
这个 @Repository 完全可以省略不写,也完全可以实现自动注入,但是在IDEA中会存在一个红色的波浪线。原因如下:
@Mapper : 这个注解一般使用在Dao层接口上,相当于一个mapper.xml文件,它的作用就是将接口生成一个动态代理类。加入了@Mapper注解,目的就是为了不再写mapper映射文件。这个注解就是用来映射mapper.xml文件的。
@Mapper使用的原理:
Mybatis 会有一个拦截器,会自动的把 @Mapper 注解的接口生成动态代理类。前提是,映射器(Mapper.xml)必须满足动态代理的条件:
注意:
5.2.1 @Mapper注解和@MapperScan注解的区别
@Mapper注解写在每个Dao接口层的接口类上,@MapperScan注解写在SpringBoot的启动类上。
当我们的一个项目中存在多个Dao层接口的时候,此时我们需要对每个接口类都写上@Mapper注解,非常的麻烦,此时可以使用@MapperScan注解来解决这个问题。让这个接口进行一次性的注入,不需要在写@Mapper注解
@SpringBootApplication
@MapperScan("cn.gyyx.mapper")
// 这个注解可以扫描 cn.gyyx.mapper 这个包下面的所有接口类,可以把这个接口类全部的进行动态代理。
public class WardenApplication {
public static void main(String[] args) {
SpringApplication.run(WardenApplication.class,args);
}
}
复制代码
@Mapper注解相当于是@Reponsitory注解和@MapperScan注解的和,会自动的进行配置加载。
@MapperScan注解多个包,@Mapper只能把当前接口类进行动态代理。
在实际开发中,如何使用@Mapper、@MapperSacn、@Reponsitory注解???
建议:
5.3.1 基本用法
@Select :该注解的目的是为了取代mapper.xml中的select标签,只作用于方法上面。此时就不要在写mapper.xml文件了。
@Select注解的源码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Select
{
String[] value();
}
复制代码
从上述可以看到两点信息:
所以,@Select注解的用法是这样的:
@Select({ "select * from xxx", "select * from yyy" })
Person selectPersonById(Integer id);
复制代码
虽然@Select注解的值是字符数组,但是真正生效的应该是最后那条SQL语句。这一点请大家要留意一下。
5.3.2 @Select注解动态SQL拼写(重点)
普通的字符串值,只能实现变量的替换功能,实现简单的SQL语句,如下所示,
@Select("select * from t_person where id = #{id}")
Person selectPersonById(Integer id);
复制代码
如果要想实现复杂的逻辑判断,则需要使用标签 ,如下所示:
@Select("")
Person selectPersonById(Integer id);
复制代码
其实,标签 注解专用的,其他的注解,例如@Insert、@Update、@Delete等等,都可以使用的。
@Param : 动态代理接口向映射文件中传递参数的时候,会使用@Param注解,并且如果动态代理接口使用了@Param这个注解,那么映射文件中的标签中可以不用写parameterType属性,可以直接接收@Param中传递来的参数值。
先来看一下动态代理接口中是怎样写的,如下图: