Spring是如何创建bean创建对象的

10 篇文章 1 订阅
订阅专栏

一、Spring是如何创建bean创建对象的

比如有以下两个service实例:

@Component("orderService")
public class OrderService(){
}
@Component("userService")
public class UserService(){
	@Autowired
	private OrderService orderService;
	
	public void test(){
        System.out.println(orderService);
    }
}

Spring也是java写的,根据我们对java的基本认知,要创建一个对象,需要基于对应的类里面的构造方法。
在spring中并没有显示声明特殊的构造方法,那么就使用的是无参的构造方法。
userService -----> 无参构造方法 -----> 对象
此时此刻,得到的userService对象中的属性orderService是没有值的。(相当于 new UserService())

但是相信大家用过都知道,使用getBean返回的userService对象中orderService属性是有值的。

到这里区别就出来了。
在Spring内部通过构造方法生成的对象并不是我们上面理解的那样,二者之间还是有一区别的中间还有一些其他步骤。
userService -----> 无参构造方法 -----> 对象-----> 依赖注入-----> spring内部一些其他步骤----->Bean 对象
依赖注入,这是非常重要的一个步骤。笼统的说,依赖注入就是给对象的属性赋值(@Autowired @Resource @Inject 注解修饰的属性

UserService userSerice1 = new UserService();
//伪代码
for(Field fields : userService1.getDeclaredFields()){
    if(field.isAnnotationPresent(Autowired.class)){
       field.set(userService1,??);
    }
}
//............................

1、推断构造方法

这里先插一个点,比如在userService中,手动添加了一个构造方法,

@Component
public class UserService{
    
    private OrderService orderService;
    
    public UserService(OrderService orderService){
        this.orderService = orderService;
        System.out.println("1");
    }
}

此时userService中有几个构造方法呢?
这个时候只有一个构造方法了。再调用无参构造方法的时候就会报错在这里插入图片描述
如果类没有构造方法,java会把我们默认一个无参的构造方法,如果自己手动加了构造方法,那么java就不会默认有无参构造方法了,如果需要的话,需要自己手动声明。

@Component
public class UserService{

    private OrderService orderService;

    public UserService(){
        System.out.println("0");
    }
    
    public UserService(OrderService orderService){
        this.orderService = orderService;
        System.out.println("1");
    }
}

现在共有两个构造方法,那么 spring会用哪个呢?
可以跑下程序看下效果
在这里插入图片描述打印出0,走的是无参的构造方法

那是不是第二个有参数的方法不能用呢?我们把无参构造方法注释掉,发现是可以正常使用的,打印了1

那既然Spring两个构造方法都可以用,为什么用无参的构造方法呢?怎么选择的呢?

这个稍后分析,我们现在再加个构造方法

@Component
public class UserService{

    private OrderService orderService;

    public UserService(OrderService orderService){
        this.orderService = orderService;
        System.out.println("1");
    }

    public UserService(OrderService orderService,OrderService orderService1){
        this.orderService = orderService;
        System.out.println("2");
    }
}

现在依然是2个构造方法,现在spring会用哪个构造方法呢?
运行下程序,发现在实例化的时候报错了

为什么有两个构造方法的时候报错呢?都用不了么?在上面已经测试了,一个参数的构造方法Spring是可以使用的,那么两个参数的构造方法Spring不能用么??

很简单,可以把一个参数的构造方法注释了,只留下2个参数的构造方法,发现是可以正常执行的。

那么既然这三个构造方法(无参、一个参数、两个参数)都可以单独使用,为什么一起声明出来的时候会报错呢?
      对于Spring来说,发现一个类里面有两个/多个构造方法,spring该怎么选择呢??其实是没有办法进行决策的,所以就直接报错了
      那为什么无参和一个参数的构造方法两个一起声明可以正常执行呢?
      Spring发现一个类里面有多个构造方法且没有明确指定使用哪个构造方法的情况下,会优先找是否有无参的构造方法,无参的构造方法是java默认提供的,没有太多的业务逻辑,更方便去创建对象,spring也是类似于这样一个逻辑。
      当声明了无参和一个参数的构造方法,spring默认找无参的构造方法,找到了,直接使用,正常初始化
      当声明了一个参数和两个参数的构造方法,spring默认找无参的构造方法,没有找到,所以就报错了。其实在报错信息里面也可以看出来,错误是:xxx.UserService.< init>() 这个<init>()就代表的是无参的构造方法
      当只声明一个构造方法,spring不需要选择,直接使用,也可以正常执行

这个过程也可以称为:推断构造方法
userService -----> 推断构造方法 -----> 对象-----> 依赖注入-----> spring内部一些其他步骤----->Bean 对象

当然,也可以明确告诉spring使用哪个构造方法生成对象(多个构造方法的情况下)
在对应的构造方法上面增加 @Autowired 注解

@Component
public class UserService{

    private OrderService orderService;

    public UserService(OrderService orderService){
        this.orderService = orderService;
        System.out.println("1");
    }

    @Autowired
    public UserService(OrderService orderService,OrderService orderService1){
        this.orderService = orderService;
        System.out.println("2");
    }
}

运行程序,发现可以正常执行了。
那如果,在多个构造方法上面加上了 @Autowired注解,spring不知道如何选择,仍然是会报错的。

2、什么是先bytype再byName

比如以上代码,指定了使用一个参数的构造方法,这个构造方法是需要参数的,spring在调用的时候会给参数赋值么?
可以打断点看下,运行代码
在这里插入图片描述
      可以看到执行到这里的时候,参数是有值的。那spring是从哪里拿到orderService对象来赋值给参数的呢?
      因为orderService也是一个bean,spring在执行到这里的时候,发现需要一个orderService对象,会先从单例池中去找,是否存在orderService的bean对象。
      如果有,就直接拿来使用
      如果没有,不会传一个null进去,而是会创建一个orderBean对象,(这里呢就可能出现循环依赖的情况,具体可前往 循环依赖介绍及场景查看)创建完成之后,会放入单例池,并将创建的bean对象传给userService的构造方法参数使用。

      单例池是一个map,map的值是bean的名字,value是bean对象,那spring具体该怎么去map中去找呢?现在只需要一个orderService的对象,是根据入参的名字把它当做map的key去找,这样可不可以呢?
      首先,根据入参名称当做key肯定是不可以的,一般情况下参数命名不会很规范,如就存在以下情况
在这里插入图片描述
其实希望获取的是orderService的对象,如果根据入参名称取,取得就是一个memberService对象,就会有问题。
      所以Spring会先根据类型去找。判断单例池的map中是否有bean对象的类型是orderService,如果有就直接拿来使用。
      当然这样直接根据类型去找也会有问题,单例池map的key是唯一的,并不代表value是唯一的,可能会存在<orderService,OrderService>,<orderService1,OrderService>,<orderService2,OrderService>,这三个都是OrderService类型,但是是不同的对象,只根据类型寻找,会找到3个数据,那怎么区分到底使用哪个呢?
     这里穿插一个问题。如果说orderService是一个单例bean,那么就表示在Spring容器中只能有一个类型为OrderService的对象么?答案是否定的,可以有多个,需要保证多个bean的名称不同即可。单例bean的效果是传入同一个名多次获取,结果是同一个对象。需要和单例模式区分开
      需要从3个对象中找到一个,可以思考下这三个对象有什么是唯一的,很明显就是bean的名字。所以spring接着会根据入参的名字从找到的数据中进行匹配(当然,如果根据类型只找到了一条数据就不需要根据名称去找了)
      根据名称去匹配,要么匹配到一个对象直接使用,要么没有匹配到 直接报错,
在这里插入图片描述
需要一个orderService对象,找到3个bean,名称分别为:orderService,orderService1,orderService2

这个就是所说的先bytype,后byname

userService -----> 推断构造方法 -----> 对象-----> 依赖注入-----> spring内部一些其他步骤----->Bean 对象

二、什么是单例池?作用是什么?

对于userService而言,默认情况下是一个单例bean,那么单例bean体现的效果是什么样子呢?
比如有以下代码:

UserService userService = (UserService)applicationContext.getBean("userService");
UserService userService1 = (UserService)applicationContext.getBean("userService");
UserService userService2 = (UserService)applicationContext.getBean("userService");

通过getBean获取3次bean,最终返回的结果是同一个对象(指向同一地址的)
在这里插入图片描述

可以先思考下,底层是如何实现的呢?
相信大家很快就想出来了,可以使用map实现,保证key唯一。
<名字,对象>,getBean时先从map中找是否存在需要的对象。有的话就直接返回了,所以一个名字对应一个对象,相同名称会返回相同对象。
如果在map中根据名字没有找到对象,就需要去创建一个对象了,然后会把创建对象放入map中,第二次/第三次获取的时候就可以直接从map中获取了。
userService -----> 推断构造方法 -----> 对象-----> 依赖注入----->放入单例池map ----->spring内部一些其他步骤----->Bean 对象

这个map呢就是spring中的单例池(在Spring源码底层,单例池singletonObjects ConcurrentHasnMsp<beanName,bean对象>

也就是说
因为map里面存储的就是单例bean对象,所以叫单例池。
反过来想一下,如果三次获取的userService都是原型bean(也就是多例bean,每次getBean,返回的都是不同的bean),那在创建Springbean的时候就不需要单例池了
userService -----> 推断构造方法 -----> 对象-----> 依赖注入----->放入单例池map (若是多例bean,则不需要该步骤)----->spring内部一些其他步骤----->Bean 对象

三、bean对象和普通对象之间的区别是什么?

到这里,相比大家都理解了,通常说的Spring中bean对象到底是什么样子了。
其实通过无参构造方法创建出的对象和最终生成的bean对象,大部分情况下二者是同一个对象,只不过是处于不同时期而已。



这里先引入初始化的概念,接着会详细介绍
userService -----> 推断构造方法 -----> 对象-----> 依赖注入----->初始化前----->初始化----->初始化后----->放入单例池map (若是多例bean,则不需要该步骤)----->spring内部一些其他步骤----->Bean 对象

四、初始化前

比如有以下业务场景
新增User类

public class User{
}

在userSerice中增加user属性。

@Component
public class UserService{

    @Autowired
    private OrderService orderService;

    private User admin;

    public void test(){
        System.out.println(orderService);
    }
}

类中的user是管理员用户,一般情况下,管理员只有一个,如果希望在getBean获取userService之后,其中的admin属性就是有值的。
现在获取到的是空值,希望可以获取到数据中存储的admin的信息。

这里呢,有小伙伴说,可以在userService中的admin上面加上Autowired注解,然后在User类上加上Component注解当做一个bean对象不就可以自动注入了么?
这样做,admin属性是会有值,但是spring相当于只做了个 new User()的动作,并不是我们希望的数据库中的值。

可以再深入思考下,对于spring来说,怎么知道要查哪个表?查哪个字段?等这些信息
这些其实spring都是不知道的,只有程序员自己知道,所以这个时候就需要提供一个方法,在方法中自己去执行SQL查询管理员信息。

public class UserService{
    @Autowired
    private OrderService orderService;

    private User admin;

    public void a(){
        //mysql--管理员信息---user对象--admin
    }
    
    public void test(){
        System.out.println(orderService);
    }
}

有了方法之后,spring就可以去调用该方法去执行了(也就是在创建bean的过程中,自动调用service中的a方法)。
userService ----->推断构造方法 -----> 对象-----> 依赖注入----->初始化前(a())----->初始化----->初始化后----->放入单例池map (若是多例bean,则不需要该步骤)----->spring内部一些其他步骤----->Bean 对象

现在最主要的就是,spring怎么知道需要在初始化前调用a方法呢?service中可能有很多方法, spring怎么确定呢?敲代码的小伙伴就要想办法让a方法变得更特殊一点,那么实现呢?其实也很简单,Spring中有提供注解PostConstruct

    @PostConstruct
    public void a(){
        //mysql--管理员信息---user对象--admin
    }

spirng在执行到初始化前时会去找前面生成对象里面有没有存在用PostConstruct注解修饰的方法,然后用反射的方式执行这些方法
userService -----> 推断构造方法 -----> 对象-----> 依赖注入----->初始化前(@PostConstruct)----->初始化----->初始化后----->放入单例池map (若是多例bean,则不需要该步骤)----->spring内部一些其他步骤----->Bean 对象

五、初始化

对于上述的需求,还可以使用另一种方法实现。
主要目的是为了使a方法更特殊一点,那么可以通过什么方式让userService中的a方法特殊一点呢?
比如说,实现接口:InitializingBean
userService -----> 推断构造方法 -----> 对象-----> 依赖注入----->初始化前(@PostConstruct)----->初始化(InitializingBean)----->初始化后----->放入单例池map (若是多例bean,则不需要该步骤)----->spring内部一些其他步骤----->Bean 对象
这个是spring框架提供的一个接口,类里面只有一个接口:afterPropertiesSet
在这里插入图片描述
需要在service中实现对应的方法

public class UserService implements InitializingBean {
    @Autowired
    private OrderService orderService;
    private User admin;

    @Override
    public void afterPropertiesSet() throws Exception {
        //mysql--管理员信息---user对象--admin
    }
    public void test(){
        System.out.println(orderService);
    }
}

其实在初始化的过程中,就相当于在处理InitializingBean接口,在初始化这一步,spring先判断当前bean对象是否有afterPropertiesSet方法,如果存在,要去调用。
spring怎么判断当前对象有没有afterPropertiesSet方法呢?这里可以简单来看下源码

在doCreateBean方法中,若实例对象为空,则会创建一个对象,相当于new了一个对象在这里插入图片描述
继续往下走,会填充bean的属性(被@Autowired @Resource @Inject 注解修饰的属性)
然后会初始化其他信息
在这里插入图片描述
在初始化的方法里面,我们可以看到调用了方法applyBeanPostProcessorsBeforeInitialization,这里是处理 第四点里面介绍的被注解@PostConstruct修饰的方在这里插入图片描述
接下来就会执行初始化方法
会先判断是否实现接口,实现会强制转换类型,直接调用方法
在这里插入图片描述

六、Bean的初始化和Bean实例化区别是什么?

Bean的实例化:
userService -----> 推断构造方法 -----> 对象-----
简单说就是通过构造方法得到一个对象

Bean的初始化:
userService -----> -----初始化(InitializingBean)-----
简单说就是调用InitializingBean接口的初始化方法 或者 通过@PostConstruct去指定一个初始化的方法。
总而言之,可以理解为Bean的初始化其实就是去执行实例化出来的对象中的某个方法,至于在初始化的方法里面实现什么逻辑,spring是不管的。
如果在初始化方法中抛了异常出来,spring也会抛异常出来,在创建bean的过程中出异常了,那么会导致整个bean对象创建失败

七、初始化后

spring中主要创建bean的一个流程:userService -----> 推断构造方法 -----> 对象-----> 依赖注入----->初始化前(@PostConstruct)----->初始化(InitializingBean)----->初始化后(AOP)----->放入单例池map ----->spring内部一些其他步骤----->Bean 对象

假设:userService这个bean需要进行AOP,AOP完成会通过动态代理产生一个代理对象,我们把之前产生的对象称为普通对象。

那最终放入单例池中的是普通对象还是代理对象呢?
如果没有AOP,不会产生代理对象,那么很明显,放入单例池的就是普通对象
如果有AOP,最终是将代理对象放入单例map。既然userService有AOP的逻辑,那么通过getBean从单例池中拿bean对象的时候,就需要拿到有AOP逻辑的对象,因为会用到,,所以最后放入单例池的是代理对象
userService -----> 推断构造方法 -----> 普通对象-----> 依赖注入----->初始化前(@PostConstruct)----->初始化(InitializingBean)----->初始化后(AOP)----->代理对象----->放入单例池map ----->Bean 对象

AOP的工作原理可以前往 Spring的AOP和事务是如何工作的?查看

Spring系列第5篇:创建bean实例这些方式你们都知道?
znbcj的博客
08-24 122
创建一个静态工厂类,用于生成UserModel对象。/*** 公众号:路人甲Java,工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!*//*** 静态无参方法创建UserModel* @return*/userModel.setName("我是无参静态构造方法创建的!");/*** 静态有参方法创建UserModel* @param name 名称* @param age 年龄* @return*/
Spring创建bean对象三种方式代码实例
08-18
// 使用工厂bean创建MyBean <bean id="myBean" factory-bean="myFactory" factory-method="createInstance"/> ``` 总结,Spring框架提供了灵活的方式来创建Bean对象,可以根据具体需求选择合适的方法。无参构造方法...
Spring 如何创建 bean 对象
WriteOnRead
03-08 401
前情回顾 前文「Spring 如何从 IoC 容器中获取对象?」从整体上分析了如何从 Spring IoC 容器获取一个 bean 对象。该逻辑由 AbstractBeanFactory#...
Springbean到底是如何创建的?
最新发布
人生若只初相见@的博客
08-06 1万+
众所周知,spring对于java程序员来说是一个及其重要的后端框架,几乎所有的公司都会使用的框架,而且深受广大面试官的青睐。所以本文就以常见的一个面试题"spring bean的生命周期"为切入点,从源码的角度带领大家来看一看 spring bean到底是如何创建的 。
Spring如何创建一个Bean对象?
led1114的博客
07-24 682
源码
spring创建bean的方式
weixin_63001822的博客
05-23 1040
各种定义bean的方式
spring框架如何创建bean实例
07-26 193
三种方式:1.通过bean的默认的构造方法实例化bean配置文件:<bean id="" class="类的全路径"/>2.通过静态工厂方式创建bean实例<bean id="" class="工厂类的全路径" factory-method="实例化bean的静态方法"/>3.通过实例工厂的方式创建bean实例先创建工厂类的实例<bean id=""...
Spring-Bean创建对象的步骤方式详解
08-25
Spring-Bean 创建对象的步骤方式详解 Spring-Bean 创建对象Spring 框架中一个核心概念,它允许开发者通过配置文件或注解的方式来创建对象。下面我们将详细介绍 Spring-Bean 创建对象的步骤方式。 通过无参构造...
Spring Bean创建初始化流程.docx
03-04
以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`AnnotationConfigApplicationContext`类创建一个上下文实例,通常传入一个或多个配置类(`annotatedClasses`),...
spring实现bean对象创建代码详解
08-28
Spring实现Bean对象创建代码详解 Spring框架是 Java 企业级应用程序的核心框架之一,它提供了一个灵活的、可扩展的方式来管理 Java 对象的生命周期。今天,我们将详细探讨 Spring 实现 Bean 对象创建代码详解的过程...
Spring Boot如何动态创建Bean示例代码
08-29
Spring Boot动态创建Bean示例代码详解 Spring Boot框架中提供了多种方式来创建Bean,今天我们就来学习其中的一种,即动态创建Bean。动态创建Bean可以根据特定的条件来决定是否创建Bean,这在实际开发中非常有用。 ...
Spring第5篇:创建bean这些方式你们都知道么?
chenzoff的专栏
04-11 763
本文内容 1.通过反射调用构造方法创建bean对象 2.通过静态工厂方法创建bean对象 3.通过实例工厂方法创建bean对象 4.通过FactoryBean创建bean对象 5.Spring容器内部创建bean实例对象常见的有4种方式。 通过反射调用构造方法创建bean对象 调用类的构造方法获取对应的bean实例,是使用最多的方式,这种方式只需要在xml bean元素中指定class属性,spring容器内部会自动调用该类型的构造方法来创建bean对象,将其放在容器中以供使用。 语法
Spring框架|创建Bean对象的三种方式
匿名攻城狮
01-25 3353
文章目录一、无参构造函数(常用)二、静态工厂三、实例工厂(鸡肋)测试类实体类XML配置 一、无参构造函数(常用) 在spring的配置文件中使用bean标签,配以id和class属性,且没有其他属性和标签时。采用的就是默认构造函数创建bean对象。此时如果类中没有默认构造函数,则对象无法创建。 <bean id="p" class="com.gql.entity.Person">&...
spring创建bean的方式
清华大咖
07-20 2441
一、常见的bean创建方式 (1)基于xml配置bean (2)使用@Component派生注解 (3)使用@Configuration和@Bean注解 1、常见的使用xml中setter方法创建bean bean.xml文件中配置bean时,加上<property>标签设置bean所需参数 <bean id="bookManageDao" class="com.swys...
spring创建Bean对象的方式
code for life
02-20 1194
一、直接创建bean <bean id="accountserviceimpl" class="com.itheima.service.impl.AccountServiceImpl" ></bean> 此种方式是: 两个标签分别是id(根据这个唯一标识,能够找到此bean)class(所对应的类的全名称) 二、spring管理静态工厂-使用静态工厂的方法创建对象 p...
Spring创建对象的方式3种方式
weixin_34355881的博客
06-10 178
此文为基础回顾,估计是最后一次总结。 项目利用maven进行架构,其基本项目结构为: 其中pom.xml中的内容为: &lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="h...
Spring 创建Bean的6种方式
dianruipai1258的博客
06-20 541
前言 本文讲解了在Spring 应用中创建Bean的多种方式,包括自动创建,以及手动创建注入方式,实际开发中可以根据业务场景选择合适的方案。 方式1: 使用Spring XML方式配置,该方式用于在纯Spring 应用中,适用于简单的小应用,当应用变得复杂,将会导致XMl配置文件膨胀 ,不利于对象管理。 <bean id="xxxx" class="xxxx.x...
Spring: Bean的创建原理解析
GIS摆渡人
08-04 2337
SpringBean的创建过程其实就是从一个普通对象蜕变成Bean的一个过程,蜕变包括依赖注入,初始化等步骤。最后在看下这个类是否有被AOP或开启事务有的话会额外生成代理对象作为Bean。
实战:详解Spring创建bean的流程(图解+示例+源码)
为无为,事无事,味无味。
07-18 2742
我们来看下 Spring Framework 的官方文档:简而言之,bean 是由 Spring IoC 容器实例化、组装和管理的对象。对于普通的 Java 对象,当 new 的时候创建对象,然后该对象就能够使用了。一旦该对象不再被使用,则由 Java 自动进行垃圾回收。而 Spring 中的对象bean,bean 和普通的 Java 对象没啥大的区别,只不过 Spring 不再自己去 new 对象了,而是由 IoC 容器去帮助我们实例化对象并且管理它,我们需要哪个对象,去问 IoC 容器要即可。
写文章

热门文章

  • 解决键盘每个键只能按一次 19737
  • js数字转换成汉字 4805
  • IDEA收藏代码、快速打开favorites收藏窗口 3761
  • Java小知识点之lambda 2821
  • Java中的数据类型 2805

分类专栏

  • 新媒体运营
  • 多线程并发 4篇
  • 大数据
  • Java基础 17篇
  • 日常总结
  • js常用小知识点 4篇
  • SSM 10篇
  • 面试
  • 数据库 18篇
  • Java常用小知识点 6篇
  • 设计模式 2篇
  • 微服务 3篇
  • 工具使用 3篇
  • 运维相关 6篇
  • css常用小知识点 1篇
  • 计算机使用 2篇

最新评论

  • 线程池介绍

    CSDN-Ada助手: 推荐 Java 技能树:https://edu.csdn.net/skill/java?utm_source=AI_act_java

  • redis的hash一致性、哨兵、集群

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)提升标题与正文的相关性。

  • redis的hash一致性、哨兵、集群

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)提升标题与正文的相关性。

  • Redis常用命令操作String类型数据+hash命令+list命令

    CSDN-Ada助手: Python 和Java/Go 相比,有哪些便利的地方?

  • Redis常用命令操作String类型数据+hash命令+list命令

    CSDN-Ada助手: Python 和Java/Go 相比,有哪些便利的地方?

