zoukankan      html  css  js  c++  java
  • Spring学习笔记18--通过工厂方法配置Bean

    spring通过工厂方法配置Bean

    1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)

    调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,
    而不关心创建对象的细节。
    要声明通过静态方法创建bean:
       1.需要在bean的class属性里指定拥有该方法的类,
       2.同时在factory-method属性里指定工厂方法的名称,
       3.最后,使用<constrctor-arg>元素为该方法传递方法参数。
    [html] view plain copy
     
    1. <!--  
    2.             通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例,  
    3.     且注意对应类是包含静态工厂方法的类  
    4.     class属性:指向静态工厂方法的全类名  
    5.     factory-method:指向静态工厂方法中的名字  
    6.     constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数  
    7.     -->  
    8. <bean id="car1"  
    9.    class="com.wul.spring.bean.factory.StaticCarFactory"  
    10.    factory-method="getCar">  
    11.    <constructor-arg value="audi"></constructor-arg>  
    12. </bean>  

    2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)

    实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
     
      1.先声明实例工厂类的bean
    声明通过实例工厂方法创建的bean:
      2.在bean的factory-bean属性里指定拥有该该工厂方法的bean
      3.在factory-method属性里指定该工厂方法的名称。
      4.使用constructor-arg元素为工厂方法传递方法参数。
    [html] view plain copy
     
    1. <!-- 1.配置工厂的实例 -->  
    2. <bean id="carFactory"   
    3.       class="com.wul.spring.bean.factory.InstanceCarFactory"></bean>  
    4. <!--   
    5.     2.通过实例工厂来配置bean     
    6.         class属性:指向实例工厂方法的全类名  
    7.         factory-method:指向实例工厂方法的名字  
    8.         constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数  
    9. -->   
    10.  <bean id="car2" factory-bean="carFactory"  
    11.       factory-method="getCar">  
    12.       <constructor-arg value="ford"></constructor-arg>  
    13.  </bean>  

    3.spring通过FactoryBean配置

    当配置的bean里需要引用其他的bean------------通过FactoryBean配置是最好的方式

    1.自定义的Factory需要实现FactoryBean接口
    [java] view plain copy
     
    1. public class CarFactoryBean implements FactoryBean<Car>{  
    2.   
    3.     private String brand;  
    4.       
    5.     public void setBrand(String brand) {  
    6.         this.brand = brand;  
    7.     }  
    8.       
    9.     //返回bean的对象  
    10.     @Override  
    11.     public Car getObject() throws Exception {  
    12.         return new Car(brand,500000);  
    13.     }  
    14.       
    15.     //返回的bean的类型  
    16.     @Override  
    17.     public Class<?> getObjectType() {  
    18.         // TODO Auto-generated method stub  
    19.         return Car.class;  
    20.     }  
    21.       
    22.     //是否是单例的  
    23.     @Override  
    24.     public boolean isSingleton() {  
    25.         // TODO Auto-generated method stub  
    26.         return true;  
    27.     }  
    28.   
    29. }  


    2.配置bean
    [html] view plain copy
     
    1. <!--       
    2.              通过FactoryBean来配置Bean的实例  
    3.     class:指向FactoryBean的全类名  
    4.     property:配置FactoryBean的属性   
    5.       
    6.     注意:实际返回的实例是FactoryBean的getObject()方法返回的实例  
    7. -->  
    8.     <bean id="car1"  
    9.         class="com.wul.spring.bean.factoryBean.CarFactoryBean">  
    10.         <property name="brand" value="BMW"></property>  
    11.     </bean>  


    下面给出示例:
     

    spring通过工厂方法配置Bean:

    Car.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factory;  
    2.   
    3. public class Car {  
    4.       
    5.     private String brand;  
    6.       
    7.     private double price;  
    8.   
    9.     public String getBrand() {  
    10.         return brand;  
    11.     }  
    12.   
    13.     public void setBrand(String brand) {  
    14.         this.brand = brand;  
    15.     }  
    16.   
    17.     public double getPrice() {  
    18.         return price;  
    19.     }  
    20.   
    21.     public void setPrice(double price) {  
    22.         this.price = price;  
    23.     }  
    24.   
    25.     @Override  
    26.     public String toString() {  
    27.         return "Car [brand=" + brand + ", price=" + price + "]";  
    28.     }  
    29.   
    30.     public Car(String brand, double price) {  
    31.         super();  
    32.         this.brand = brand;  
    33.         this.price = price;  
    34.     }  
    35.       
    36.       
    37. }  
    StaticCarFactory.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factory;  
    2.   
    3. import java.util.HashMap;  
    4. import java.util.Map;  
    5.   
    6.   
    7. /*静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例*/  
    8. public class StaticCarFactory {  
    9.       
    10.     private static Map<String , Car> cars = new HashMap<String,Car>();  
    11.       
    12.     static{  
    13.         cars.put("audi"new Car("Audi",300000));  
    14.         cars.put("ford"new Car("Ford",400000));  
    15.     }  
    16.       
    17.     //静态工厂方法,不需要创建StaticCarFactory对象情况下,通过该方法可以得到对应实例。  
    18.     public static Car getCar(String brand){   
    19.         return cars.get(brand);  
    20.     }  
    21. }  


     
    InstanceCarFactory.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factory;  
    2.   
    3. import java.util.HashMap;  
    4. import java.util.Map;  
    5.   
    6. /* 
    7.  * 实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 
    8.  *       返回bean的实例 
    9.  */  
    10. public class InstanceCarFactory {  
    11.       
    12.     private Map<String,Car> cars = null;  
    13.       
    14.     public InstanceCarFactory(){  
    15.         cars = new HashMap<String,Car>();  
    16.         cars.put("audi"new Car("Audi",300000));  
    17.         cars.put("ford"new Car("Ford",400000));  
    18.     }  
    19.       
    20.     public Car getCar(String brand){  
    21.         return cars.get(brand);  
    22.     }  
    23. }  
    bean-factory.xml
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
    5.   
    6.     <!--  
    7.                 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例,  
    8.         且注意对应类是包含静态工厂方法的类  
    9.         class属性:指向静态工厂方法的全类名  
    10.         factory-method:指向静态工厂方法中的名字  
    11.         constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数  
    12.         -->  
    13.     <bean id="car1"  
    14.        class="com.wul.spring.bean.factory.StaticCarFactory"  
    15.        factory-method="getCar">  
    16.        <constructor-arg value="audi"></constructor-arg>  
    17.     </bean>  
    18.       
    19.     <!-- 1.配置工厂的实例 -->  
    20.     <bean id="carFactory"   
    21.           class="com.wul.spring.bean.factory.InstanceCarFactory"></bean>  
    22.     <!--   
    23.         2.通过实例工厂来配置bean     
    24.             class属性:指向实例工厂方法的全类名  
    25.             factory-method:指向实例工厂方法的名字  
    26.             constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数  
    27.     -->   
    28.      <bean id="car2" factory-bean="carFactory"  
    29.           factory-method="getCar">  
    30.           <constructor-arg value="ford"></constructor-arg>  
    31.      </bean>    
    32.       
    33. </beans>  


    Mainfactory.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factory;  
    2.   
    3. import org.springframework.context.ApplicationContext;  
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    5.   
    6. public class Mainfactory {  
    7.     public static void main(String[] args) {  
    8.           
    9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");  
    10.           
    11.         //静态工厂方法测试:  
    12.         Car car1 = (Car) ctx.getBean("car1");  
    13.         System.out.println(car1);  
    14.           
    15.         //实例工厂方法测试:  
    16.         Car car2 = (Car) ctx.getBean("car2");  
    17.         System.out.println(car2);  
    18.     }  
    19. }  

    通过FactoryBean来配置Bean

    Car.java(同上)
     
    CarFactoryBean.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factoryBean;  
    2.   
    3. import org.springframework.beans.factory.FactoryBean;  
    4.   
    5. //自定义的Factory需要实现FactoryBean接口  
    6. public class CarFactoryBean implements FactoryBean<Car>{  
    7.   
    8.     private String brand;  
    9.       
    10.     public void setBrand(String brand) {  
    11.         this.brand = brand;  
    12.     }  
    13.       
    14.     //返回bean的对象  
    15.     @Override  
    16.     public Car getObject() throws Exception {  
    17.         return new Car(brand,500000);  
    18.     }  
    19.       
    20.     //返回的bean的类型  
    21.     @Override  
    22.     public Class<?> getObjectType() {  
    23.         // TODO Auto-generated method stub  
    24.         return Car.class;  
    25.     }  
    26.       
    27.     //是否是单例的  
    28.     @Override  
    29.     public boolean isSingleton() {  
    30.         // TODO Auto-generated method stub  
    31.         return true;  
    32.     }  
    33.   
    34. }  

    bean-factorybean.xml
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
    5.   
    6.       
    7. <!--       
    8.              通过FactoryBean来配置Bean的实例  
    9.     class:指向FactoryBean的全类名  
    10.     property:配置FactoryBean的属性   
    11.       
    12.     注意:实际返回的实例是FactoryBean的getObject()方法返回的实例  
    13. -->  
    14.     <bean id="car1"  
    15.         class="com.wul.spring.bean.factoryBean.CarFactoryBean">  
    16.         <property name="brand" value="BMW"></property>  
    17.     </bean>  
    18.   
    19. </beans>  
    MainFactoryBean.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factoryBean;  
    2.   
    3. import org.springframework.context.ApplicationContext;  
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    5.   
    6. public class MainFactoryBean {  
    7.       
    8.     public static void main(String[] args) {  
    9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml");  
    10.           
    11.         Car car = (Car) ctx.getBean("car1");  
    12.         System.out.println(car);  
    13.           
    14.     }  
    15. }  

    spring通过工厂方法配置Bean

    1.通过调用静态工厂方法创建bean(直接调用某一个类的静态方法就可以返回bean的实例)

    调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单的调用静态方法,
    而不关心创建对象的细节。
    要声明通过静态方法创建bean:
       1.需要在bean的class属性里指定拥有该方法的类,
       2.同时在factory-method属性里指定工厂方法的名称,
       3.最后,使用<constrctor-arg>元素为该方法传递方法参数。
    [html] view plain copy
     
    1. <!--  
    2.             通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例,  
    3.     且注意对应类是包含静态工厂方法的类  
    4.     class属性:指向静态工厂方法的全类名  
    5.     factory-method:指向静态工厂方法中的名字  
    6.     constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数  
    7.     -->  
    8. <bean id="car1"  
    9.    class="com.wul.spring.bean.factory.StaticCarFactory"  
    10.    factory-method="getCar">  
    11.    <constructor-arg value="audi"></constructor-arg>  
    12. </bean>  

    2.通过调用实例工厂方法创建bean(即先需要创建工厂bean本身,再调用工厂的实例方法来返回bean的实例)

    实例工厂方法:将对象的创建过程封装到另外一个对象实例方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
     
      1.先声明实例工厂类的bean
    声明通过实例工厂方法创建的bean:
      2.在bean的factory-bean属性里指定拥有该该工厂方法的bean
      3.在factory-method属性里指定该工厂方法的名称。
      4.使用constructor-arg元素为工厂方法传递方法参数。
    [html] view plain copy
     
    1. <!-- 1.配置工厂的实例 -->  
    2. <bean id="carFactory"   
    3.       class="com.wul.spring.bean.factory.InstanceCarFactory"></bean>  
    4. <!--   
    5.     2.通过实例工厂来配置bean     
    6.         class属性:指向实例工厂方法的全类名  
    7.         factory-method:指向实例工厂方法的名字  
    8.         constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数  
    9. -->   
    10.  <bean id="car2" factory-bean="carFactory"  
    11.       factory-method="getCar">  
    12.       <constructor-arg value="ford"></constructor-arg>  
    13.  </bean>  

    3.spring通过FactoryBean配置

    当配置的bean里需要引用其他的bean------------通过FactoryBean配置是最好的方式

    1.自定义的Factory需要实现FactoryBean接口
    [java] view plain copy
     
    1. public class CarFactoryBean implements FactoryBean<Car>{  
    2.   
    3.     private String brand;  
    4.       
    5.     public void setBrand(String brand) {  
    6.         this.brand = brand;  
    7.     }  
    8.       
    9.     //返回bean的对象  
    10.     @Override  
    11.     public Car getObject() throws Exception {  
    12.         return new Car(brand,500000);  
    13.     }  
    14.       
    15.     //返回的bean的类型  
    16.     @Override  
    17.     public Class<?> getObjectType() {  
    18.         // TODO Auto-generated method stub  
    19.         return Car.class;  
    20.     }  
    21.       
    22.     //是否是单例的  
    23.     @Override  
    24.     public boolean isSingleton() {  
    25.         // TODO Auto-generated method stub  
    26.         return true;  
    27.     }  
    28.   
    29. }  


    2.配置bean
    [html] view plain copy
     
    1. <!--       
    2.              通过FactoryBean来配置Bean的实例  
    3.     class:指向FactoryBean的全类名  
    4.     property:配置FactoryBean的属性   
    5.       
    6.     注意:实际返回的实例是FactoryBean的getObject()方法返回的实例  
    7. -->  
    8.     <bean id="car1"  
    9.         class="com.wul.spring.bean.factoryBean.CarFactoryBean">  
    10.         <property name="brand" value="BMW"></property>  
    11.     </bean>  


    下面给出示例:
     

    spring通过工厂方法配置Bean:

    Car.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factory;  
    2.   
    3. public class Car {  
    4.       
    5.     private String brand;  
    6.       
    7.     private double price;  
    8.   
    9.     public String getBrand() {  
    10.         return brand;  
    11.     }  
    12.   
    13.     public void setBrand(String brand) {  
    14.         this.brand = brand;  
    15.     }  
    16.   
    17.     public double getPrice() {  
    18.         return price;  
    19.     }  
    20.   
    21.     public void setPrice(double price) {  
    22.         this.price = price;  
    23.     }  
    24.   
    25.     @Override  
    26.     public String toString() {  
    27.         return "Car [brand=" + brand + ", price=" + price + "]";  
    28.     }  
    29.   
    30.     public Car(String brand, double price) {  
    31.         super();  
    32.         this.brand = brand;  
    33.         this.price = price;  
    34.     }  
    35.       
    36.       
    37. }  
    StaticCarFactory.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factory;  
    2.   
    3. import java.util.HashMap;  
    4. import java.util.Map;  
    5.   
    6.   
    7. /*静态工厂方法:直接调用某一个类的静态方法就可以返回Bean的实例*/  
    8. public class StaticCarFactory {  
    9.       
    10.     private static Map<String , Car> cars = new HashMap<String,Car>();  
    11.       
    12.     static{  
    13.         cars.put("audi"new Car("Audi",300000));  
    14.         cars.put("ford"new Car("Ford",400000));  
    15.     }  
    16.       
    17.     //静态工厂方法,不需要创建StaticCarFactory对象情况下,通过该方法可以得到对应实例。  
    18.     public static Car getCar(String brand){   
    19.         return cars.get(brand);  
    20.     }  
    21. }  


     
    InstanceCarFactory.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factory;  
    2.   
    3. import java.util.HashMap;  
    4. import java.util.Map;  
    5.   
    6. /* 
    7.  * 实例工厂方法:实例工厂的方法,即先需要创建工厂bean本身,再调用工厂的实例方法来 
    8.  *       返回bean的实例 
    9.  */  
    10. public class InstanceCarFactory {  
    11.       
    12.     private Map<String,Car> cars = null;  
    13.       
    14.     public InstanceCarFactory(){  
    15.         cars = new HashMap<String,Car>();  
    16.         cars.put("audi"new Car("Audi",300000));  
    17.         cars.put("ford"new Car("Ford",400000));  
    18.     }  
    19.       
    20.     public Car getCar(String brand){  
    21.         return cars.get(brand);  
    22.     }  
    23. }  
    bean-factory.xml
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
    5.   
    6.     <!--  
    7.                 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例,而是bean实例,  
    8.         且注意对应类是包含静态工厂方法的类  
    9.         class属性:指向静态工厂方法的全类名  
    10.         factory-method:指向静态工厂方法中的名字  
    11.         constructor-arg:如果某工厂方法需要传入参数,则使用constructor-arg来配置参数  
    12.         -->  
    13.     <bean id="car1"  
    14.        class="com.wul.spring.bean.factory.StaticCarFactory"  
    15.        factory-method="getCar">  
    16.        <constructor-arg value="audi"></constructor-arg>  
    17.     </bean>  
    18.       
    19.     <!-- 1.配置工厂的实例 -->  
    20.     <bean id="carFactory"   
    21.           class="com.wul.spring.bean.factory.InstanceCarFactory"></bean>  
    22.     <!--   
    23.         2.通过实例工厂来配置bean     
    24.             class属性:指向实例工厂方法的全类名  
    25.             factory-method:指向实例工厂方法的名字  
    26.             constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg来配置参数  
    27.     -->   
    28.      <bean id="car2" factory-bean="carFactory"  
    29.           factory-method="getCar">  
    30.           <constructor-arg value="ford"></constructor-arg>  
    31.      </bean>    
    32.       
    33. </beans>  


    Mainfactory.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factory;  
    2.   
    3. import org.springframework.context.ApplicationContext;  
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    5.   
    6. public class Mainfactory {  
    7.     public static void main(String[] args) {  
    8.           
    9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factory.xml");  
    10.           
    11.         //静态工厂方法测试:  
    12.         Car car1 = (Car) ctx.getBean("car1");  
    13.         System.out.println(car1);  
    14.           
    15.         //实例工厂方法测试:  
    16.         Car car2 = (Car) ctx.getBean("car2");  
    17.         System.out.println(car2);  
    18.     }  
    19. }  

    通过FactoryBean来配置Bean

    Car.java(同上)
     
    CarFactoryBean.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factoryBean;  
    2.   
    3. import org.springframework.beans.factory.FactoryBean;  
    4.   
    5. //自定义的Factory需要实现FactoryBean接口  
    6. public class CarFactoryBean implements FactoryBean<Car>{  
    7.   
    8.     private String brand;  
    9.       
    10.     public void setBrand(String brand) {  
    11.         this.brand = brand;  
    12.     }  
    13.       
    14.     //返回bean的对象  
    15.     @Override  
    16.     public Car getObject() throws Exception {  
    17.         return new Car(brand,500000);  
    18.     }  
    19.       
    20.     //返回的bean的类型  
    21.     @Override  
    22.     public Class<?> getObjectType() {  
    23.         // TODO Auto-generated method stub  
    24.         return Car.class;  
    25.     }  
    26.       
    27.     //是否是单例的  
    28.     @Override  
    29.     public boolean isSingleton() {  
    30.         // TODO Auto-generated method stub  
    31.         return true;  
    32.     }  
    33.   
    34. }  

    bean-factorybean.xml
    [html] view plain copy
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
    5.   
    6.       
    7. <!--       
    8.              通过FactoryBean来配置Bean的实例  
    9.     class:指向FactoryBean的全类名  
    10.     property:配置FactoryBean的属性   
    11.       
    12.     注意:实际返回的实例是FactoryBean的getObject()方法返回的实例  
    13. -->  
    14.     <bean id="car1"  
    15.         class="com.wul.spring.bean.factoryBean.CarFactoryBean">  
    16.         <property name="brand" value="BMW"></property>  
    17.     </bean>  
    18.   
    19. </beans>  
    MainFactoryBean.java
    [java] view plain copy
     
    1. package com.wul.spring.bean.factoryBean;  
    2.   
    3. import org.springframework.context.ApplicationContext;  
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
    5.   
    6. public class MainFactoryBean {  
    7.       
    8.     public static void main(String[] args) {  
    9.         ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml");  
    10.           
    11.         Car car = (Car) ctx.getBean("car1");  
    12.         System.out.println(car);  
    13.           
    14.     }  
    15. }  
  • 相关阅读:
    F广搜
    Python中range和xrange的异同之处
    数组中出现次数超过一半的数字
    iOS开发之剖析&quot;秘密&quot;App内容页面效果(一)
    Balloon Comes!
    scikit-learn: isotonic regression(保序回归,非常有意思,仅做知识点了解,但差点儿没用到过)
    C#数据缓存介绍及Caching通用帮助类整理
    SVN Working copying &#39;xxxxx/xxxx/xxxx&#39; locked
    读书笔记-APUE第三版-(7)进程环境
    UVA 10555
  • 原文地址:https://www.cnblogs.com/huangyangquan/p/8617697.html
Copyright © 2011-2022 走看看