初识Spring

    由于做毕业设计要用到Java框架Spring,今天上午刚到武汉,下午整理了部分假期日记后,便开始了Spring框架的学习,下面简单记录一下Spring框架的最初认识:

在讲Spring之前,有必要先了解几个英文缩写:

IOC:Inversion of Control控制反转

DI:Dependency Injection依赖注入

    Spring框架,我的个人理解,一个对象容器,通过编写XML配置文件,Spring框架自动读取配置文件,根据配置文件的内容生成相应的对象。也就是说,通过Spring框架,你可以不用创建对象了,需要几个对象,只需在配置文件中将对象的属性声明出来,配置上相应的id。在程序中,若想使用该对象,只需从容器中取出即可,在从容器中取对象的时候,可以根据对象的id获取,亦可根据对象的类型获取,不过,上述两种方法还是有一定的区别的:根据对象id获取的对象是唯一的,而根据对象的类型获取的对象可能不唯一(若声明了该类型的两个对象,则Spring在获取对象的时候将会报错!)

    下面就简单说明一下如何配置XML文件(首先说明一下,我使用的Spring是自己手动添加的,没有应用于JavaWeb之中):

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
</beans>

    在beans标签中,可以添加bean标签,一个bean标签便代表一个对象或者说是一个实体

    例如,在com.csdn.blog包中,我定义了一个Car类:

public class Car {
private String brand; //汽车品牌
private String corp; //生产公司
private double  price; //汽车价格
private int maxSpeed; //汽车可达到的最大速度
public Car(String brand, String corp, double price) {
super();
this.brand = brand;
this.corp = corp;
this.price = price;
}


public Car(String brand, String corp, int maxSpeed) {
super();
this.brand = brand;
this.corp = corp;
this.maxSpeed = maxSpeed;
}

public String toString() {
return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price
+ ", maxSpeed=" + maxSpeed + "]";
}

public void setPrice(double p) {
price = p;
}

public void setBrand(String brand) {
this.brand = brand;
}

public void setCorp(String corp) {
this.corp = corp;
}

public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
}

定义了Car类后,我们便可以在配置文件中定义对象实体了,不过我们定义的Car类仍然有点问题,后面会讲到。

在IOC容器中依赖注入的几种方式:属性注入,构造器注入,工厂方法注入(此方法不常用)

下面先讲构造器注入

在配置文件中构造一个Car类实体对象:

<bean id="car1" class="com.csdn.blog.Car">

<constructor-arg name="brand" value="Audi"></constructor-arg>
<constructor-arg name="corp" value="上汽"></constructor-arg>
<constructor-arg name="price" value="30.5"></constructor-arg>

</bean>

这个实体对象调用了构造方法public Car(String brand, String corp, double price);三个值缺一不可,也就是说,bean标签中指定的属性必须有对应的构造方法。

在main方法中,我们可以获取到这个对象:

public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("application-context.xml");
Car c = (Car)ctx.getBean("car1");
System.out.println(c);
}

打印出:Car [brand=Audi, corp=上汽, price=30.5, maxSpeed=0]赋值成功!

构造器注入还可以用下面的方法:

<bean id="car2" class="com.csdn.blog.Car">
<constructor-arg index="0" value="Honda"></constructor-arg>
<constructor-arg index="1" value="广汽"></constructor-arg>
<constructor-arg index="2" value="240"></constructor-arg>
</bean>

用相同的方法获取该对象,控制台打印出:

Car [brand=Honda, corp=广汽, price=24.0, maxSpeed=0]赋值成功,调用了构造方法public Car(String brand, String corp, double price);

index属性指示构造函数中的参数的位次,0代表第一个参数,Spring框架根据参数的个数和参数的类型确定调用Car类中的哪个构造函数,并对其赋值。



下面介绍属性注入的方法为实体对象赋值,在利用属性注入的方法为对象实体赋值时,我们应首先为Car添加一个空的构造函数,因为Spring在利用属性注入为对象的属性成员赋值前,会利用反射调用该类的默认构造函数(即空构造函数)创建对象,然后给对象相应的属性成员赋值

