目錄
上章《hualinux spring 3.4:idea 2020.1 創建簡單的spring》講了如果使用iidea創建spring項目,並寫了一個簡單的helloWorld,現在這裏基於這個項目講依賴注入。
一、普通測試
在測試之前我把《hualinux spring 3.4:idea 2020.1 創建簡單的spring》建立的java文件及xml配置文件全部刪除,恢復空項目
1.1 建立無參hello
1.1.1 建立配置文件
src右擊-->new-->XML Configuration File-->Spring config-->輸入名字“ApplicationContext”
ApplicationContext.xml配置文件如下:
<!--配置bean-->
<bean id="hello" class="com.hualinux.beans.Hello">
<property name="name" value="Spring"/>
</bean>
1.1.2 代碼
src-->com.hualinux.beans.Hello.java
package com.hualinux.beans;
public class Hello {
String name;
public void helloTest(){
System.out.println("你好:"+name);
}
public void setName(String name) {
this.name = name;
}
}
src-->com.hualinux.beans.Main.java
package com.hualinux.beans;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//1. 創建 Spring 的 IOC 容器對象
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
//2. 從IOC容器中獲取Bean實例
Hello hello= (Hello) ctx.getBean("hello");
//3. 調用hello方法
hello.helloTest();
}
}
1.1.3 運行結果
運行一下,怎運行前一章已經講了,我這裏就不說了
1.1.4 總結
在spring的xml配置中:
id:Bean 的名稱。
- 在 IOC 容器中必須是唯一的
- 若 id 沒有指定,Spring 自動將權限定性類名作爲 Bean 的名字
- id 可以指定多個名字,名字之間可用逗號、分號、或空格分隔
Spring ApplicationContext 容器
Application Context 是 spring 中較高級的容器。和 BeanFactory 類似,它可以加載配置文件中定義的 bean,將所有的 bean 集中在一起,當有請求的時候分配 bean。 另外,它增加了企業所需要的功能,比如,從屬性文件中解析文本信息和將事件傳遞給所指定的監聽器。這個容器在 org.springframework.context.ApplicationContext interface 接口中定義。
ApplicationContext 包含 BeanFactory 所有的功能,一般情況下,相對於 BeanFactory,ApplicationContext 會更加優秀。當然,BeanFactory 仍可以在輕量級應用中使用,比如移動設備或者基於 applet 的應用程序。
最常被使用的 ApplicationContext 接口實現:
- FileSystemXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這裏,你需要提供給構造器 XML 文件的完整路徑。
- ClassPathXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這裏,你不需要提供 XML 文件的完整路徑,只需正確配置 CLASSPATH 環境變量即可,因爲,容器會從 CLASSPATH 中搜索 bean 配置文件。
- WebXmlApplicationContext:該容器會在一個 web 應用程序的範圍內加載在 XML 文件中已被定義的 bean。
1.2 建立有參的hello
如果修改爲有參的構造器得需要一個默認的無參構造器
//用idea測試發現不加也行,但建議還是加上
複製Hello.java變成Hello2.java
public class Hello2 {
String name;
public void helloTest(){
System.out.println("你好:"+name);
}
public Hello2() {
}
public Hello2(String name) {
this.name = name;
}
}
ApplicationContext.xml配置文件添加如下內容
<!--配置bean-->
<bean id="hello2" class="com.hualinux.beans.Hello2">
<constructor-arg name="name" value="Spring2"/>
</bean>
Main.java,修改如下:
package com.hualinux.beans;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//1. 創建 Spring 的 IOC 容器對象
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
//2. 從IOC容器中獲取Bean實例
Hello hello= (Hello) ctx.getBean("hello");
Hello2 hello2= (Hello2) ctx.getBean("hello2");
//3. 調用hello方法
hello.helloTest();
hello2.helloTest();
}
}
運行結果爲:
二、 屬性注入
2.1 get和set注入
屬性注入即通過 setter 方法注入Bean 的屬性值或依賴的對象
屬性注入使用 <property> 元素, 使用 name 屬性指定 Bean 的屬性名稱,value 屬性或 <value> 子節點指定屬性值
屬性注入是實際應用中最常用的注入方式
例子就是上面的無參hello
2.2 ref引用
- 組成應用程序的 Bean 經常需要相互協作以完成應用程序的功能. 要使 Bean 能夠相互訪問, 就必須在 Bean 配置文件中指定對 Bean 的引用
- 在 Bean 的配置文件中, 可以通過 <ref> 元素或 ref 屬性爲 Bean 的屬性或構造器參數指定對 Bean 的引用.
- 也可以在屬性或構造器裏包含 Bean 的聲明, 這樣的 Bean 稱爲內部 Bean
下面是一個配置例子,需要建立Car類,並有3個屬性;也需要建立Person類,3個屬性,其中一個包括car ,後面將貼出代碼
<bean id="car" class="com.hualinux.beans.Car">
<constructor-arg value="BMW X6" />
<constructor-arg value="進口寶馬" />
<constructor-arg value="1000000" />
</bean>
<bean id="person" class="com.hualinux.beans.Person" >
<property name="name" value="華" />
<property name="age" value="20" />
<property name="car" ref="car" />
</bean>
三、構造函數注入
通過構造方法注入Bean 的屬性值或依賴的對象,它保證了 Bean 實例在實例化後就可以使用。
構造器注入在 <constructor-arg> 元素裏聲明屬性, <constructor-arg> 中沒有 name 屬性
3.1 默認
例子1,上面的hello2
例子2:
src-->com.hualinux.beans.Car.java
package com.hualinux.beans;
public class Car {
private String brand;
private String corp;
private float price;
private int maxSpeed;
// 先弄3個參數,最後一個不用
public Car(String brand, String corp, float price) {
this.brand = brand;
this.corp = corp;
this.price= price;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", corp='" + corp + '\'' +
", price=" + price +
", maxSpeed=" + maxSpeed +
'}';
}
}
ApplicationContext.xml配置文件
<!--通過構造方法來配置 bean的屬性-->
<!--爲了方便先弄三個參數的-->
<bean id="car" class="com.hualinux.beans.Car">
<constructor-arg value="BMW X6" />
<constructor-arg value="進口寶馬" />
<constructor-arg value="1000000"/>
</bean>
Main.java
package com.hualinux.beans;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//1. 創建 Spring 的 IOC 容器對象
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
//2. 從IOC容器中獲取Bean實例
Hello hello= (Hello) ctx.getBean("hello");
Hello2 hello2= (Hello2) ctx.getBean("hello2");
Car car= (Car) ctx.getBean("car");
System.out.println(car.toString());
//3. 調用hello方法
hello.helloTest();
hello2.helloTest();
}
}
運行結果爲:
3.2使用index索引匹配入參
ApplicationContext.xml配置文件中id爲car的修改爲如下:
<!--索引方式-->
<bean id="car" class="com.hualinux.beans.Car">
<constructor-arg value="BMW X6" index="0" />
<constructor-arg value="進口寶馬" index="1" />
<constructor-arg value="1000000" index="2"/>
</bean>
再次運行Main.java,結果如下:
3.3 按類型匹配入參
ApplicationContext.xml配置文件中id爲car的修改爲如下:
<bean id="car" class="com.hualinux.beans.Car">
<constructor-arg value="BMW X6" type="java.lang.String"/>
<constructor-arg value="進口寶馬" type="java.lang.String" />
<constructor-arg value="1000000" type="float"/>
</bean>
運行Main.java 結果也是相同的
3.4 問題 相同class
src-->com.hualinux.beans.Car.java 建立多一個構造函數
// 不使用第3個屬性
public Car(String brand, String corp, int maxSpeed) {
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
ApplicationContext.xml配置文件中添加:
<bean id="car2" class="com.hualinux.beans.Car">
<constructor-arg value="法拉利" />
<constructor-arg value="進口" />
<constructor-arg value="320" />
</bean>
這樣纔有2個car了
<bean id="car2" class="com.hualinux.beans.Car">
<constructor-arg value="法拉利" />
<constructor-arg value="進口" />
<constructor-arg value="320" />
</bean>
<bean id="car" class="com.hualinux.beans.Car">
<constructor-arg value="BMW X6" type="java.lang.String"/>
<constructor-arg value="進口寶馬" type="java.lang.String" />
<constructor-arg value="1000000" type="float"/>
</bean>
Main添加多一個car2,總代碼如下:
package com.hualinux.beans;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//1. 創建 Spring 的 IOC 容器對象
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
//2. 從IOC容器中獲取Bean實例
Hello hello= (Hello) ctx.getBean("hello");
Hello2 hello2= (Hello2) ctx.getBean("hello2");
Car car= (Car) ctx.getBean("car");
System.out.println(car.toString());
Car car2= (Car) ctx.getBean("car2");
System.out.println(car2.toString());
//3. 調用hello方法
hello.helloTest();
hello2.helloTest();
}
}
結果:320是時速即變成了價格吧
解決方法:
指定type匹配類型也行(因爲2個構造函數,用的是重載)
注:用index固定好參數順序是不行的
<!-- 使用構造器注入值可以指定參數的位置和參數類型!以區分重載構造器!-->
<bean id="car2" class="com.hualinux.beans.Car">
<constructor-arg value="法拉利" type="java.lang.String" />
<constructor-arg value="進口" type="java.lang.String" />
<constructor-arg value="320" type="int"/>
</bean>
再次運行發現正常了,如下圖所示:
四、 其它
4.1字面值
- 字面值:可用字符串表示的值,可以通過 <value> 元素標籤或 value 屬性進行注入。
- 基本數據類型及其封裝類、String 等類型都可以採取字面值注入的方式
- 若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起來。
4.2 內部bean
- 當 Bean 實例僅僅給一個特定的屬性使用時, 可以將其聲明爲內部 Bean. 內部 Bean 聲明直接包含在 <property> 或 <constructor-arg> 元素裏, 不需要設置任何 id 或 name 屬性
- 內部 Bean 不能使用在任何其他地方
4.2.1 例子
src-->com.hualinux.beans.Person.java
package com.hualinux.beans;
public class Person {
private String name;
private int age;
private Car car;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public Person() {
}
public Person(String name, int age, Car car) {
this.name = name;
this.age = age;
this.car = car;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", car=" + car +
'}';
}
}
ApplicationContext.xml配置文件中添加:
<!-- 內部bean,不能補外部引用,只能內部使用 -->
<bean id="person" class="com.hualinux.beans.Person" >
<property name="name" value="華" />
<property name="age" value="20" />
<property name="car">
<bean id="car3" class="com.hualinux.beans.Car">
<constructor-arg value="慕尚" />
<constructor-arg value="進口賓利" />
<constructor-arg value="305" type="int" />
</bean>
</property>
</bean>
Main.java中添加如下配置
//在Main中添加
Person person= (Person) ctx.getBean("person");
System.out.println(person.toString());
運行結果爲:
4.3 null值和級聯屬性
- 可以使用專用的 <null/> 元素標籤爲 Bean 的字符串或其它對象類型的屬性注入 null 值
- 和 Struts、Hiberante 等框架一樣,Spring 支持級聯屬性的配置。
ApplicationContext.xml配置文件中添加:
<bean id="person2" class="com.hualinux.beans.Person" >
<property name="name" value="華2" />
<property name="age" value="20" />
<!-- 測試賦值null -->
<property name="car" ><null/></property>
</bean>
或
<bean id="person2" class="com.hualinux.beans.Person" >
<constructor-arg value="華2" />
<constructor-arg value="20" />
<!-- 測試賦值null -->
<constructor-arg ><null/></constructor-arg>
</bean>
Main.jva添加
Person person2= (Person) ctx.getBean("person2");
System.out.println(person2.toString());
運行結果:
級聯屬性賦值:
修改ApplicationContext.xml配置文件中的person2
爲了方便我在Car.java中添加了getter和setter方法
<bean id="person2" class="com.hualinux.beans.Person" >
<constructor-arg value="華2" />
<constructor-arg value="20" />
<!-- 測試賦值null -->
<!--<constructor-arg ><null/></constructor-arg>-->
<!-- 級聯屬性賦值。注意:屬性需要先初始化纔可以爲級聯屬性賦值,否則會有異常,和struts2不同-->
<constructor-arg ref="car"/>
<!-- Car類中的maxSpeed要添加setter方法,否則不生效-->
<property name="car.maxSpeed" value="250"/>
</bean>
4.4 集合屬性
- 在 Spring中可以通過一組內置的 xml 標籤(例如: <list>, <set> 或 <map>) 來配置集合屬性.
- 配置 java.util.List 類型的屬性, 需要指定 <list> 標籤, 在標籤裏包含一些元素. 這些標籤可以通過 <value> 指定簡單的常量值, 通過 <ref> 指定對其他 Bean 的引用. 通過<bean> 指定內置 Bean 定義. 通過 <null/> 指定空元素. 甚至可以內嵌其他集合.
- 數組的定義和 List 一樣, 都使用 <list>
- 配置 java.util.Set 需要使用 <set> 標籤, 定義元素的方法與 List 一樣.
src-->com.hualinux.beans.collection.Car.java(和src-->com.hualinux.beans.Car.java一樣)
package com.hualinux.beans.collection;
public class Car {
private String brand;
private String corp;
private float price;
private int maxSpeed;
// 先弄3個參數,最後一個不用
public Car(String brand, String corp, float price) {
this.brand = brand;
this.corp = corp;
this.price= price;
}
// 不使用第3個屬性
public Car(String brand, String corp, int maxSpeed) {
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", corp='" + corp + '\'' +
", price=" + price +
", maxSpeed=" + maxSpeed +
'}';
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getCorp() {
return corp;
}
public void setCorp(String corp) {
this.corp = corp;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
}
src-->com.hualinux.beans.collection.Person.java如下:
package com.hualinux.beans.collection;
import java.util.List;
public class Person {
private String name;
private int age;
private List<com.hualinux.beans.collection.Car> car;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<com.hualinux.beans.collection.Car> getCar() {
return car;
}
public void setCar(List<com.hualinux.beans.collection.Car> car) {
this.car = car;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", car=" + car +
'}';
}
}
src右擊-->new-->XML Configuration File-->Spring config-->輸入名字“collection“
<bean id="car" class="com.hualinux.beans.collection.Car">
<constructor-arg value="BMW X6" />
<constructor-arg value="進口寶馬" />
<constructor-arg value="1000000" />
</bean>
<!-- 使用構造器注入值可以指定參數的位置和參數類型!以區分重載構造器!-->
<bean id="car2" class="com.hualinux.beans.collection.Car">
<constructor-arg value="法拉利" index="0" />
<constructor-arg value="進口" index="1" />
<constructor-arg value="320" index="2" />
</bean>
<bean id="car3" class="com.hualinux.beans.collection.Car">
<constructor-arg value="911" type="java.lang.String" />
<constructor-arg value="進口保時捷" type="java.lang.String" />
<constructor-arg value="340" type="int" />
</bean>
<bean id="person3" class="com.hualinux.beans.collection.Person">
<property name="name" value="Mike"/>
<property name="age" value="27"/>
<property name="car">
<list>
<ref bean="car" />
<ref bean="car2" />
<ref bean="car3" />
</list>
</property>
</bean>
src-->com.hualinux.beans.collection.Main.java
package com.hualinux.beans.collection.com.hualinux.beans.collection;
import com.hualinux.beans.collection.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("collection.xml");
// 這裏的Person爲com.hualinux.beans.collection.Person
Person person= (Person) ctx.getBean("person3");
System.out.println(person.toString());
}
}
運行結果:
Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}, Car{brand='911', corp='進口保時捷', price=0.0, maxSpeed=340}]}
4.5 集合屬性
- Java.util.Map 通過 <map> 標籤定義, <map> 標籤裏可以使用多個 <entry> 作爲子標籤. 每個條目包含一個鍵和一個值.
- 必須在 <key> 標籤裏定義鍵
- 因爲鍵和值的類型沒有限制, 所以可以自由地爲它們指定 <value>, <ref>, <bean> 或 <null> 元素.
- 可以將 Map 的鍵和值作爲 <entry> 的屬性定義: 簡單常量使用 key 和 value 來定義; Bean 引用通過 key-ref 和 value-ref 屬性定義
- 使用 <props> 定義 java.util.Properties, 該標籤使用多個 <prop> 作爲子標籤. 每個 <prop> 標籤必須定義 key 屬性.
src-->com.hualinux.beans.collection.MapPerson.java
package com.hualinux.beans.collection;
import java.util.Map;
public class MapPerson {
private String name;
private int age;
private Map<String,Car> cars;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Map<String, Car> getCars() {
return cars;
}
public void setCars(Map<String, Car> cars) {
this.cars = cars;
}
@Override
public String toString() {
return "MapPerson{" +
"name='" + name + '\'' +
", age=" + age +
", cars=" + cars +
'}';
}
}
collection.xml配置文件中添加如下內容
<!-- 配置Map屬性值 -->
<bean id="mapPerson" class="com.hualinux.beans.collection.MapPerson">
<property name="name" value="Rose" />
<property name="age" value="28" />
<property name="cars">
<!-- 使用map節點及map的entry子節點配置Map類型成員變更-->
<map>
<entry key="AA" value-ref="car"/>
<entry key="BB" value-ref="car2" />
</map>
</property>
</bean>
com.hualinux.beans.collection.Main.java是main中添加
MapPerson mapPerson= (MapPerson) ctx.getBean("mapPerson");
System.out.println(mapPerson);
運行結果如下:
Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}, Car{brand='911', corp='進口保時捷', price=0.0, maxSpeed=340}]}
MapPerson{name='Rose', age=28, cars={AA=Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, BB=Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}}}
例2 模擬數據庫配置連接
src-->com.hualinux.beans.collection.DataSource.java
package com.hualinux.beans.collection;
import java.util.Properties;
public class DataSource {
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "DataSource{" +
"properties=" + properties +
'}';
}
}
collection.xml配置文件中添加
<!-- 配置 Properties 屬性值 -->
<bean id="dataSource" class="com.hualinux.beans.collection.DataSource">
<property name="properties">
<!-- 使用 props 和 prop 子節點來爲 properties 屬性賦值-->
<props>
<prop key="user">root</prop>
<prop key="password">root</prop>
<prop key="jdbcUrl">jdbc:mysql://test</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
com.hualinux.beans.collection.Main.java,的main中添加,如下代碼:
DataSource dataSource= (DataSource) ctx.getBean("dataSource");
System.out.println(dataSource.getProperties());
運行結果:
Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}, Car{brand='911', corp='進口保時捷', price=0.0, maxSpeed=340}]}
MapPerson{name='Rose', age=28, cars={AA=Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, BB=Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}}}
{password=root, driverClass=com.mysql.jdbc.Driver, jdbcUrl=jdbc:mysql://test, user=root}
4.6 使用 utility scheme 定義集合
- 使用基本的集合標籤定義集合時, 不能將集合作爲獨立的 Bean 定義, 導致其他 Bean 無法引用該集合, 所以無法在不同 Bean 之間共享集合.
- 可以使用 util schema 裏的集合標籤定義獨立的集合 Bean. 需要注意的是, 必須在 <beans> 根元素裏添加 util schema 定義
collection.xml配置文件中添加
<!-- 配置單例集合bean,以供多個bean進行引用,需要導入util 命名空間-->
<util:list id="cars">
<ref bean="car" />
<ref bean="car2" />
</util:list>
<bean id="person4" class="com.hualinux.beans.collection.Person">
<property name="name" value="Jack"/>
<property name="age" value="29"/>
<property name="car" ref="cars"/>
</bean>
list會提示到不到,點一下按Alt+Enter
這後就顯示正常了
4.7 使用p命名空間
- 爲了簡化 XML 文件的配置,越來越多的 XML 文件採用屬性而非子元素配置信息。
- Spring 從 2.5 版本開始引入了一個新的 p 命名空間,可以通過 <bean> 元素屬性的方式配置 Bean 的屬性。
- 使用 p 命名空間後,基於 XML 的配置方式將進一步簡化
collection.xml配置文件中添加
<!-- 通過p命名空間爲bean的屬性賦值,需要先導入p命名空間。相於於傳統配置方式更加簡潔 -->
<bean id="person5" class="com.hualinux.beans.collection.Person"
p:name="Queen" p:car-ref="cars" />
上面p是紅色的話用Alt+Enter就會自動爲配置添加相關的關聯,這樣p命名空間就可以使用了。
com.hualinux.beans.collection.Main.java,的main中添加,如下代碼:
Person person5= (Person) ctx.getBean("person5");
System.out.println(person5.toString());
運行結果爲:
Person{name='Mike', age=27, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}, Car{brand='911', corp='進口保時捷', price=0.0, maxSpeed=340}]}
MapPerson{name='Rose', age=28, cars={AA=Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, BB=Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}}}
{password=root, driverClass=com.mysql.jdbc.Driver, jdbcUrl=jdbc:mysql://test, user=root}
Person{name='Queen', age=0, car=[Car{brand='BMW X6', corp='進口寶馬', price=1000000.0, maxSpeed=0}, Car{brand='法拉利', corp='進口', price=320.0, maxSpeed=0}]}