Public class Car {
private String brand;
public void setBrand(String brand) {
this.brand = brand;
}
public String getBrand() {
return this.brand;
}
}
<bean id=“car” class=“com.jike.***.Car” >
<property name=“brand”>
<value>奔馳</value>
</property>
</bean>
- 按類型匹配入參
- 按索引匹配入參
- 聯合使用類型和索引匹配入參
- 通過自身類型反射匹配入參
public class Car{
private String brand;
private double price;
public Car(String brand, double price) {
this.brand = brand;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
我們爲bean編寫配置文件<bean id="Car" class="cn.lovepi.chapter02.reflect.Car">
<constructor-arg type="String">
<value>紅旗CA72</value>
</constructor-arg>
<constructor-arg type="double">
<value>26666</value>
</constructor-arg>
</bean>
public class Car{
private String brand;
private String corp;
private double price;
public Car(String brand, String corp, double price) {
this.brand = brand;
this.corp = corp;
this.price = price;
}
}
可以看到,在這個bean中的構造函數中存在兩個String類型的參數,那麼我們便使用索引來對其中的參數進行注入。<bean id="Car" class="cn.lovepi.chapter02.reflect.Car">
<constructor-arg index="0" value="紅旗CA72"/>
<constructor-arg index="1" value="中國一汽"/>
<constructor-arg index="2" value="2666"/>
</bean>
public class Car{
private String brand;
private String corp;
private double price;
private int maxSpeed;
public Car(String brand, String corp, double price) {
this.brand = brand;
this.corp = corp;
this.price = price;
}
public Car(String brand, String corp, int maxSpeed) {
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}
}
<bean id="Car" class="cn.lovepi.chapter02.reflect.Car">
<constructor-arg index="0" type="String">
<value>紅旗CA72</value>
</constructor-arg>
<constructor-arg index="1" type="String">
<value>中國一汽</value>
</constructor-arg>
<constructor-arg index="2" type="int">
<value>200</value>
</constructor-arg>
</bean>
public class Boss {
private String name;
private Car car;
private Office office;
public Boss(String name, Car car, Office office) {
this.name = name;
this.car = car;
this.office = office;
}
}
<bean id="Boss" class="cn.lovepi.chapter03.scope.Boss">
<constructor-arg>
<value>wang</value>
</constructor-arg>
<constructor-arg>
<ref bean="car"/>
</constructor-arg>
<constructor-arg>
<ref bean="office"/>
</constructor-arg>
</bean>
public class CarFactory{
public Car createHongQiCar(){
Car car=new Car();
car.setBrand("紅旗CA72");
return car;
}
}
配置文件編寫:
<bean id="carFactory" class="cn.lovepi.chapter02.reflect.CarFactory"/>
<bean id="car" factory-bean="carFactory"
factory-method="createHongQiCar">
</bean>
public class CarFactory{
public static Car createCar(){
Car car=new Car();
car.setBrand("紅旗CA72");
return car;
}
}
則其配置文件爲:<bean id="car" class="cn.lovepi.chapter02.reflect.Car” factory-method="createCar"></bean>
- 構造函數保證重要屬性預先設置
- 無需提供每個屬性Setter方法,減少類的方法個數
- 可更好的封裝類變量,避免外部錯誤調用
- 屬性過多時,構造函數變的臃腫可怕
- 構造函數注入靈活性不強,有時需要爲屬性注入null值
- 多個構造函數時,配置上產生歧義,複雜度升高
- 構造函數不利於類的繼承和擴展
- 構造函數注入會引起循環依賴的問題