文章字数:34,阅读全文大约需要1分钟
1 | import java.security.KeyManagementException; |
文章字数:34,阅读全文大约需要1分钟
1 | import java.security.KeyManagementException; |
文章字数:455,阅读全文大约需要1分钟
SpringBean从创建、初始化操作、就绪、销毁。组成了一个完整的生命周期。
普通的容器和
spring
的耦合很低,使用过程中不用知道spring
的存在,将容器从spring
替换成其他容器也可以正常运行。然而部分功能需要用到容器本身的功能和资源,于是spring
提供了spring aware
系列可以在初始化容器时通过接口的形式提供。
BeanNameAware
的setBeanName
方法Bean
实现此接口,调用setBeanName
方法并传入Bean
的id
BeanFactoryAware
的setBeanFactory
方法Bean
实现此接口,调用方法传入Spring
工厂本身ApplicationContextAware
的setApplicationContext
方法Bean
实现此接口,调用方法传入ApplicationContext
,即spring
容器上下文BeanPostProcess
的postProssBeforeInitialization
方法Bean
实现此接口,调用方法传入(Object bean,String beanName)
初始化结束
如果bean
在Spring
配置文件中配置了init-method
属性,会自动调用配置的初始化方法
调用InitializingBean
的afterPropertiesSet
方法
调用BeanPostProcess
的postProcessAfterInitialization
方法
如果Bean
实现此接口,调用方法传入(Object bean,String beanName)
初始化之后调用的方法
Bean
准备就绪
销毁
DispostbleBean
的destory
方法Bean
会调用destory
方法销毁destory-method
方法,会自动销毁文章字数:488,阅读全文大约需要1分钟
springBoot2.x提供了简便的websocket实现方式。但是如果需要大并发,还是需要使用netty
1 | <dependency> |
1 | import org.springframework.context.annotation.Bean; |
1 | import java.io.IOException; |
1 | var socket; |
文章字数:245,阅读全文大约需要1分钟
springWebSocket还有一种形式,除了事件绑定的形式还有基于观察者模式(发布-订阅)的绑定
topic
形式
springBoot的websocket的starter包
1 | <dependency> |
1 | @Configuration |
端点连接还可以配置允许跨域
1 | registry.addEndpoint("/socket").addInterceptors(new HandshakeInterceptor(){ |
1 | @Controller |
准备
socketjs.js
:如果浏览器不支持webSocket
,改库可以模拟对webSocket
的支持stomp.js
:将webSocket
代理代码简易化的框架1 | function connect(){ |
文章字数:1063,阅读全文大约需要4分钟
1 | <dependency> |
1 | import com.cenobitor.aop.annotation.Action; |
1 | @Aspect 定义切面:切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括了横切逻辑的定义,也包括了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。 |
用来解释
aop
连接点
指示器 | 说明 | 使用 |
---|---|---|
execution() |
匹配方法执行的连接点 | execution(方法修饰符 返回值 类 方法名(参数) 抛出异常) 这个颜色表示不可省略部分 所有部分都支持* 全部匹配 |
指示器 | 说明 |
---|---|
args() |
匹配当前执行的方法传入参数为指定类型 |
@args |
匹配当前执行的方法传入的参数有指定注解的执行 |
指示器 | 说明 |
---|---|
this() |
用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配 |
指示器 | 说明 |
---|---|
target() |
用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配 |
@target |
用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解 |
within() |
用于匹配指定类型内的方法执行 |
@within |
用于匹配所以持有指定注解类型内的方法 |
指示器 | 说明 |
---|---|
@annotation |
用于匹配当前执行方法持有指定注解的方法 |
指示器 | 说明 |
---|---|
bean() |
Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法 |
指示器 | 说明 |
---|---|
reference pointcut |
表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持 |
文章字数:158,阅读全文大约需要1分钟
ajax提交json数据,springBoot使用有相同类型的实体类接收,但是实体类属性全部是空。最后通过前端F12查看发送的数据,发现发送的是json字符串,而不是键值对形式。原来是我在前端多了一步转换对象为json字符串的操作。。。低级错误。。
正确的代码结构:
前端提交
1 | var formdata={}; |
springBoot:
1 | public Mes add(User u,@RequestParam("other") String other){//除了实体类里的信息外指定name获取其他信息 |
其中,User实体类应该完全包含前端发送的json(formdata)的所有属性,否则可能会出错。
文章字数:88,阅读全文大约需要1分钟
开发的时候需要项目启动后执行一些初始化功能,soringBoot中可以添加一个model并实现CommandLineRunner接口,实现功能的代码放在实现的run方法中
1 | package org.springboot.sample.runner; |
文章字数:483,阅读全文大约需要1分钟
开启
https
可以有效防止中间人攻击。原理是使用非对称加密,连接双方加密的信息只能用对方的秘钥解密。CA
颁发的证书还能够保证服务器证书不是被伪造的。
这种证书可以保证加密连接,但是黑客可以自己生成一个和我们域名一样的证书,并使用DNS
劫持,将域名绑定到自己的ip
上。使用CA
颁发的证书可以解决这种问题。
jdk
自带的命令生成证书keytool -genkeypair -alias tomcat -keyalg RSA -keystore E:\tomcat.key
完整命令-alias tomcat
别名为tomcat-keyalg RSA
使用RSA非对称加密-keystore E:\tomcat.key
生成后保存位置1 | keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 |
application.properties
1 | # 路径 |
Tomcat
文件夹中的.jks
文件到资源目录,和配置文件同级keytool -list -keystore server.p12
1 | server.port: 8092 |
1 | @Bean |
文章字数:276,阅读全文大约需要1分钟
freemarker是一款模板引擎,适用于mvc框架
1 | <dependency> |
1 | spring.freemarker.allow-request-override=false |
基本使用
1 | <h1>Hello , ${name}</h1> |
Controller.java*
1 | public ModelAndView view(){ |
循环
1 | <#list studentList as student> |
1 |
|
<#list studentList as student>
${student_index}
</#list>
判断
1 | <#if student_index % 2 == 0> |
日期格式化
1 | 日期:${date?date} |
null处理
1 | ${name!"默认..."} |
包含其他
1 | <#include "hello.ftl"/> |
就是定义一个代码片段,在其它地方可以复用
####不带参数
1 | <#macro greet> |
1 | <@greet></@greet> |
1 | <#macro header title="默认文字" keywords="默认文字" description="默认文字"> |
1 | <!-- 引入上面的定义文件 --> |
1 | <!-- 定义一个1到28的数组 --> |