Spring注解学习

本文深入解析Spring框架中的关键注解,包括web注解、启动类注解、服务类注解等,涵盖@RequestBody、@RestController、@Valid等,并介绍它们在微服务、缓存、异步任务中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

web注解

@RestController注解

这是一个组合注解,放在类上。该注解组合了@ResponseBody和@Controller,默认了类中所有的方法都包含ResponseBody注解的一种简写形式

@ResponseBody

ResponseBody注解的作用是将controller的方法返回的对象 通过适当的转换器 转换为指定的格式之后,写入到response对象的body区(响应体中),通常用来返回JSON数据。

@RequestMapping注解

该注解是映射请求地址,可放在类上或方法上。当放在一个类上时,代表父路径,调用这个类的方法时,必须在加上父路径才能进行访问。它有六个属性。

    @RequestMapping(value = {"/modifyGet.do","/modifyGet1.do"}, method={RequestMethod.POST, RequestMethod.GET},consumes={"application/json"}, produces={"application/json;charset = utf-8"}, params={"name=mike","pwd=123456"},headers={"a=1"}) 

1.value和method
value值:设置请求路径
method值:设置请求的类型。如:RequestMethod.POST,RequestMethod.GET
2.consumes和produces
consumes:设置处理请求内容的提交形式。例如:application/json, text/html。application/json是序列化后的 JSON 字符串。
produces:设置处理请求后返回内容的形式。charset:设置返回值的编码格式
3.params和headers
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

@PostMapping与GetMapping

区别:
PostMapping处理post请求,GetMapping处理get请求。两者都有六大属性

@Valid注解

该注解用于校验。
1.首先在实体类的相应的属性前增加校验条件,有如下校验条件注解
@Null(message = “不能为空”)可使用其属性message.
限制只能为null

@NotNull
限制必须不为null

@AssertFalse
限制必须为false

@AssertTrue
限制必须为true

@DecimalMax(value)
限制必须为一个不大于指定值的数字

@DecimalMin(value)
限制必须为一个不小于指定值的数字

@Digits(integer,fraction)
限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction

@Future
限制必须是一个将来的日期

@Max(value)
限制必须为一个不大于指定值的数字

@Min(value)
限制必须为一个不小于指定值的数字

@Past
限制必须是一个过去的日期

@Pattern(value)
限制必须符合指定的正则表达式

@Size(max,min)
限制字符长度必须在min到max之间

@Past
验证注解的元素值(日期类型)比当前时间早

@NotEmpty
验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@NotBlank
验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格

@Email
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
2.在要校验的方法参数前增加@Valid

    @Min(value = 18,message = "年龄不合法")
    private Integer age;
	
	//controller层增加@valid注解对需校验的方法参数进行校验
    @PostMapping("/users")
    public User addUser(@RequestBody @Valid User user, BindingResult bindingResult) {
        if(bindingResult.hasErrors()){
            System.out.println(bindingResult.getFieldError().getDefaultMessage());
            return null;
        }
        return userResposity.save(user);
    }
@requestbody和@requestparam注解

区别:
1、@RequestBody作用:
主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据);
2、@RequestParam作用:
将请求参数绑定到你控制器的方法参数上
3、GET请求无请求体,若处理GET请求时,只能使用@RequestParam注解接收参数
4、feign消费服务时,如果参数前什么也不写,那么会被默认是@RequestBody的

@Feignclient注解实现微服务项目之间的模块调用

注解的七大特性
1、name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
2、url: url一般用于调试,可以手动指定@FeignClient调用的地址。如指定特定地址:localhost:3306(IP:端口)
3、decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
4、configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
5、fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
6、fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
7、path: 定义当前FeignClient的统一前缀

@Component
@FeignClient(value = "service-a",fallback = ServiceA.class) //这里的name对应调用服务模块名,fallback属性为当调用失败时,返回的逻辑
public interface ServiceAFeignClient {
 		//对应的实际业务控制层的路径
    @RequestMapping(value = "/hi")
    String hi(@RequestParam("id") String id);
 
}


//模块之间调用的熔断处理
@Component
public class FeignClientStudyImpl implements FeignClientStudy {

