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)); } }); }