<(|北京gt赛车7网怎么注册|)>

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
<P>大兴二中  韩宝刚</P><P>关于数学教学中介绍数学史促.
下载积分:500
内容提示:数学史的教育教学功能</P><P>(1)介绍数学史..
文档格式:PDF|
浏览次数:53|
上传日期: 09:43:31|
文档星级:
该用户还上传了这些文档
<P>大兴二中  韩宝刚</P><P&
官方公共微信我们在 SpringMVC 开发项目中,有的用注解和 XML 配置 Bean, 这两种都各有自己的优势,数据源配置比较经常用 XML 配置,控制层依赖的 service 比较经常用注解等(在部署时比较不会改变的),我们经常比较常用的注解有 @Component 是通用标注, @Controller 标注 web 控制器, @Service 标注 Servicec 层的服务, @Respository 标注 DAO 层的数据访问。 SpringMVC 启动时怎么被自动扫描然后解析并注册到 Bean 工厂中去(放到 DefaultListableBeanFactory 中的 Map&String,&BeanDefinition&&beanDefinitionMap 中&以 BeanName 为 key )?我们今天带着这些问题来了解分析这实现的过程,我们在分析之前先了解一下这些注解。
@Controller 标注 web 控制器, @Service 标注 Service 层的服务, @Respository 标注 DAO 层的数据访问。 @Component 是通用标注,只是定义为一个类为 Bean , SpringMVC 会把所有添加 @Component 注解的类作为使用自动扫描注入配置路径下的备选对象。 @Controller 、 @Service/@Respository 只是更加的细化,都是被 @Component 标注,所以我们比较不推荐使用 @Component 。源代码如下:
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Service { String value() default &&;}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Controller { String value() default &&;}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Repository { String value() default &&;}都是有标示 @Component 我们在配置文件中,标示配置需要扫描哪些包下,也可以配置对某个包下不扫描,代码如下:&context:component-scan base-package=&cn.test&&
&context:exclude-filter type=&regex& expression=&cn.test.*.*.controller&/&
&context:exclude-filter type=&regex& expression=&cn.test.*.*.controller2&/&&/context:component-scan&说明:&context:exclude-filter& 指定的不扫描包, &context:exclude-filter& 指定的扫描包 SpringMVC 先读取配置文件,然后根据 context:component-scan 中属性 base-package 去扫描指定包下的 class 和 jar 文件,把标示 @Controller 标注 web 控制器, @Service 标注 Servicec 层的服务, @Respository 标注 DAO 层的数据访问等注解的都获取,并注册为 Bean 类放到 Bean 工厂,我们接下来要分析的这个过程。我们平时项目开发都是这样的注解,实现 MVC 模式,代码如下: 例如://控制层@Controller@RequestMapping(value=&/test&)public class TestController2 { @Autowired private TestService testS @RequestMapping(value=&/index&) public String getIndex(Model model){
return &&; }}//服务层@Service(&testService&)public class TestServiceImpl implementsTestService{}我们今天的入口点就在这,因为解析注解的到注册,也是先读取配置文件并解析,在解析时扫描对应包下的 JAVA 类,里面有 DefaultBeanDefinitionDocumentReader 这个类, doRegisterBeanDefinitions 这个方法实现解析配置文件的 Bean ,这边已经读取进来形成 Document& 形式存储,然后开始解析 Bean, 是由 BeanDefinitionParserDelegate 类实现的, BeanDefinitionParserDelegate 完成具体 Bean 的解析(例如: bean 标签、 import 标签等)这个在 上一篇SpringMVC 源代码深度解析 IOC容器(Bean 解析、注册)
里有解析,今天注解属于扩展的标签,是由 NamespaceHandler 和 BeanDefinitionParser 来解析。源代码如下: public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {
String namespaceUri = getNamespaceURI(ele);
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
if (handler == null) {
error(&Unable to locate Spring NamespaceHandler for XML schema namespace [& + namespaceUri + &]&, ele);
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd)); }NamespaceHandler 这边这边起到了什么作用,根据不同的 Namespace 获取不同的 NamespaceHandler ,因为我们在 Beans 标签配置了命名空间,然后就可以配置对应的标签,解析标签时,比较有自己的所实现的 NamespaceHandler 来解析,如图所示: NamespaceHandler 中的 parse 方法是它的子类类 NamespaceHandlerSupport 实现的,获取通过 findParserForElement 方法获取 BeanDefinitionParser& 对象,这个对象在工程初始化时就直接实例化放在缓存中 Map&String,&BeanDefinitionParser& ,然后通过 localName 获取,源代码如下: public BeanDefinition parse(Element element, ParserContext parserContext) {
return findParserForElement(element, parserContext).parse(element, parserContext); } private BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) {
String localName = parserContext.getDelegate().getLocalName(element);
BeanDefinitionParser parser = this.parsers.get(localName);
if (parser == null) {
parserContext.getReaderContext().fatal(
&Cannot locate BeanDefinitionParser for element [& + localName + &]&, element);
}为什么要获取 BeanDefinitionParser& ,因为 BeanDefinitionParser& 类是解析配置文件中的 &context:component-scan&,&aop:config& 等标签,但是不同的标签是由不同的 BeanDefinitionParser 来进行解析的,如图所示:
接下来我们开始解析这个标签, &context:component-scan& 标签的解析是由 ComponentScanBeanDefinitionParser 类解析的,接下来我们要分析它怎么解析注解的 Bean ,并把 Bean 注册到 Bean 工厂,源代码如下: public BeanDefinition parse(Element element, ParserContext parserContext) { //获取context:component-scan 配置的属性base-package的值
String[] basePackages = StringUtils.tokenizeToStringArray(element.getAttribute(BASE_PACKAGE_ATTRIBUTE),
ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); //创建扫描对应包下的class文件的对象
ClassPathBeanDefinitionScanner scanner = configureScanner(parserContext, element); //扫描对应包下的class文件并有注解的Bean包装成BeanDefinition
Set&BeanDefinitionHolder& beanDefinitions = scanner.doScan(basePackages);
registerComponents(parserContext.getReaderContext(), beanDefinitions, element);
}说明:( 1 )获取 context:component-scan& 配置的属性 base-package 的值,然后放到数组。 ( 2 )创建扫描对应包下的 class 和 jar 文件的对象 ClassPathBeanDefinitionScanner& ,由这个类来实现扫描包下的 class 和 jar 文件并把注解的 Bean 包装成 BeanDefinition 。 ( 3 ) BeanDefinition 注册到 Bean 工厂。
第一:扫描是由 ComponentScanBeanDefinitionParser 的 doScan 方法来实现的,源代码如下:
protected Set&BeanDefinitionHolder& doScan(String... basePackages) {//新建队列来保存BeanDefinitionHolder
Set&BeanDefinitionHolder& beanDefinitions = new LinkedHashSet&BeanDefinitionHolder&();//循环需要扫描的包
for (String basePackage : basePackages) { //进行扫描注解并包装成BeanDefinition
Set&BeanDefinition& candidates = findCandidateComponents(basePackage);
for (BeanDefinition candidate : candidates) {
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
candidate.setScope(scopeMetadata.getScopeName());
String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
if (candidate instanceof AbstractBeanDefinition) {
postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
if (candidate instanceof AnnotatedBeanDefinition) {
AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
if (checkCandidate(beanName, candidate)) {
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
beanDefinitions.add(definitionHolder); //对BeanDefinition进行注册
registerBeanDefinition(definitionHolder, this.registry);
return beanD }进行扫描注解并包装成 BeanDefinition 是 ComponentScanBeanDefinitionParser 由父类 ClassPathScanningCandidateComponentProvider 的方法 findCandidateComponents 实现的,源代码如下: public Set&BeanDefinition& findCandidateComponents(String basePackage) {
Set&BeanDefinition& candidates = new LinkedHashSet&BeanDefinition&();
try { //base-package中的值替换为classpath*:cn/test/**/*.class
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
resolveBasePackage(basePackage) + &/& + this.resourceP//获取所以base-package下的资源
Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);boolean traceEnabled = logger.isTraceEnabled();
boolean debugEnabled = logger.isDebugEnabled();
for (Resource resource : resources) {
if (traceEnabled) {
logger.trace(&Scanning & + resource);
if (resource.isReadable()) {
MetadataReader metadataReader = this.metadataReaderFactory.getMetadataReader(resource); //对context:exclude-filter进行过滤
if (isCandidateComponent(metadataReader)) { //包装BeanDefinition
ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
sbd.setResource(resource);
sbd.setSource(resource);
if (isCandidateComponent(sbd)) {
if (debugEnabled) {
logger.debug(&Identified candidate component class: & + resource);
candidates.add(sbd);
if (debugEnabled) {
logger.debug(&Ignored because not a concrete top-level class: & + resource);
if (traceEnabled) {
logger.trace(&Ignored because not matching any filter: & + resource);
catch (Throwable ex) {
throw new BeanDefinitionStoreException(
&Failed to read candidate component class: & + resource, ex);
if (traceEnabled) {
logger.trace(&Ignored because not readable: & + resource);
catch (IOException ex) {
throw new BeanDefinitionStoreException(&I/O failure during classpath scanning&, ex);
}说明:(1) 先根据 context:component-scan& 中属性的 base-package=&cn.test& 配置转换为 classpath*:cn/test/**/*.class ,并扫描对应下的 class 和 jar 文件并获取类对应的路径,返回 Resources (2) 根据 &context:exclude-filter& 指定的不扫描包, &context:exclude-filter& 指定的扫描包配置进行过滤不包含的包对应下的 class 和 jar。 ( 3 )封装成 BeanDefinition 放到队列里。
1 )怎么根据 packageSearchPath 获取包对应下的 class 路径,是通过 PathMatchingResourcePatternResolver 类, findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length())); 获取配置包下的 class 路径并封装成 Resource ,实现也是 getClassLoader().getResources(path); 实现的。源代码如下:
&span style=&font-size:18&&public Resource[] getResources(String locationPattern) throws IOException {
Assert.notNull(locationPattern, &Location pattern must not be null&);
if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
// a class path resource (multiple resources for same name possible)
if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
// a class path resource pattern
return findPathMatchingResources(locationPattern);
// all class path resources with the given name
return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
// Only look for a pattern after a prefix here
// (to not get fooled by a pattern symbol in a strange prefix).
int prefixEnd = locationPattern.indexOf(&:&) + 1;
if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
// a file pattern
return findPathMatchingResources(locationPattern);
// a single resource with the given name
return new Resource[] {getResourceLoader().getResource(locationPattern)};
} }protected Resource[] findAllClassPathResources(String location) throws IOException {
String path =
if (path.startsWith(&/&)) {
path = path.substring(1);
Enumeration&URL& resourceUrls = getClassLoader().getResources(path);
Set&Resource& result = new LinkedHashSet&Resource&(16);
while (resourceUrls.hasMoreElements()) {
URL url = resourceUrls.nextElement();
result.add(convertClassLoaderURL(url));
return result.toArray(new Resource[result.size()]); }&/span& 说明: getClassLoader().getResources 获取 classpath*:cn/test/**/*.class 下的 cn/test 包下的 class 的路径信息。并返回了 URL 。这里能把对应 class 路径获取到了,就能获取里面的信息。
2 ) isCandidateComponent 实现的标签是里配置的 &context:exclude-filter& 指定的不扫描包, &context:exclude-filter& 指定的扫描包的过滤,源代码如下:
&span style=&font-size:18&&protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException {
for (TypeFilter tf : this.excludeFilters) {
if (tf.match(metadataReader, this.metadataReaderFactory)) {
for (TypeFilter tf : this.includeFilters) {
if (tf.match(metadataReader, this.metadataReaderFactory)) {
AnnotationMetadata metadata = metadataReader.getAnnotationMetadata();
if (!metadata.isAnnotated(Profile.class.getName())) {
AnnotationAttributes profile = MetadataUtils.attributesFor(metadata, Profile.class);
return this.environment.acceptsProfiles(profile.getStringArray(&value&));
}&/span& 说明:& this.excludeFilters 有 pattern 属性,值是就是 &context:exclude-filter&type=&regex&&expression=&cn.test.*.*.controller&/& 的 cn.test.*.*.controller 值 this.pattern.matcher(metadata.getClassName()).matches(); 通过这个去匹配,如果是就返回 false 。如图所示:
我们到这边已经把对应的通过在 XML 配置把注解扫描解析并封装成 BeanDefinition 。 接下来我们来分析一下注册到 Bean 工厂,大家还记得 ComponentScanBeanDefinitionParser 的 doScan 方法,然后到工厂的是由 registerBeanDefinition(definitionHolder,&this.registry); 实现的,源代码如下: protected void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) {
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry); }public static void registerBeanDefinition(
BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
throws BeanDefinitionStoreException {
// Register bean definition under primary name.
String beanName = definitionHolder.getBeanName();
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
// Register aliases for bean name, if any.
String[] aliases = definitionHolder.getAliases();
if (aliases != null) {
for (String aliase : aliases) {
registry.registerAlias(beanName, aliase);
} } public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
Assert.hasText(beanName, &Bean name must not be empty&);
Assert.notNull(beanDefinition, &BeanDefinition must not be null&);
if (beanDefinition instanceof AbstractBeanDefinition) {
((AbstractBeanDefinition) beanDefinition).validate();
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
&Validation of bean definition failed&, ex);
synchronized (this.beanDefinitionMap) {
Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);
if (oldBeanDefinition != null) {
if (!this.allowBeanDefinitionOverriding) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
&Cannot register bean definition [& + beanDefinition + &] for bean '& + beanName +
&': There is already [& + oldBeanDefinition + &] bound.&);
if (this.logger.isInfoEnabled()) {
(&Overriding bean definition for bean '& + beanName +
&': replacing [& + oldBeanDefinition + &] with [& + beanDefinition + &]&);
this.beanDefinitionNames.add(beanName);
this.frozenBeanDefinitionNames =
this.beanDefinitionMap.put(beanName, beanDefinition);
resetBeanDefinition(beanName); }说明: DefaultListableBeanFactory 要实现的保存到 Map&String,&BeanDefinition&&beanDefinitionMap 中&以 BeanName 为 key ,如果有,就不用保存了。 DefaultListableBeanFactory 我们在 上一篇SpringMVC 源代码深度解析 IOC容器(Bean 解析、注册) 有介绍过了, DefaultListableBeanFactory继承了BeanFactory。
(1) 因为解析注解的到注册,也是先读取配置文件并解析,在解析时扫描对应包下的 JAVA 类,里面有 DefaultBeanDefinitionDocumentReader 这个类, doRegisterBeanDefinitions 这个方法实现解析配置文件的 Bean ,这边已经读取进来形成 Document& 形式存储。然后 注解属于扩展的标签,是由 NamespaceHandler 和 BeanDefinitionParser 来解析。
& &(2) 根据 context:component-scan 中属性 base-package 去扫描指定包下的 class 和 jar 文件,获取对应的路径信息,然后根据配置 &context:exclude-filter& 指定的扫描包配置进行过滤不包含的包对应下的 class 和 jar路径的 Resources。
& & &(3) 把标示 @Controller 标注 web 控制器, @Service 标注 Servicec 层的服务, @Respository 标注 DAO 层的数据访问等注解路径都获取包装成 BeanDefinition ,并注册为
Bean 类放到 Bean 工厂,也就是 DefaultListableBeanFactory Map&String,&BeanDefinition&&beanDefinitionMap 中 以 BeanName 为 key。买家版手机客户端
厂家版手机客户端
>> 女装雪纺针织连衣裙&韩版爆款&
女装雪纺针织连衣裙&韩版爆款&
起批数量(件)
折扣率(折)
批发价(不含运费)
¥ 38.00/件
¥ 37.00/件
¥ 36.00/件
网银|安汇通|财付通
3015次浏览记录
桔红色 浅黄色 浅蓝色 浅紫色 
M L XL 
商品已经下架或者删除,如有需要请联系商家
微信扫一扫 手机购买
第一次前后进货?
我有银行卡,如何支付?
没有网银,如何支付?
有无支付保障,交易安全?
点击“立即购买”
选择颜色、尺寸和采购数量
点击“加入进货单”
点击“立即结算”
选择在线支付(无需网银)
填写银行卡基本信息,完成付款
选择第三方支付平台(安汇通)
登录支付账户,完成付款
·在前店后厂进货时,付款选择前店后厂安汇通做担保交易,货款并未直接付给卖家,而是付款到前店后厂安汇通,您收到货物签收无误后,再次确认收货时,订单款项才会结算给卖家,相当于货到付款。
·为了您的货款和货物安全,请通过前店后厂安汇通付款,谨防被骗。
·不通过前店后厂平台进行的任何交易,不在前店后厂交易担保的范围内。
公司名称后显示
前店后厂认证厂家
商品特色:
入驻时间:
所在地区:广东省-汕头市-金平区
您可能还喜欢
厂家客服:
平台客服:
客服电话:400-088-2298
价&&&格:-
适合季节:夏季裙长:短裙(76-90厘米)图案:圆点领型:圆领袖长:无袖/背心裙领子:圆领款式细节:订珠装饰风格:韩版品牌:其他颜色:浅黄色 浅紫色 桔红色 浅蓝色 尺寸:M L XL 货号:w006
买家可自由选择支付方式,如网银、安汇通、财付通等。
当买家收到货品并确认后,再由财付通打款给供应商,如逾期未收到商品或商品不符合要求,买家可以提出退款申请以保障自身权益。
确认订单信息
收货并验货满意
确认结算货款
M&&&&&&&&&&&&&&& & L&&&&&&&&&&&&&&&&&&&&&&&XL
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&衣长&&&87&&&&&&&&&&&&&&&&&90&&&&&&&&&&&&&&&&&&&&&&93
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&肩宽&&&35&&&&&&&&&&&&&&&&&36.2&&&&&&&&&&&&&&&&&&&37.4
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&胸围&&&88&&&&&&&&&&&&&&&&&92&&&&&&&&&&&&&&&&&&&&&&&96
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 袖长&&9.5&&&&&&&&&&&&&&&10.5&&&&&&&&&&&&&&&&& &11.5&
相关批发商品
2色/5码?20.00元4.17折起1件起批 1色/4码?20.00元4.17折起1件起批 1色/5码?20.00元4.17折起1件起批 3色/5码?20.00元4.17折起1件起批
您是不是想找:
我加盟的品牌(0)
近30天上新商品
最近浏览记录
最近联系人
关闭快捷导航关于&机械交易系统&
摘要: 样书还没收到。google搜了一下,应该是这本 /gp/product ... glancen=283155原价接近$90,打折以后还有$72,Amazon的综合评价是4星,值得一看。中国讲交易系统的书目前看来只有波涛的《系统交易 ...
样书还没收到。google搜了一下,应该是这本 /gp/product ... glance&n=283155原价接近$90,打折以后还有$72,Amazon的综合评价是4星,值得一看。中国讲交易系统的书目前看来只有波涛的《系统交易方法》,读完以后我的评价如下。作者:波涛概要:介绍系统交易方法。总结:1.介绍交易系统的理论基础,必要性,设计过程。2.交易系统性能的衡量方法。3.交易系统的优化方法,过度优化的危害。Muyir评价:这本书是波涛先生的大作之一,大概也是中国唯一一本介绍系统交易的书。相对来说,书写的浅显易懂,有些方面写的不够深入。另外一个比较大的遗憾是没有涉及一点资金管理的知识。不过,总的说来,不愧是一本好书。应当说,国外的机械系统交易水平肯定远远高于中国的。我曾经读过Charlie Wright的《Trading as a business》,这个比较简短,算不上书,不过还是收益颇多。作者:Charlie Wright概要:系统交易的必要性介绍和可行性分析,资金管理。总结:1.市场上应当具备的一些理念。2.投机者分类,市场分类,以及对应的策略。3.如何建立系统交易策略,举例。如何优化。4.资金管理。Muyir评价:非常好的一本书。书中详尽介绍了系统交易的方法论,步骤非常详细,而且例子也非常恰当。最后关于资金管理的介绍也非常精彩,是学习系统交易的一本好书。关于Charlie Wright的经历的介绍(还算成功的交易者):1973年在南佛罗里达大学获得艺术学士学位,1977年在哈佛大学商业管理硕士学位在多个公司和协会任过职80年代开始交易生涯曾经教授过System Trading and Development和Trading as a Business两门课程1998年出版Trading as a Business一书2002年担任Fall River Capital公司主席。该基金02年收益33%,03年24%,04年5%,05年-10%;其中Max Drawdown到过27%&机械交易系统&从目录看更为系统全面,这就是我感兴趣的原因。既然自己要精读一遍,何不顺便翻译一下造福大家,呵呵。
责任编辑:张汇 ,
来源:贵金属网
[免责声明]:本文所载资料仅供参考,并不构成任何建议,发布本文之目的在于传播更多信息,并不意味着本网赞同或者否定本文部分以及全部观点或内容。贵金属网对该资料或使用该资料所导致的结果概不承担任何责任。若资料与原文有异,概以原文为准。
稿件作者()
真实姓名:张汇
介绍:贵金属网目前已成为国内最大的贵金属黄金资讯门户网站,为黄金投 ...
路演直播:
相关阅读 23:48 23:25 23:00 23:00 22:52 21:47 21:43 21:28 21:00 20:54
论坛最新执帖作者:
最后回复时间:作者:
最后回复时间:作者:
最后回复时间:作者:
最后回复时间:作者:
最后回复时间:作者:
最后回复时间:作者:
最后回复时间:作者:
最后回复时间:作者:
最后回复时间:作者:
最后回复时间:
千足金收兑价:309.26
金条(浇铸)
品牌金条(压铸)
批发价:339
批发价:341
指导价:349
指导价:351
回购价:324
回购价:324
回购价:---
回购价:--
美国就业不济、沙特油长更替,非美贵金属油做多
21:25:24基本分析面:  上周非农业就业率经济数据表现低迷,

我要回帖

更多关于 ps4 gt赛车 的文章

 

随机推荐