springboot注解
一、随意记录
@Value读取配置文件
@Value(${""})
@FunctionalInterface
也叫做函数式接口
@FunctionalInterface
public interface SourceOperator {
<T> PropertyMapper.Source<T> apply(PropertyMapper.Source<T> source);
}
该类接口中只能有一个抽象方法。可以使用lamda函数式编程实现接口方法。
SourceOperator sour = (e)-> Sysytem.out.println(e);
--------------------------------分割线---------------------------------------------
二、自定义注解。
在spring boot中,你可以看到各种各样的注解,功能非常强大。当然注解也是功能不一的,下面是介绍如何自定义注解并使用的。
注解主要是采用了切面AOP的思想,不破坏原有的代码逻辑结构,而是自定义实现类,用来补充业务上的功能增加。思想和Flask的before_first_request,before_request,after_request等类似。
实现步骤:
1、引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、定义接口
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface GoodsServerLog {
String value() default "goods_server_log";
}
3、定义AOP类
@Aspect
@Component
public class GoodsLog {
private Logger logger = LoggerFactory.getLogger(this.getClass().getName());
@Pointcut(value = "@annotation(com.hnshop.goods.common.annotion.GoodsServerLog)")
public void cut() {
}
@Around("cut()")
public Object customrecord(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
logger.info("Start to record myself log content!");
Object result = proceedingJoinPoint.proceed();
try {
handle(proceedingJoinPoint);
}catch (Exception e){
logger.error("记录自定义记录出错",e);
}
logger.info("End for recording custom record log");
return result;
}
private void handle(ProceedingJoinPoint point) throws Exception {
String targetclass = point.getTarget().getClass().getName();
logger.info("ok!你被GoodsServerLog调用了.你叫做:" + targetclass);
}
@Before("cut()")
public void before() {
logger.info("我类似于python的before装饰器");
}
@After("cut()")
public void after() {
logger.info("我类似于python的after装饰器");
}
}
4、在业务端引入
@RestController
public class TestController {
@Autowired
KafkaProduceService kafkaProduceService;
@GoodsServerLog
@RequestMapping("/send")
public String testsend() {
kafkaProduceService.sendMsg("test","haha,I come from spring-kafka");
return "发送成功";
}
}
当我访问对应url的时候,就会调用对应的AOP类。看下日志:
2018-12-20 16:48:52.002 INFO 13018 --- [http-nio-9090-exec-2] com.hnshop.goods.common.aop.GoodsLog : ok!你被GoodsServerLog调用了.你叫做:com.hnshop.goods.controller.TestController
2018-12-20 16:48:52.003 INFO 13018 --- [http-nio-9090-exec-2] com.hnshop.goods.common.aop.GoodsLog : End for recording custom record log
2018-12-20 16:48:52.003 INFO 13018 --- [http-nio-9090-exec-2] com.hnshop.goods.common.aop.GoodsLog : 我类似于python的after装饰器
2018-12-20 16:48:52.022 INFO 13018 --- [org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1] c.h.g.s.impl.KafkaConsumerServiceImpl : haha,I come from spring-kafka
2
最下面是业务输出的一个kafka消费消息,这证明我业务端实际生产了消息并发送到了kafka。
上面用到的方法说明(转载于网上):
@Aspect
作用是把当前类标识为一个切面供容器读取
@Before
标识一个前置增强方法,相当于BeforeAdvice的功能
@AfterReturning
后置增强,相当于AfterReturningAdvice,方法退出时执行
@AfterThrowing
异常抛出增强,相当于ThrowsAdvice
@After
final增强,不管是抛出异常或者正常退出都会执行
@Around
环绕增强,相当于MethodInterceptor
微信分享/微信扫码阅读