项目中常用注解:

@SpringBootApplication

此注解描述的类为springboot项目的启动入口类
记住:
1、springboot项目的启动入口类只能有一个
2、springboot项目的启动入口类需要使用SpringBootApplication注解进行描述

这个类在启动时会做那些事情呢?

1、加载类(将类的信息从磁盘读到内存):线程+IO
2、创建字节码对象(其类型为Class类型)用于存储类的字节码信息
3、基于字节码对象获取类上的注解信息,判定此类是否要交给spring管理
4、假如是交给spring管理的对象,spring框架会创建其对象然后赋予其特性
5、基于配置文件(例如application.properties)以及springboot提供的自动配置对对象进行初始化应用

如何验证启动类在启动时加载了那些类呢?(借助jvm参数进行分析)

类加载过程分析参数:-XX:+TraceClassLoading

在springboot中我们自己的java业务代码写到那里?如何交给spring管理

1、所有业务代码写到启动类所在的包或者子包中
2、将这些类使用特定注解进行描述(例如@Commpent,@Service,@Controlle…)

在springboot中我们自己的java业务测试代码写到那里,有什么特点

所有测试代码写到src/test/java目录中启动类所在的包或子包中
所有测试类使用@SpringBootTest注解进行描述
所有测试方法使用org.junit.jupiter.api.Test

@SpringBootTest

此注解为测试类注解,在springboot项目中的测试类上必须加上次注解
然后在方法上加@Test此test注解导入的包为org.junit.jupiter.api.Test;时springboot
特有的测试包

@Component

此注解描述的时本类交给spring容器bean管理,假如没有起名,默认类名,然后首字母小写

假如下对象为一个池对象,Spring 管理bean对象,会为bean赋予什么特性?这些特性有什么好处?

1、延迟加载(按需加载,懒加载)特性-暂缓对象的创建
优点: 何时需要何时创建 优化资源使用
缺点:用时在创建可能会导致响应速度降低
场景:资源有限,大对象,稀少用,能不创建则不创建
2、作用域(spring框架为对象提供的作用范围,对象的生命周期只能在指定范围有效)
优点:让对象在有效范围发挥作用,尽量控制对象的创建和销毁以实现对象的高效,低耗的运行
缺点:框架底层设计难度会加大,应用不熟练会导致作用域冲突。
场景:不同业务作用域的设计也会不同(例如 对象在整个项目中应用非常频繁可以考虑单利)
实现:在需要设定作用域的类上使用@Scope注解进行描述
@Scope(“singleton”) 单例作用域,此作用域的对象在这个内存只有一份,通过共享设计(bean池),实现对象的可重用性。此对象何时创建由懒加载(Lazy)特性设计决定,是否可以被销毁由spring框架决定(一般是在容器销毁时销毁)。适合频度应用比较高的对象。
@Scope(“prototype”) 多例作用域,此作用域的对象在需要时创建(与懒加载特性无关),
每次从容器获取都是一个新的对象,且这些对象spring框架不负责销毁。适合应用频度比较低的对象
3、生命周期方法(每个对象都有生命周期,但不见得每个对象都会设置生命周期方法)
如何理解生命周期方法?生命周期方法是在对象生命周期过程中要执行的一些方法
设计生命周期方法的目的?对象生命周期的不同阶段执行不同业务(例如servlet 中init,service,destory)
Spring如何设计Bean对象生命周期方法?spring框架中使用相关注解对象对生命周期方法进行描述

@Lazy

此注解表示懒加载

@PostConstruct

此注解描述生命周期初始化方法,在构造方法执行之后执行,用于实现一些资源的初始化

@PreDestroy

此注解描述生命周期销毁方法,在对象销毁之前执行

@Autowired

此注解表示依赖注入

@EnableAsync

此注解表示启动spring框架中的异步操作(底层会创建一个线程池)

@EnableCaching

此注解表示启动缓存配置在需要缓存的方法上加@Cacheable

@Cacheable

此注解表示启用缓存

@Controller

表示控制层交给springboot管理

@Service

表示业务层交给springboot管理

@Mapper

表示数据称交给springboot管理

@Delete@Select@Update@Insert

