文章字数:131,阅读全文大约需要1分钟
ResponseBodyAdvice可以在注解@ResponseBody将返回值处理成相应格式之前操作返回值。实现这个接口即可完成相应操作。可用于返回值加密
@ControllerAdvice标记类
接口
1 | public interface ResponseBodyAdvice<T>{ |
其它
在参数被方法调用之前截取参数的是RequestBodyAdvice
1 |
|
文章字数:131,阅读全文大约需要1分钟
ResponseBodyAdvice可以在注解@ResponseBody将返回值处理成相应格式之前操作返回值。实现这个接口即可完成相应操作。可用于返回值加密
@ControllerAdvice标记类
1 | public interface ResponseBodyAdvice<T>{ |
在参数被方法调用之前截取参数的是RequestBodyAdvice
1 | @ControllerAdvice |
文章字数:97,阅读全文大约需要1分钟
相同
RuntimeException 继承与 ExceptionRuntimeException 和 Exception都能被try...catch不同
Exception,编译器会要求代码中处理,即try...catch或throwsRuntimeException可以不在代码中处理,运行时遇到则会抛出。例如空指针异常1 | public static void main(String[] args) { |
文章字数:37,阅读全文大约需要1分钟
SQLServerException:列名‘true’无效
mysql里支持true,在sql server里只有0,1所以语句不兼容。只有改字段类型了。
文章字数:667,阅读全文大约需要2分钟
传统方式
前端访问后端,后端调用其他服务。
然而调用的过程中(即网络IO)需要等待结果,这种同步阻塞的过程会产生大量无用的等待。
占用服务端连接池(tomcat处理请求的线程)、降低吞吐量。
1 | 前端--> tomcat ---> tomcate |
响应式系统





1 | Observable.just("hello world")//简单创建一个生产者 |
1 | Observable.just("hello world")//简单创建一个生产者 |
中间操作和消费者使用不同线程池

创建线程池操作
Schedulers.computation():和cup数量相关,cpu密集型使用Schedulers.io():io操作相关的操作Schedulers.newThread():直接创建线程,一般不用Schedulers.from():使用自定义线程池subscribeon以第一个为准,即被观察者的线程池只有一个。Controller层直接返回Observable,Spring会自动订阅该生产者(RxJava的)Servlet3.0的异步Servlet(设置@Servlet(asyncSupported=true))
Controller层直接返回DeferredResultServlet进入两次,一次是请求进入,然后调用业务线程。自身直接返回(连接线程返回线程池)。业务线程执行完通过DeferredResult再次找到Servlet获取连接对象,返回信息文章字数:377,阅读全文大约需要1分钟
channel最主要的作用就是作为一个传输Message的管道,Spring Integration中实现了各种各样的channel可以满足不同的需求。
MessageChannel: 该接口中没有提供从channel中接收的方法,因为接收的方法被两个子接口表示。1 | boolean send(Message<?> message); |
PollableChannel: 接收的子接口,具备轮询获取消息的能力。要求消息消费者或者框架周期性检测消息是否可达。1 | Message<?> receive(); |
SubscribableChannel: 发送消息给订阅了MessageHanlder的订阅者1 | boolean subscribe(MessageHandler handler); |
DirectChannel: 默认的Spring Integration默认的消息通道,它允许将消息发送给一个订阅者,然后阻碍发送直到消息被接收。同步发送。
QueueChannel: 允许消息接收者轮询获得消息,用一个队列queue接收消息,队列的容量大小可配置。异步发送
PublishSubscribeChannel: 允许广播消息给所有订阅者,不支持缓存即Quenue
PriorityChannel: 可以按照优先级将数据存储到队列
文章字数:770,阅读全文大约需要3分钟
循环依赖就是两个或者以上的bean相互持有对方,形成了一个依赖闭环。
循环依赖的场景有
field属性的循环依赖Spring创建Bean时是递归创建的,即发现属性有依赖的Bean就回去创建属性对象的Bean。Bean的时候做个标记,当再次递归调用创建的时候,发现有创建的标记就知道了三级缓存
1 | /** 存放单例bean 1级*/ |
bean实例化过程
依赖循环发送在实例化bean(调用构造方法)和填充属性(递归创建bean)的时候
singletonFactories中,并标记已创建(加入registeredSingletons)bean则递归进入创建流程singletonObjects)获取bean被标记过正在创建尝试在二级缓存(earlySingletonObjects)中获取提前暴露的类singletonFactories)获取。earlySingletonObjectsbean后也能创建成功了。关键词: java, spring
文章字数:122,阅读全文大约需要1分钟
bean实例化bean属性注入BeanNameAware.setBeanName()BeanClassLoaderAware.setBeanClassLoader()BeanFactoryAware.setBeanFactory()EnvironmentAware.setEnviroment()EmbeddedValueResolverAware.setEmbedValueResolver()ResourceLoaderAware.setResourceLoader()ApplicationEventPublisherAware.setApplicationEventPublisher()MessageSourceAware.setMessageSource()ApplicationContextAware.setApplicationContext()WebApplicationContext,调用ServletContextAware.setServletContext()BeanPostProcessor初始化方法InitializingBean.afterPropertitesSet()BeanPostProcessor初始化之后方法销毁环境
DisposableBean.destory()文章字数:191,阅读全文大约需要1分钟
1 | @Configuration |
1 | # 设置国际化文件存放的地方 |
classpath:/static/i18n目录中添加文件:
messages.properties1 | 默认翻译 |
messages_en_US.properties1 | user.title=User Login |
messages_zh_CN.properties1 | user.title=用户登陆 |
1 | @Component |
1 | <!DOCTYPE html> |
文章字数:298,阅读全文大约需要1分钟
Spring中默认有starter实现类Mail
1 | <dependency> |
1 | # JavaMailSender 邮件发送的配置 |
1 | public void sendSimpleMail(){ |
自定义发件人名称
1 | String nick = ""; |
1 | public void sendHTMLMail(MailBean mailBean) { |
1 | public void sendAttachmentMail(MailBean mailBean) { |
1 | public void sendInlineMail(MailBean mailBean) { |
1 | public void sendTemplateMail(MailBean mailBean) { |
和之前使用接口javaMailSender不同,这次使用的是接口的实现类。
使用JavaMailSenderImpl
1 | public void sendSimpleMail() throws Exception { |