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

--------EOF---------
本文微信分享/扫码阅读