Spring非常用注解与技术记录

1.注解

@Order 注解:

用于控制配置类(@Configuration)的加载顺序,数值越小,优先级越高 。

@Async 注解:

用于声明异步函数。

@EventListener 注解:

事件监听器,用于监听某个事件

@PostConstruct 注解

服务器加载Servlet的时候运行此注解标注的方法

@PreDestroy 注解

服务器卸载Servlet的时候运行此注解标注的方法

2.技术

2.1监听器

Spring的Listener由两部分组成

  • 事件 Event (具体被监听的事件)
  • 监听器 Listener (负责监听事件)

创建事件:

继承 ApplicationEvent 类,用来表识这是一个事件

public class TestEvent extends ApplicationEvent {

    public TestEvent(Object source) {
        super(source);
    }
}

定义监听器:

两种定义监听器的方式

  • 使用 @EventListener 注解
@EventListener
    public void onPostVisitEvent(TestEvent event) throws InterruptedException {
        handleVisitEvent(event);
    }

实现 ApplicationListener 接口,并使用 <ApplicationStartedEvent> 表明监听的事件

public class StartedListener implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("监听程序启动");
    }
}

发布事件

相当于按钮的单击

public class Test {
    ApplicationEventPublisher eventPublisher;
    
    public void test() {
        eventPublisher.publishEvent(new Event());
    }
}

2.2过滤器

过滤用户请求,Spring中可以通过以下继承以下Bean实现

  • GenericFilterBean 通用过滤器
  • OncePerRequestFilter 每次请求过滤一次
@Slf4j
public class LogFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        String remoteAddr = ServletUtil.getClientIP(request);

        log.debug("");
        log.debug("Starting url: [{}], method: [{}], ip: [{}]", request.getRequestURL(), request.getMethod(), remoteAddr);

        // Set start time
        long startTime = System.currentTimeMillis();

        // Do filter
        filterChain.doFilter(request, response);

        log.debug("Ending   url: [{}], method: [{}], ip: [{}], status: [{}], usage: [{}] ms", request.getRequestURL(), request.getMethod(), remoteAddr, response.getStatus(), (System.currentTimeMillis() - startTime));
        log.debug("");
    }
}

2.3aop切面

@Aspect
@Slf4j
@Component
public class DisableOnConditionAspect {

    @Pointcut("@annotation(test.annotation.DisableOnCondition)")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint,
                         DisableOnCondition disableApi) throws Throwable {
        System.out.println("切入点之前的操作");
    Object resultObj = joinPoint.proceed();
    System.out.println("切入点之后的操作");

    // 结束
        return resultObj ;
    }
}

Web数据绑定器@InitBinder

用于初始化数据绑定器, 被此注解的方法可以对WebDataBinder进行初始化

@InitBinder
protected void initBinder(WebDataBinder binder) {
    // String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
    binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
        @Override
        public void setAsText(String text) {
            setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
        }
        @Override
        public String getAsText() {
            Object value = getValue();
            return value != null ? value.toString() : "";
        }
    });
    // Date 类型转换
    binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
        @Override
        public void setAsText(String text) {
            setValue(DateUtils.parseDate(text));
        }
    });
}

一点点学习,一丝丝进步。不懈怠,才不会被时代所淘汰!

原文地址:https://www.cnblogs.com/fqh2020/p/13068013.html