文章字数: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
继承与 Exception
RuntimeException
和 Exception
都能被try...catch
不同
Exception
,编译器会要求代码中处理,即try...catch
或throws
RuntimeException
可以不在代码中处理,运行时遇到则会抛出。例如空指针异常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
层直接返回DeferredResult
Servlet
进入两次,一次是请求进入,然后调用业务线程。自身直接返回(连接线程返回线程池)。业务线程执行完通过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
)获取。earlySingletonObjects
bean
后也能创建成功了。关键词: 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.properties
1 | 默认翻译 |
messages_en_US.properties
1 | user.title=User Login |
messages_zh_CN.properties
1 | 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 { |