    @Override
    public String uplmodularCommonQuery(Map requestMap) {
        throw new Exception("熔断处理");
    }
}
@ModelAttribute注解

此注解修饰参数,用于接受前端提交的表单请求。可将表单的请求参数映射成一个对象

@RequestMapping("/updateUser")
public String testModelAttribute(@ModelAttribute User user) { 
    System.out.println("控制器中处理请求的方法:修改用户:"+user);
     return "success";
@RequestHeader

用于将Web请求头中的数据映射到控制器处理方法的参数中。注解的属性
1、name
使用指定的key将入参封装至请求头中
2、value
将请求头中指定的key值参数拿出来
3、required
请求头中是否必须包含指定的值,默认值为true。
4、defaultValue
请求头变量绑定失败时的默认值,指定默认值后,会隐式的将required设置为false。

@JSONField 格式化前端展示字段
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date fixDate;

该字段若展示前端时,会显示format中的格式(format的格式可定制)。若不使用该注解,该字段展示前端时,会展示时间戳

@JsonFormat 格式化前端展示字段
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date fixDate;

启动类注解

@SpringBootApplication(SanBasePackages = {“.com”})注解

此注解等价于@Configuration、@EableAutoConfiguration、@ComponentScan(此@ComponentScan注解是扫描类,识别注解,@ComponentScan默认会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。)
这个注解有个属性SanBasePackages = {},注明扫描哪些包。

@EnableApolloConfig({“application”})

将阿波罗的配置读取至本地

@EnableCaching注解

注解驱动的缓存管理功能

@EnableFeignClients注解

当我们要使用feign客户端
注解使用

@EnableDiscoveryClient

作用:
1、可以获取服务信息
2、用于向consul或者zookeeper作为注册中心的时候提供注册服务(就是提供注册服务的,不需要过多演示)

@EnableAsync

识别@Async注解

@MapperScan(basePackages)注解

此注解识别@mapper注解,mapper层类加上@mapper的注解

@RefreshScope注解

此注解放置类上,作用热部署注解,可以不重新启动项目完成更新配置操作

@configuration注解

1.@Configuration用于定义配置类,可替换xml配置文件,作为全局使用
2.@Configuration启动容器+@Bean注册Bean。向Spring容器中注入对象

@EnableApolloConfig

示例:表示读取阿波罗上application和common.djss的配置文件

@configuration
@EnableApolloConfig ({"application","COMMON.djss"})
public class DrpConfig {

}

读取Apollo上的配置,配合@Configuration注解一起使用

@AnnotationConfigApplicationContext注解
@ApolloConfigChangeListener注解

监听阿波罗配置的变化

 @AplloConfigChangeListener
    private void onChange(ConfigChangeEvent changeEvent){
        try {
            for (String key : changeEvent.changedKeys()){
                Logger.info("apollo changed threadNum");
                if ("sec.report.threadNum".equals(key)){
                    //当apollo中sec.report.threadNum发生变化时,编写业务代码
                }
            }
        } catch (Exception e){
            Logger.error("监听apollo异常");

        }
    }

@EnableFeignClients
EnableFeignClients使用简介

服务类注解

@Transactional(rollbackFor=Exception.class)注解

此注解只能应用到 public 可见度的方法或类上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。对项目的方法或类中,发生异常时,事务进行回滚操作。其中rollbackFor=Exception.class属性,可以让事物在遇到非运行时异常时也回滚。否则只能在遇到运行时异常才能回滚。

@PostConstruct注解

示例

private Map<String,String> sendContentMap = new HashMap();

@PostConstruct
public void init(){
	String name = "张三";
	String sex  = "男";
	String age = "28"; 
	sendContentMap.put("age",age);
	sendContentMap.put("sex",sex);
	sendContentMap.put("name",name);
}

该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。完成一个类的初始化操作

@Retryable注解(重试机制)

@Retryable注解
被注解的方法发生异常时会重试
value:指定发生的异常进行重试
include:和value一样,默认空,当exclude也为空时,所有异常都重试
exclude:指定异常不重试,默认空,当include也为空时,所有异常都重试
maxAttemps:重试次数,默认3
backoff:重试补偿机制,默认没有
此外启动类上,须加上启动重试机制的注解@EnableRetry

@Retention(元注解)

链接: 参考网址.

@Async注解

Spring为任务调度与异步方法执行提供了注解支持。通过在方法上设置@Async注解,可使得方法被异步调用。也就是说调用者会在调用时立即返回,而被调用方法的实际执行是交给Spring的TaskExecutor来完成。一般与定时任务配合使用。@Async注解的value属性是线程池对象。
如@Async(“scheduledAsyncPoolTaskExecutor”),后面的value值是从Spring容器中取出对应的名字的线程池对象。
此外,启动类须加上@EnableAsync。

@Scheduled注解

定时任务注解,表示此方法按Cron表达式定时执行。
如@Scheduled(cron=“${back.up.repay.record:0 0 4 ? * SUN}”)。表示优先从配置中取得cron表达式,若配置取值不成功,则按冒号后的表达式定时进行。
corn表达式符号依次表示:秒、分钟、小时、日期、月份、星期、年(可选),注意定时任务都是异步执行,试想谁也不可能主线程一直跑定时任务。
则实例中,表达式的含义为每个月每周的星期日的凌晨4点钟执行方法。

@Qualifer注解

作用同@Bean注解

@ConditionalOnExpression注解

此注解表示只能在属性为true的情况下,才能实例化Bean对象
实例:

@ConditionalOnExpression(“${phcsp.enable.ss.redis:false}”)  //默认从配置中取值,当取值失败则按false处理
@Bean
@autowired注解(required属性)

参考@autowired的四种模式

一、required属性,当值为false时,可以保证其当注入失败时。程序不会报错
二、autowired注解可对构造器的入参进行初始化

如图所示。所有实现ProducerFields接口的Beans都被初始化

@Component
public class FieldSupportFactory {

    private final static Map<String,Object> strategyMap = new ConcurrentHashMap<>();

    @Autowired
    public FieldSupportFactory(List<ProducerFields> paraList){
        /**
         * 清空map里面的内容,@Autowired对构造器的入参进行初始化
         */
        this.strategyMap.clear();
        for (String s : paraList) {
            strategyMap.put(s,s);
        }

    }

}
@configurationproperties注解

此注解可以获取配置文件的参数值
configurationproperties注解

@slf4j注解

使用说明

lombok注解

@Data注解

加上此注解,不需要再写get和set方法

@AllArgsConstructor
@NoArgsConstructor

在这里插入图片描述

@Builder注解

可使用链式进行创建对象
在这里插入图片描述

@Accessors注解

1 、fluent 属性
2、chain 属性
3、prefix 属性
Accessors注解使用说明

@ToString注解

不需要再重写toString方法

@ConditionalOnBean(name=“redisTemplate”)注解

表示当redisTemplate存在时,该注解的bean对象才能生成成功。

Spring的打桩测试

@SpringBootTest注解

运用测试类上,以便加载运行环境

@SpringBootTest(classes = LingyuanSteelApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//括号处的可加可不加
@RunWith(SpringRunner.class)
class SrbFileServiceImplTest {
@MockBean注解

使用此注解注入的类,表明类中的所有方法都使用自定义返回的值,这样在测试的时候就不会真的去调用远程接口,而是返回一个我们预设的值

@MockBean
protected AirTicketBuyDataServiceFeignClient buyDataServiceFeignClient;

@Test
public void addComsumptions() {
	String json = "{\"buyOrderExtendBo\":{\"keyId\":\"1910081525037263066XXXX182\",\"orderId\":\"191008152448182781\",\"sellOrderId\":\"191008152447001294\",\"bookOffice\":\"\",\"outTicketOffice\":\"\",\"outTicketAccount\":\"18683561923\",\"outTicketPayAccount\":\"\",\"itineraryDispatchTypeID\":0,\"itineraryDispatchTypeName\":\"无行程单\",\"itineraryExpressMoney\":0.00,\"recipientName\":\"\",\"postAddress\":\"\",\"recipientPhoneNum\":\"\",\"itineryCreateState\":0,\"itineryCreateStateDes\":\"不需要\",\"itineryFailReason\":\"\",\"itineryOrderId\":\"\",\"key1\":\"0\",\"key2\":\"\",\"key3\":\"\",\"key4\":\"\",\"key5\":\"\",\"key6\":0,\"key7\":0,\"key8\":\"2019-10-08 15:25:04\",\"key9\":\"2019-10-08 15:25:04\",\"key10\":\"2019-10-08 15:25:04\",\"addTime\":\"2019-10-08 15:25:04\",\"isDelete\":0,\"outPayType\":0,\"outPayAccount\":\"\",\"outPayTradeNo\":\"\",\"outPayBillNo\":\"\"},\"buyOrderInfoBo\":{\"keyID\":\"1910081525036229769XXXX182\",\"orderId\":\"191008152448182781\",\"sellOrderId\":\"191008152447001294\",\"tMCNo\":\"20160426135933567151\",\"tMCName\":\"小霞TMC0\",\"corpNo\":\"20160712160619032240\",\"corpName\":\"锦茵TMC\",\"serviceProviderID\":\"20180702000000000002\",\"serviceProviderName\":\"官网产品001\",\"supplyId\":\"20190730194131772844\",\"supplyName\":\"官网产品001\",\"orderType\":0,\"orderTypeName\":\"普通订单\",\"ticketType\":0,\"voyageType\":0,\"voyageTypeName\":\"单程\",\"voyageLeg\":\"银川-中卫\",\"voyageLegEn\":\"\",\"flightNos\":\"JR1509\",\"passengerCount\":1,\"passengers\":\"池鱼\",\"passengerType\":0,\"takeOffTime\":\"2019-10-23 08:00:00\",\"pNR\":\"\",\"bigPNR\":\"\",\"newPnr\":\"\",\"newBigPnr\":\"\",\"bookingSource\":2,\"bookingSourceName\":\"IOS\",\"orderDisplayID\":0,\"orderDisplayName\":\"创单失败\",\"orderChildDisplayID\":0,\"orderChildDisplayName\":\"\",\"orderFlag\":0,\"chanelId\":\"20\",\"chanelName\":\"QUNAR\",\"chanelOrderId\":\"D19297165242003581\",\"failReason\":\"占座失败\",\"ticketTotalMoney\":50.00,\"airraxTotalMoney\":0.00,\"oilraxTotalMoney\":0.00,\"insuranceTotalMoney\":0.00,\"itineraryTotalMoney\":0.00,\"taxTotalMoney\":0.00,\"payPoundage\":0.00,\"allPayMoney\":50.00,\"payType\":9,\"createOrderTime\":\"2019-10-08 15:24:48\",\"payTime\":\"2019-10-08 15:25:03\",\"outTicketTime\":\"2019-10-08 15:25:03\",\"cancelTicketTime\":\"2019-10-08 15:25:03\",\"linkMan\":\"池鱼\",\"linkPhone\":\"15198186997\",\"linkEmail\":\"\",\"operatorCorpNo\":\"20160712160619032240\",\"operatorCorpName\":\"锦茵TMC\",\"operatorDeptNo\":\"20160712160619032240\",\"operatorDeptName\":\"锦茵TMC\",\"operatorUserNo\":\"20190212174322616761\",\"operatorUserName\":\"池鱼\",\"importantLevel\":0,\"remark\":\"\",\"lockStatus\":0,\"lockStaffId\":\"\",\"lockStaffName\":\"\",\"lockTime\":\"2019-10-08 15:25:03\",\"addTime\":\"2019-10-24 20:08:16\",\"isDelete\":0,\"bankOrderId\":\"\",\"serviceFee\":0.00},\"buyTicketInfoBoList\":[{\"keyID\":\"1910081525036311800XXXX182\",\"orderId\":\"191008152448182781\",\"ticketNo\":\"\",\"userName\":\"池鱼\",\"userEnglishName\":\"\",\"passengerIndex\":0,\"passengerType\":0,\"passengerTypeName\":\"\",\"passengerGender\":1,\"identity\":0,\"cardType\":0,\"cardTypeName\":\"身份证\",\"cardNo\":\"510902199601127713\",\"birthDay\":\"1996-01-12\",\"international\":\"\",\"passengerPhoneNum\":\"15198186997\",\"voyageLeg\":\"银川-中卫\",\"voyageLegEn\":\"\",\"salesPrice\":50.00,\"oilrax\":0.00,\"airrax\":0.00,\"needItinerary\":0,\"itineraryMoney\":0.00,\"needInsurance\":0,\"insuranceMoney\":0.00,\"isNeedInsInvoice\":0,\"totalMoney\":50.00,\"ticketPrice\":50.00,\"tax\":0.00,\"cardValidityTime\":\"2019-10-08 15:24:30\",\"refundFlag\":0,\"isRefundFlag\":0,\"isRefundFlagName\":\"\",\"refundChangeModifyTime\":\"2019-10-08 15:25:04\",\"civilServantValidType\":0,\"cardBankID\":0,\"cardBankName\":\"\",\"budgetUnitName\":\"\",\"issueCountry\":\"\",\"addTime\":\"2019-10-08 15:25:04\",\"isDelete\":0}],\"buyVoyageInfoBoList\":[{\"keyID\":\"1910081525036386708XXXX182\",\"orderId\":\"191008152448182781\",\"sequence\":0,\"carrier\":\"JR\",\"carrierName\":\"幸福\",\"flightNo\":\"JR1509\",\"cabin\":\"G\",\"cabinName\":\"经济舱\",\"cabinType\":0,\"planType\":\"小\",\"deptCity\":\"INC\",\"arrCity\":\"ZHY\",\"deptCityCh\":\"银川\",\"arrCityCh\":\"中卫\",\"deptAirport\":\"INC\",\"arrAirport\":\"ZHY\",\"deptAirportCh\":\"河东\",\"arrAirportCh\":\"香山机场\",\"deptTime\":\"2019-10-23 08:00:00\",\"arrTime\":\"2019-10-23 08:45:00\",\"orgJetquay\":\"T3\",\"dstJetquay\":\"\",\"discount\":\"9\",\"stopOver\":0,\"stopOverCity\":\"\",\"stopOverCityCh\":\"\",\"sOAirport\":\"\",\"sOAirportCh\":\"\",\"midTakeOffTime\":\"1900-01-01 00:00:00\",\"midArrTime\":\"1900-01-01 00:00:00\",\"isTransfer\":0,\"transferOrgSequence\":0,\"isShare\":0,\"reallyFlightNo\":\"\",\"policyId\":\"CL||\",\"returnPoint\":\"0\",\"isSelfCarrierTicket\":0,\"largeCustomerNum\":\"\",\"isStandardRule\":1,\"unStandardRule\":\"{\\\"isAllowedToSign\\\":1,\\\"changeTicketRuleInfo\\\":\\\"S:2019-10-16 08:00前|¥10\\\\/人^2019-10-21 08:00前|¥15\\\\/人^2019-10-23 04:00前|¥25\\\\/人^2019-10-23 08:00|¥35\\\\/人\\\",\\\"refundTicketRuleInfo\\\":\\\"S:2019-10-16 08:00前|¥15\\\\/人^2019-10-21 08:00前|¥25\\\\/人^2019-10-23 04:00前|¥45\\\\/人^2019-10-23 04:00后|¥50\\\\/人\\\",\\\"remark\\\":\\\"1.随身携带1件行李,重量不超5KG,体积不超20*30*40CM;2.免费手动行李:20KG。\\\"}\",\"policyPlattype\":1,\"priceSource\":\"0\",\"policySign\":7,\"baggageCount\":0.00,\"baggageWeight\":0.00,\"isNightFlight\":0,\"flightType\":1,\"planModel\":\"\",\"flyTime\":\"\",\"subProductId\":\"\",\"policyExInfo\":\"{\\\"airAgentDiscount\\\":\\\"9\\\",\\\"oriClassDiscount\\\":\\\"0\\\",\\\"publicHighPrice\\\":\\\"0\\\",\\\"publicLowPrice\\\":\\\"0\\\",\\\"salePrice\\\":\\\"0\\\",\\\"calculateDiscount\\\":\\\"0\\\",\\\"prefMoney\\\":\\\"0\\\",\\\"ch_segId\\\":\\\"0\\\"}\",\"remark\":\"\",\"addTime\":\"2019-10-08 15:25:04\",\"isDelete\":0}]}\n";
	TicketBuyOrderInfoVo orderInfoVo = GsonUtil.gson.fromJson(json, TicketBuyOrderInfoVo.class);
	
	when(buyDataServiceFeignClient.getBuyOrderInfoVoByOrderId(anyString())).thenReturn(orderInfoVo);
}

@SpyBean注解

使用此注解注入的类,表明类中的某一个方法使用使用自定义返回的值,在测试时,如果使用到了多个方法,那么只是遵循@SpyBean写法的方法会返回我们自定义的值,在使用时在使用方法上和@MockBean类似,不过写法有所区别

@SpyBean
protected IAutoTicketDao autoTicketDao;

@Test
public void addComsumptions_Out() {
    String json1 = "{\"orderID\":\"190801084547167995\",\"sellerDeptID\":\"340559\",\"orderStatus\":8,\"outTicketTime\":\"2019-08-01 08:54:33\",\"payCompanyOrderID\":\"FX2019080143357941\",\"outTradeNo\":\"NT19080100004112\",\"airCode\":\"ZH\",\"seatClass\":\"E\",\"takeOffTime\":\"2019-08-08 21:35:00\",\"fromCity\":\"CKG\",\"toCity\":\"SZX\",\"inStockStaff\":\"SZX49802\",\"ticketOutInterface\":10,\"airPayAccount\":\"SZCYSD517\",\"inStockTime\":\"2019-08-01 08:54:33\",\"bigCustomerID\":\"\",\"buyerDeptName\":\"云南昆明盛世航空\",\"flightNO\":\"9428\",\"bigPNR\":\"PCYL5W\",\"orderPnr\":\"HM6XMK\"}";
    AutoOrder autoOrder = GsonUtil.gson.fromJson(json1, AutoOrder.class);
    
    doReturn(autoOrder).when(autoTicketDao).getAutoOrderByOrderId(anyString(), anyObject());

}

以下注解基于JUnit5

@TestFactory

注明一个方法是基于数据驱动的动态测试数据源

@ParameterizedTest

注明一个方法是测试方法,这一点同@Test注解作用一样。此外,该注解还可以让一个测试方法使用不同的入参运行多次

@RepeatedTest

可以让测试方法自定义重复运行次数

@BeforeEach

与JUnit4中的@Before类似,可以在每一个测试方法运行前,都运行一个指定的方法。在JUnit5中,除了运行@Test注解的方法,还额外支持运行@ParameterizedTest和@RepeatedTest注解的方法

@AfterEach

与JUnit4中的@After类似,可以在每一个测试方法运行后,都运行一个指定的方法。在JUnit5中,除了运行@Test注解的方法,还额外支持@ParameterizedTest和@RepeatedTest注解的方法

@BeforeAll

与JUnit4中的@beforeClass类似,可以在每一个测试类运行前,都运行一个指定的方法

@AfterAll

与JUnit4中的@AfterClass类似,可以在每一个测试类运行按,都运行一个指定的方法

@Disabled

与JUnit4中的@Ignore类似,注明一个测试的类或方法不再运行

@Nested

为测试添加嵌套层级,以便组织用例结构

@Tag

为测试类或方法添加标签,以便有选择性地执行
Spring打桩参考文章

@Intercepts注解

注解使用

@Intercepts(value = {
        @Signature(type = Executor.class,method = "update",args = {MappedStatement.class,Object.class}),
        @Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class,
                ResultHandler.class, CacheKey.class, BoundSql.class}),
        @Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class,
                ResultHandler.class}),
})
public class MybatisSQLInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        return null;
    }

    @Override
    public Object plugin(Object o) {
        return null;
    }

    @Override
    public void setProperties(Properties properties) {

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值