IOC和DI
IOC和DI的關係:IOC是思想,DI是實現
反轉控制:在應用程序中的組件需要獲取資源時,傳統的方式是組件主動的從容器中獲取所需要的資源,反轉了資源的獲取方向——改由容器主動的將資源推送給需要的組件,開發人員不需要知道容器是如何創建資源對象的,只需要提供接收資源的方式即可
XML文件配置以及意義
<!-- 配置bean
配置方式: 基於xml的方式 ,使用的全類名的方式.
<bean>: 受Spring管理的一個javaBean對象.
id: <bean>的唯一標識. 在整個IOC容器中唯一不重複.
class: 指定javaBean的全類名. 目的是通過反射創建對象。
Class cls = Class.forName("com.atguigu.spring.helloWorld.Person");
Object obj = cls.newInstance(); 必須提供無參數構造器.
<property>: 給對象的屬性賦值
name: 指定屬性名 , 指定set風格的屬性名.
value:指定屬性值
-->
理解屬性和成員變量
private String name;這是成員變量
private void setName(String name);這是屬性
IOC容器的實現
Spring中有倆個實現方式
1. BeanFactory
IOC容器的基本實現,是Spring內部的基礎設施,是面向Spring本身的,不是提供給開發人員使用的。
2. ApplicationContext
BeanFactory的子接口,提供了更多高級特性。面向Spring的使用者,幾乎所有場合都使用ApplicationContext而不是底層的BeanFactory。
ConfigurableApplicationContext是ApplicationContext的子接口 refresh()和close()讓ApplicationContext具有啓動、關閉和刷新上下文的能力。
主要實現類:
- ClassPathXmlApplicationContext:對應類路徑下的XML格式的配置文件
- FileSystemXmlApplicationContext:對應文件系統中的XML格式的配置文件
- 在初始化時就創建單例的bean,也可以通過配置的方式指定創建的Bean是多實例的
獲取Bean對象
三種方法
//獲取一個Person對象
Person person=(Person)applicationContext.getBean("person");
//這種如果有多個同類型的會出錯
Person person1=applicationContext.getBean(Person.class);
Person person2=applicationContext.getBean("person",Person.class);
賦值:
<!--set注入-->
<bean id="DITest" class="DI.Car">
<property name="brand" value="寶馬"/>
<property name="price" value="20000000000000"/>
<property name="rop" value="Nobody"/>
</bean>
<!--構造器
index:指定參數的位置
type: 指定參數的類型
-->
<bean id="car1" class="DI.Car">
<constructor-arg value="寶馬" index="0"></constructor-arg>
<constructor-arg value="450000" index="2" type="java.lang.Double"></constructor-arg>
<constructor-arg value="華晨" index="1"></constructor-arg>
</bean>
<!--p命名空間,非依賴注入,也是get和set方法-->
把這句加載<beans>裏面
xmlns:p="http://www.springframework.org/schema/p"
<bean
id="Car"
class="DI.Car"
p:brand="福特"
p:rop="長安"
p:price="300000000"
/>
<!--引用其他的Bean-->
<bean id="testB" class="DI.Person">
<property name="id">
<value>101</value>
</property>
<property name="name" value="張三"/>
<property name="car" ref="Car"/>
</bean>
<!--內部bean-->
<bean id="testin" class="DI.Person">
<property name="id" value="103"></property>
<property name="car">
<bean class="DI.Car">
<property name="rop" value="寶馬"></property>
<property name="price" value="2018291237"></property>
<property name="brand" value="長城"/>
</bean>
</property>
<property name="name" value="李四"></property>
</bean>
<!--測試級聯-->
<bean id="action" class="com.atguigu.spring.ref.Action">
<property name="service" ref="service"/>
<!-- 設置級聯屬性(瞭解) -->
<property name="service.dao.dataSource" value="DBCP"/>
</bean>
可以使用的值
- 字面量
可以使用字符串表示的值,例如 value=“寶馬”
也可以使用寶馬
遇到特殊字符的時候
可以使用<![CDATA[]]>把字面值包裹起來
賦空值(個人認爲最蠢的設定,沒有之一)
<property name= "bookName">
<null/>
</property>