一、首先對Spring下一個定義: java
1:spring是一個容器。用於管理全部在java中聲明的類。在spring中,spring所管理的全部類,叫springBean。web
(只要是被spring的管理類,都叫作springbean)spring
2:spring是一個框架:編程
Aop/di框架 – 面向切面的編程。Di(dependences injection) – 依賴注入框架。數組
二、Spring容器介紹緩存
Spring的容器的特色,是經過讀取spring的配置文件,實例化配置的全部類。session
Spring的容器有兩個:app
類框架 |
功能dom |
Org.springframework.BeanFactory(接口) |
根容器的類,全部的spring的容器都必須是它的子類。 The root interface for accessing a Spring bean container. |
Org…..ApplicationContext (接口) |
上下文容器 1:是BeanFactory的子類。 2:比BeanFacotry更強大。 3:在開發時,大多都使用這個類。和它的子類:
|
ClasspathXmlApplicationContext (具體類) |
是ApplicationContext的子類。 用於從classpath根目錄下,讀取spring的配置文件。 |
FileSystemXmlApplicationContext (具體類) |
是ApplicationContext的子類。 用於從文件系統中,讀取spring的配置文件。 |
三、Spring兩個容器區別:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
<!-- 配置第一個spring的bean
spring會根據你的的配置,實例化這個類,且將這個類緩存到本身的容器中去
Person person = new Person();//spring經過反射來實例化這個類、
將這個類緩存到本身的容器中去
map.put("person",person);
-->
<bean id="person" class="cn.domain.Person"/>
</beans>
scope |
說明 |
Prototype
每一次都返回一個新的實例 |
原型模式。 這個對象在Spring容器實例化時,不會實例化這個對象,而是隻保存這個類的字節碼。當用戶每一次調用 getBean()方法時,每一次都返回一個新的實例。 |
Request |
在web環境下, 每個request就是一個新的springBean實例 |
session |
在web環境下, 每個session就返回一個新的springbean的實例。 |
Singleton – 默認的形式
|
在spring裏,全部的spring的bean,默認都是單列的。 每一次調用getBean返回的都是同一個實例。 |
<!-- #{3*7}:叫SpEL表達式,就是在spring的配置文件中能夠使用的表達式語言 -->
<property name="age" value="#{3*7}"/>
<property name="married">
<value>true</value>
</property>
<property name="name" value="張三"></property>
</bean>
運行結果:
這個類被實例化了:4650724
Person [name=張三, age=21, married=true]
<map>
<entry key="name" value="Jack"></entry>
<entry key="addr">
<value>北京中國</value>
</entry>
</map>
</property>
<!--list-->
<property name="lt">
<list>
<value>張三</value>
<value>李四</value>
</list>
</property>
<!--Set-->
<property name="set">
<set>
<value>kkkkkk</value>
</set>
</property>
<!--數組-->
<property name="SSS">
<array>
<value>DDD</value>
</array>
</property>
<property name="DD">
<!-- properties -->
<props>
<prop key="name">Jack..</prop>
</props>
</property>
6.1構造器注入---經過構造器設置值
public Person(String name, Integer age, Boolean married) {
this.name = name;
this.age = age;
this.married = married;
System.err.println("這是有參數的構造。。");
}
<bean id="person" class="cn.domain.Person">
<constructor-arg value="Jack"></constructor-arg>
<constructor-arg value="89"/>
<constructor-arg value="false"></constructor-arg>
</bean>
6.2注入引用
1:用ref引用
<bean id="person" class="cn.domain.Person">
<!-- 引用另外一個Spring的Bean -->
<property name="addr" ref="addr"></property>
</bean>
<!-- 聲明addr的實例,沒有先後的關係 -->
<bean id="addr" class="cn.domain.Addr">
<property name="tel" value="189373844"/>
<property name="zip" value="中國山東"></property>
</bean>
二、嵌入式的聲明
<bean id="person" class="cn.domain.Person">
<!-- 引用另外一個Spring的Bean -->
<property name="addr">
<bean class="cn.domain.Addr">
<property name="tel" value="189373844" />
<property name="zip" value="中國山東"></property>
</bean>
</property>
</bean>
6.3自動的注入
一、byname
<bean id="person" class="cn.domain.Person" autowire="byName">
</bean>
<!-- 由於在person類中有 一個setAddr全部找名稱爲addr的bean -->
<bean id="addr" class="cn.domain.Addr">
<property name="tel" value="189373844" />
<property name="zip" value="中國山東"></property>
</bean>
public class Car {
private Car() {
System.err.println("2:new Car...");
}
public static Car instacne(){
System.err.println("1:靜態的方法。。。。");
return new Car();
}
public void init(){
System.err.println("3:初始化完成了..");
}
public void destory(){
System.err.println("4:銷燬了..");
}
}
bean class="cn.domain.Car" factory-method="instacne" ></bean>