在循环中大量执行下面代码后,会卡死,”after axios” 出不来,查了下官方issue,2015年就有人说这事了,后来这个issue被关闭了但问题没有解决,现在都2021年了也没有解决。 查看这个issue
console.log('before axios....')
const res = await axios({
url,
method: 'get',
timeout: 1000 * 30,
proxy: {
host: proxy.host,
port: proxy.port,
auth: {
username: proxy.user,
password: proxy.pass
}
}
}).catch(err => {
console.log('axios request failed. url:' + url)
})
console.log('after axios')
换成got库,就没问题了。。。真没想到这么知名的库还有这种bug!
const agent = tunnel.httpOverHttp({
proxy: {
host: proxy.host,
port: proxy.port,
proxyAuth: proxy.user + ":" + proxy.pass
}
})
console.log('before got....')
const res = await got(url, {
timeout: 1000 * 30,
agent: {
https: agent,
http: agent
}
}).catch(err => {
console.log('got request failed. url:' + url)
})
console.log('after got')
在生成环境中,一般不直接使用nodejs框架的静态文件部署功能,专业的工具做专业的事情,静态文件就交给nginx吧。
代理名称: app
代理目录: /appservice/
目标URL: http://127.0.0.1:8090 发送域名: $host
注意1:目标URL结尾一定不能带/, 否则会报错
注意2:目标URL中的端口与第2步的监听端口保持一致
proxy_pass http://127.0.0.1:8090; 修改为
proxy_pass http://127.0.0.1:8090/;
否则nginx转发给node应用会带"appservice"路径
然后添加一条
proxy_set_header X-Forwarded-Proto $scheme;
npm i serve -g
serve
还有一种方法,修改vue.config.js,这样打包出来的资源引用就使用相对路径
module.exports = {
"publicPath": ""
}
git reset --hard HEAD~1
git push origin master -f
git.exe clean -dfx
git.exe reset --hard
git submodule foreach --recursive git submodule init
git submodule foreach --recursive git submodule update
先定义一个接口Car
package com.example.demo;
public interface Car {
void run();
}
再分别定义两个实现类
package com.example.demo;
import org.springframework.stereotype.Component;
@Component
public class FerrariCar implements Car {
public void run() {
System.out.println("FerrariCar is running.");
}
}
/////////////////////////////////////
package com.example.demo;
import org.springframework.stereotype.Component;
@Component
public class BMWCar implements Car {
public void run() {
System.out.println("BMW is running.");
}
}
定一个土豪类
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class RichMan {
@Autowired
private Car car;
public void say() {
System.out.println("############### I'm Rich!!!!##############");
car.run();
System.out.println("############### I'm Rich!!!####################");
}
}
运行发现报错:
Field car in com.example.demo.RichMan required a single bean, but 2 were found:
- BMWCar: defined in file [C:\Users\***\target\classes\com\example\demo\BMWCar.class]
- ferrariCar: defined in file [C:\Users\***\target\classes\com\example\demo\FerrariCar.class]
意思是自动装载Car时,发现有两个Car实例(BMWCar,FerrariCar), 不知道怎么办了。为了解决这个问题,我们引入@Qualifier注解,该注解接受一个字符串参数,为bean id。
修改RichMan代码
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class RichMan {
@Autowired
@Qualifier("ferrariCar")
private Car car;
public void say() {
System.out.println("############### I'm Rich!!!!##############");
car.run();
System.out.println("############### I'm Rich!!!####################");
}
}
发现一切正常。尝试修改为@Qualifier(“bMWCar”),运行报错了,说找不到bean,这到底是为什么呢? 我们知道@Component是可以指定bean id的,尝试一下手动指定bean id, 然后保持与@Qualifier参数一致,发现是ok的。这说明@Component默认指定的bean id规则并不是无脑把第一个字母小写,为了验证,我们实现BeanNameAware接口,代码如下:
package com.example.demo;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;
@Component
public class BMWCar implements Car, BeanNameAware {
public void run() {
System.out.println("BMWCar is running.");
}
public void setBeanName(String name) {
System.out.println("BMWCar bean Name:" + name);
}
}
发现果然是@Component默认指定的bean id规则并不是无脑把第一个字母小写。
Dependency injection, 依赖注入
根本的目的是解耦,降低对类之间的耦合,底层使用Java语言reflection(反射)机制实现的。那到底什么是DI呢?(待续)
Inversion of Control, 反转控制
一般我们使用一个对象,先是new对象,用完之后,丢给GC回收。但在Spring框架中,所有的类都来我这里注册,你要什么告诉我就行,由Spring统一控制对象生命周期,所以叫反转控制。那到底什么反转了?获得对象的方式反转了。
Aspect-Oriented Programming, 面向切面编程
Plain Old Java Object, 简单老式Java对象
装配 创建应用对象之间协作关系的行为通常称之为装配。