在添加了空的构造函数后,在配置文件中添加下面的代码:

<bean id="car3" class="com.csdn.blog.Car">
<property name="brand" value="Ford"></property>
<property name="corp" value="长安"></property>
<property name="maxSpeed" value="180"></property>
<property name="price" value="19.38"></property>
</bean>

利用相同的方法获取该对象,控制台打印出:Car [brand=Ford, corp=长安, price=19.38, maxSpeed=180]赋值成功!

在maxSpeed属性中,如果value="180.1",程序在运行时将会报错!(180.1不是整数类型!)


那么,如果一个对象的属性成员是另一个类型的对象应该如何配置该属性呢?

下面再定义Person类:

public class Person {


private String name;
private int age;

private Car car; //每个人拥有一辆车


public Person() {}
public Person(String name, int age, Car car) {
super();
this.name = name;
this.age = age;
this.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 String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
}

}

在配置文件中配置Person对象实体如下:

<bean id="person1" class="com.csdn.blog.Person">
<property name="age" value="27"></property>
<property name="name" value="Bob"></property>
<property name="car" ref="car3"></property>
</bean>

用前面的方法获取该对象,控制台打印出:

Person [name=Bob, age=27, car=Car [brand=Ford, corp=长安, price=19.38, maxSpeed=180]]

现在car3对象和person1对象关联在了一起


下面继续考虑,如果一个土豪,他拥有不止一辆车怎么办,我们的程序土豪也要使用啊!

下面定义一个TuHao类

public class TuHao {


private String name;
private int age;

private List<Car> cars;


public TuHao() {}
public TuHao(String name, int age, List<Car> cars) {
super();
this.name = name;
this.age = age;
this.cars = 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 List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]";
}
}

在配置文件中添加如下配置代码:

<bean id="tuhao1" class="com.csdn.blog.TuHao">
<property name="age" value="25"></property>
<property name="name" value="徐永豪"></property>
<property name="cars">
<list>
<ref bean="car" />
<ref bean="car2"/>
</list>
</property>
</bean>

Person [name=徐永豪, age=25, cars=[Car [brand=上汽, corp=Audi, price=30.0, maxSpeed=240], Car [brand=Audi, corp=上汽, price=200.0, maxSpeed=0]]]



那么,如果属性成员中有Map应该怎么办呢?

定义Student类如下:

public class Student {


private String name;
private int age;

Map<String, Car> map;


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> getMap() {
return map;
}


public void setMap(Map<String, Car> map) {
this.map = map;
}


@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", map=" + map + "]";
}
}


在配置文件中配置Student实体对象如下:

<bean id="student1" class="com.csdn.blog.Student">
<property name="name" value="Mary"></property>
<property name="age" value="30"></property>
<property name="map">
<map>
<entry key="First" value-ref="car2"></entry>
<entry key="Second" value-ref="car3"></entry>
</map>
</property>
</bean>


获取该对象,打印出:

Student [name=Mary, age=30, map={First=Car [brand=Audi, corp=上汽, price=200.0, maxSpeed=0], Second=Car [brand=Ford, corp=长安, price=19.38, maxSpeed=180]}]


那么,如果一个类的属性成员为Properties类呢?

定义DataSource类如下:

public class DataSource {


private Properties prop;


public Properties getProp() {
return prop;
}


public void setProp(Properties prop) {
this.prop = prop;
}


@Override
public String toString() {
return "DataSource [prop=" + prop + "]";
}
}


在配置文件中添加如下代码:
<bean id="datasource1" class="com.csdn.blog.DataSource"> 
<property name="prop">
<props>
<prop key="name">root</prop>
<prop key="password">12345678</prop>
</props>
</property>
</bean>

获取该对象实例,打印出:DataSource [prop={name=root, password=12345678}]


博客中一定有不少的错误,欢迎大家能够指出其中不足

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值