Spring學習(一)簡單配置+依賴注入

幾個基本概念:

  • Spring框架:具有約束性的支撐我們實現某些功能的半成品項目

  • IOC(反轉控制):是一種思想

  • DI(依賴注入):是一種具體實現,依賴:依賴於配置文件中的某個類,注入:給類中的屬性賦值

1、工具:STS(spring tool suite)

2、導入需要的jar包:

spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.1.jar

3、寫一個Person類,裏面有name、age屬性,並有對應的get和set方法

public class Person {
	private Integer age;
	private String name;

	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Person [age=" + age + ", name=" + name + "]";
	}
}

4、寫一個配置文件,applicationContext.xml(必須以.xml結尾)

<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--
	<bean>:定義spring所管理的一個對象
	id:該對象的唯一標識(不能重複),在通過類型獲取bean的過程中可以不設置
	class:此對象所屬類的全限定名
 -->


<bean id="person1" class="com.ztt.spring.Person">
	<property name="age" value="22"></property>
	<property name="name" value="abc"></property>
</bean>
</beans>

5、定義一個測試類,testPerson.java

public class testPerson {
	public static void main(String[] args){
	//初始化容器
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	//通過getBean()獲取對象
	//1、通過id獲取
//	Person person = (Person)ac.getBean("person1");
	//2、通過類型獲取對象,使用此方法時,要求spring所管理的此類型對象只能有一個
	//Person person = ac.getBean(Person.class);
	//3、同時通過id和類型獲取對象(推薦)
	Person person = ac.getBean("person1", Person.class);
	System.out.println(person);
//	ac.close();  //初始化容器時使用ClassPathXmlApplicationContext類,ac纔可以關閉
}
}

ApplicationContext的主要實現類:

  • ClassPathXmlApplicationContext:對應類路徑下的xml格式的配置文件
  • FileSystemXmlApplicationContext:對應文件系統中的xml格式的配置文件

依賴注入的兩種方式:

1、屬性注入(其實也就是通過set方法注入,該方法最常用)

<bean id="person1" class="com.ztt.spring.Person">
	<property name="age" value="22"></property>
	<property name="name" value="abc"></property>
</bean>

其中,“age”爲Person類中屬性名,即:set方法中對應的名字

2、構造器注入(此時,類中必須有無參和有參的構造方法)

<bean id="person1" class="com.ztt.spring.Person">
	<constructor-arg value="22"></constructor-arg>
	<constructor-arg value="abc"></constructor-arg>
</bean>

也可以指定屬性值的先後順序進行注入(index的值從0開始):

<bean id="person1" class="com.ztt.spring.Person">
	<constructor-arg value="22" index="0"></constructor-arg>
	<constructor-arg value="abc" index="1"></constructor-arg>
</bean>

但是上述方法容易出現問題,比如:類中有多個對應的構造方法時,賦值會產生錯誤,此時,最好給賦值的參數指定類型,使用type屬性:

<bean id="person1" class="com.ztt.spring.Person">
	<constructor-arg value="22" type="java.lang.Integer"></constructor-arg>
	<constructor-arg value="abc" type="java.lang.String"></constructor-arg>
</bean>

處理特殊字符:給屬性賦值時,若有特殊字符,比如:<>,使用<![CDATA[]]>來實現

<constructor-arg type="java.lang.String">
		<value><![CDATA[<ShangHai>]]></value>
</constructor-arg>

P命名空間:

<bean id="person3" class="com.ztt.spring.Person" p:name="abc" p:age="18" p:age-ref="teacher"></bean>

引用其它Bean:

 

上述Person類中添加一個Car類,Car也是一個bean

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;
	}
}

第一種方式:使用ref屬性或者ref子節點

<bean id="person" class="com.wwj.springdemo.Person">
	<property name="name" value="Tom"></property>
	<property name="age" value="24"></property>
	<property name="car" ref="car"></property>
</bean>

<bean id="car" class="com.wwj.springdemo.Car">
	<constructor-arg value="Audi" type="java.lang.String"></constructor-arg>
	<constructor-arg value="ShangHai" type="java.lang.String"/>
	<constructor-arg value="300000" type="int"></constructor-arg>
</bean>

第二種方式:內部bean,此時內部bean只能在定義它的bean中使用,所以無需定義id,因爲外界無法使用

<bean id="person" class="com.ztt.spring.Person">
	<property name="name" value="ztt"></property>
	<property name="age" value="18"></property>
	<property name="car">
		<bean class="com.ztt.spring.Car">
			<constructor-arg value="Ford"></constructor-arg>
			<constructor-arg value="Beijing"></constructor-arg>
			<constructor-arg value="300000"></constructor-arg>
		</bean>
	</property>
</bean>

級聯屬性注入值:

<bean id="person" class="com.ztt.spring.Person">
	<property name="name" value="ztt"></property>
	<property name="age" value="18"></property>
	<property name="car" ref="car"></property>
	<property name="car.maxSpeed" value="250"/>
</bean>

通過級聯屬性進行注入之前需要先初始化

注入集合類型:

Person類如下:

public class Person {
	
	private String name;
	private int age;
	private List<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 List<Car> getCars() {
		return cars;
	}
	public void setCars(List<Car> cars) {
		this.cars = cars;
	}
}

配置文件如下:

<bean id="personList" class="com.ztt.spring.Person">
	<property name="name" value="ztt"></property>
	<property name="age" value="18"></property>
	<property name="cars">
		<list>
			<ref bean="car1"/>
			<ref bean="car2"/>
			<ref bean="car3"/>
		</list>
	</property>
</bean>

數組、set、list類型的注入方式都一樣,只有Map類型的不同,如下:

<bean id="person" class="com.ztt.spring.person">
	<property name="name" value="ztt"></property>
	<property name="age" value="18"></property>
	<property name="cars">
		<map>
			<entry key="First" value-ref="car1"></entry>
			<entry key="Second" value-ref="car2"></entry>
		</map>
	</property>
</bean>

properties注入:

properties類爲map接口的實現類,經常用於JDBC的屬性配置,定義一個DataSource數據源:

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 + "]";
	}
}

配置文件如下:

<bean id="dataSource" class="com.ztt.spring.DataSource">
	<property name="properties">
		<props>
			<prop key="user">root</prop>
			<prop key="password">123456</prop>
			<prop key="jdbcUrl">jdbc:mysql:///test</prop>
			<prop key="driverClass">com.mysql.jdbc.Driver</prop>
		</props>
	</property>
</bean>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章