JDK注解

JDK注解的注解,就5个:
@Override :用来标识重写方法
@Deprecated :标记就表明这个方法已经过时了,但我就要用,别提示我过期
@SuppressWarnings(“deprecation”) 忽略警告
@SafeVarargs : jdk1.7出现,堆污染,不常用
@FunctionallInterface : jdk1.8出现,配合函数式编程拉姆达表达式,不常用

lombok常用注解

@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter :注解在属性上;为属性提供 setting 方法
@Getter :注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor :注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor :注解在类上;为类提供一个全参的构造方法
@Cleanup : 可以关闭流
@Builder : 被注解的类加个构造者模式
@Synchronized : 加个同步锁
@SneakyThrows : 等同于try/catch 捕获异常
@NonNull : 如果给参数加个这个注解 参数为null会抛出空指针异常
@Value : 注解和@Data类似,区别在于它会把所有成员变量默认定义为private final修饰,并且不会生成set方法。
@ToString:自动重写toString方法,和我们平时使用IDEA编辑器自动生成的一样

其他的注解

@ResponseBody:他就不会走视图解析器,会直接返回一个字符串;
【SpringMVC中出现的的】,是配合@Controller使用的。将服务器端的数据转化为JSON返回。
@Controller:控制器,表示被spring所托管,会走视图解析器
@RestController:标注该类的下面,所有方法只会返回字符串。会直接返回json字符串
@Controller与@RestController区别:
@RestController包含了@ResponseBody
@RequestMapping:访问路径映射,规定了浏览器的访问方式
@GetMapping :只允许接收get类型
@PathVariable:通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx”) 绑定到操作方法的入参中。
@Component:spring提供的,用来ioc,表示该类交给Spring管理装配了。
@value(“值”):使用注解注入属性
@Component三个衍生注解【功能一样】

  • @Controller:web层
  • @Service:service层
  • @Repository:dao层

【写上这些注解,就相当于将这个类交给Spring管理装配了!】
@Autowired:是按类型自动转配的,不支持id匹配。

  • 需要导入 spring-aop的包!
  • 依赖注入(DI)时使用,表示由spring把两个对象间的关系依赖注入。
    • 位置:pojo类的成员变量的上一行位置
    • 作用:想用那个类的功能,直接依赖注入。前提:先IOC
    • @Autowired(required=false) 说明: false,对象可以为null;true,对象必须存对象,不能为null。

@Qualifier

  • @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
  • @Qualifier不能单独使用。

@Resource

  • @Resource如有指定的name属性,先按该属性进行byName方式查找装配;
  • 其次再进行默认的byName方式进行装配;
  • 如果以上都不成功,则按byType的方式自动装配。
  • 都不成功,则报异常。

@Autowired与@Resource异同:

  1. @Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
  2. @Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
  3. @Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
  4. 它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

常用AOP注解:
@Aspect:表示是一个切面类:由切点和通知组成
@Pointcut:表示是一个切点
@Pointcut(“execution( cn.tedu.service...*(..))”):切点表达式
@Aspect:表示是一个前置通知
@Aspect:表示是一个切面类
@Before : 表示是一个前置通知
@After : 表示是一个后置通知
@Around: 表示是一个环绕通知
@CrossOrigin:放行js的请求—跨域的解决方案
springbootApplication中的注解
@ComponentScan:扫描当前主启动类同级的包的
@ConfigurationPropertiesScan:扫描包
@Configuration:表示这是一个配置类,被spring所接管配置
【@Configuration(proxyBeanMethods = false)】
@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;
@configurationProperties(prefix=”xxx”):表述的是实体类与配置类的值进行绑定
@EnableConfigurationProperties:自动配置属性

springboot中自动配置的注解

  • @Configuration(proxyBeanMethods = false)
    表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件
  • @EnableConfigurationProperties({ServerProperties.class})
    启动指定类的ConfigurationProperties功能;
    进入这个ServerProperties查看,将配置文件中对应的值和ServerProperties绑定起来;
    并把ServerProperties加入到ioc容器中
  • spring底层@Conditional注解
    根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;
  • @ConditionalOnWebApplication(type = Type.SERVLET)
    这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
  • @ConditionalOnProperty(prefix = “server.servlet.encoding”, value = {“enabled”}, matchIfMissing = true)
    判断配置文件中是否存在某个配置:server.servlet.encoding.enabled;
    如果不存在,判断也是成立的
    即使我们配置文件中不配置server.servlet.encoding.enabled=true,也是默认生效的;