表示数据库的增删改查操作在注解内加sql语句即可例如@Select(“select * from A where id=#{id}”)

@RequestMapping(“aaa”)

此注解表示请求地址,前端请求路径,此访问路径会传递到DispatcherServlet对象
DispatcherServlet对象基于用户输入的url找到对应的controller及方法
DispatcherServlet底层会通过反射技术调用对应的控制层方法
此注解描述的方法返回值是一个页面或者一个封装类VO

@ResponseBody

此注解在表示返回值类型为字符串类型,在类上加此注解运行时所有方法上都会自动加上该注解

@Slf4j

生成日志对象spring自带的注解

@Data

此注解会自动生成Get Set toString方法,该方法需要安装Lombok以及配置依赖

<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
</dependency>

@NoArgsConstructor

生成无参构造此注解配合@Date使用

@AllArgsConstructor

生成有参构造注解配合@Date使用

@DateTimeFormat

次注解用于描述或set方法,告诉spring mvc按照指定日期格式进行解析例如:
@DateTimeFormat(pattern =“yyyy-MM-dd HH:mm:ss”)
@DateTimeFormat默认是(pattern =“yyyy/MM/dd HH:mm:ss”)格式

@Configuration

注解描述的类为一个配置对象, 此对象也会交给spring管理

@Bean

通常会配置@Configuration注解进行使用,其它特点:
1)此注解描述方法会交给spring管理
2)@Bean注解没有指定其value属性的值,则bean的名字默认为方法名

@RestController

注解等效于@Controller + @ResponseBody

@Aspect

注解描述的类型为Springle AOP中的切面对象类型。此对象中可以封装:
1、切入点(定义在那些目标对象的那些方法上进行功能扩展)
2、通知(封装功能扩展的业务逻辑)

@Pointcut(“bean(sysUserServiceImpl)”)

注解用于定义切入点,具体方式可以基于特定表达式进行实现。例如
1、bean为一种切入点表达式类型
2、sysUserServiceImpl 为spring容易中的一个bean的名字 这里的涵义是当sysUserServiceImpl对象中的任意方法执行时,都由本切面对象的通知方法做功能增强

@Around

由@Around注解描述的方法为一个环绕通知方法,我们可以再次方法内部
手动调用目标方法(通过连接点对象ProceedingJoinPoint的proceed)方法进行调用
环绕通知:此环绕通知使用的切入点为bean(sysUserServiceImpl)
环绕特点:
1、编写:
a)方法的返回值为Object
b)方法参数为ProceedingJoinPoint类型
c)方法抛出异常为throwable
2、应用:
a)目标方法执行之前或之后都可以进行功能拓展
b)相当于其它通知优先级最高
@param jp为一个连接对象(封装了正在要执行的目标方法信息)
@return 目标方法的执行结果

@annotation

为注解的切入点表达式,在这里表示有RequiredCache注解描述的方法为切入点用法如下:
@Pointcut("@annotation(com.cy.pjmon.annotation.RequiredCache)")

@RequiresPermissions

   @RequiresPermissions这个注解的方法为一个切入点方法,此方法在执行之前
   需要进行全线检测,假如用户权限中包含@RequiresPermissions注解value属性指定
   的值,则授权访问,不包含则抛出异常.
   思考:假如你去设计这个切入点对应的通知方法,你会做什么?
   1、目标方法执行之前获取方法上的@RequiresPermissions注解,进而取到注解中内容
   2、将注解中内容提交给SecurityManager对象(此对象赋值授权操作)
   3、SecurityManager会基于realm去查找用户拥有的权限(这个部分我们自己实现)
   4、SecurityManager会判断用户拥有权限中是否包含RequiresPermissions注解中的内容
   5、SecurityManager会基于用户权限进行授权或抛异常.

用法:
@RequiresPermissions(value=“sys:user:valid”)value可以省略

@Transactional

当一个类使用了 @Transactional 注解以后表示类中所有方法都要进行事物控制,类上
使用@Transactional注解用于定义方法上的事物共性,假如还有事物特性,可以在对应
的方法上继续使用@Transactional注解定义事物特性
● timeout:事务的超时时间,默认值为-1,表示没有超时显示。如果配置了具体时间,则超过该时间限制但事务还没有完成,则自动回滚事务。
● read-only:指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
● rollback-for:用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
● no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。
● isolation事务的隔离级别,默认值采用 DEFAULT。

微信公众号:程xu猿

更多推荐

SpringBoot 常用注解含义