最新文章

  • 多线程中常见问题
  • 线程池介绍
  • 生产者消费者模型
2024年3篇
2023年1篇
2022年17篇
2021年54篇
2020年4篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家万象城玻璃钢雕塑常州安卡通玻璃钢雕塑赣州抽象玻璃钢雕塑生产厂家开封室内玻璃钢雕塑厂家玻璃钢抽象爱情雕塑图片江门玻璃钢雕塑供货厂家廊坊清远玻璃钢切面动物雕塑湖南定制玻璃钢雕塑供应商信阳玻璃钢雕塑制作玻璃钢星座卡通雕塑大型商场美陈生产公司中山楼盘玻璃钢人物雕塑玻璃钢文字音符雕塑实力商家濮阳玻璃钢人物大型园林雕塑公司高淳商场美陈布展白色玻璃钢花盆厂家直销广州动物玻璃钢雕塑制作黄山个性化玻璃钢雕塑价位崭新的玻璃钢雕塑常德株洲玻璃钢雕塑设计铜山玻璃钢造型雕塑南通酒店玻璃钢雕塑设计菏泽标牌玻璃钢雕塑青海玻璃钢雕塑公司江苏源头玻璃钢雕塑厂家公司新疆库尔勒玻璃钢雕塑厂家新郑附近玻璃钢雕塑潮州玻璃钢动物雕塑报价表商场金色美陈布置装饰玻璃钢雕塑用什么玻璃丝香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化