@Conditional作用是按照一定的条件进行判断,满足条件给容器注册bean。
@ConditionalOnMissingBean作用在@bean定义上
@RunWith(SpringRunner.class): 是一个测试启动器,表明Test测试类要使用注入的类,比如@Autowired注入的类,有了@RunWith(SpringRunner.class)这些类才能实例化到spring容器中,自动注入才能生效
@Entity表示使用该注解的实体类自动与数据库中对应的表【类名首字母小写就对应着表名】进行绑定
@GeneratedValue(strategy = GenerationType.IDENTITY设置主键自增。@Id设置主键为ID

Mybatisplus常用注解

1、@Data lombook注解(自动生成get set toString()方法)

  1. @Data
  2. @TableName(value = "user")
  3. public class Account {
  4. private Integer id;
  5. @TableField(value = "name")
  6. private String title;
  7. private Integer age;
  8. }

2、@TableName(value=“user”)
映射数据库的表名,用于实体类和数据库表名称不一致的情况

  1. @TableName(value = "user")
  2. public class Account {
  3. private Integer id;
  4. private String title;
  5. private Integer age;
  6. }

3、@TableField(value=“name”)
映射数据库字段,用于实体类中的成员变量和数据库中的字段名称不一致的情况

  1. public class Account {
  2. private Integer id;
  3. @TableField(value = "name")
  4. private String title;
  5. private Integer age;
  6. }

4、TableID(value=“id”)
专用于映射数据库主键字段

  1. public class Account {
  2. @TableId(value = "id")
  3. private Integer Uid;
  4. @TableField(value = "name")
  5. private String title;
  6. private Integer age;
  7. }

5、TableId(type=””)
用于生成主键id的,有五个常用属性
image.png
(1)NONE,默认的,数据库主键id自增,使用雪花算法实现
image.png
实体类中的主键应设置为long类型,避免生成的主键id长度过长而溢出
(2)input,如果开发者手动赋值,则存入该值,如果开发者没有手动赋值,则数据库通过自增方式给主键赋值
(3)AUTO默认就是数据库自增,开发者无需赋值,如果开发者手动赋值,数据库也不会存入该值
(4)ASSIGN_ID,通过雪花算法自动生成id,生成主键非自增
(5)ASSIGN_UUID,主键类型必须为String类型,雪花算法自动生成
要求数据库字段类型,实体类型必须为String
6、@TableField(exist=false)
默认为true,是否为数据库字段,false,查询时忽略该字段
7、@TableField(slect=false)
默认为true,查询时是否查询该字段
8、@TableField(fill =)

fill表示是否自动填充,将对象存入数据库的时候,由mybatis plus 自动给某些字段赋值,create_time,update_time

(1)给表添加create_time字段,update_time字段
(2)实体类新增两个字段,创建时间和更新时间

  1. @TableField(fill = FieldFill.INSERT)
  2. private Date createTime;
  3. @TableField(fill = FieldFill.INSERT_UPDATE)
  4. private Date updateTime;

(3)创建自动填充处理器

  1. package com.example.mybatisplus.handler;
  2. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  3. import org.apache.ibatis.reflection.MetaObject;
  4. import org.springframework.stereotype.Component;
  5. import java.util.Date;
  6. @Component
  7. public class MyMateObjectHandler implements MetaObjectHandler {
  8. @Override
  9. public void insertFill(MetaObject metaObject) {
  10. this.setFieldValByName("createTime",new Date(),metaObject);
  11. this.setFieldValByName("updateTime",new Date(),metaObject);
  12. }
  13. @Override
  14. public void updateFill(MetaObject metaObject) {
  15. this.setFieldValByName("updateTime",new Date(),metaObject);
  16. }
  17. }

(4)测试类进行测试

  1. @Test
  2. void save(){
  3. User user=new User();
  4. user.setAge(22);
  5. user.setName("费德勒");
  6. mapper.insert(user);
  7. System.out.println(user);
  8. }