文章字数: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的idBeanFactoryAware的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.properties1 | # 路径 |
Tomcat文件夹中的.jks文件到资源目录,和配置文件同级keytool -list -keystore server.p121 | 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的数组 --> |