一.Spring框架的概述
Spring是一個開源框架,於2003 年興起的一個輕量級的Java開發框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。
Spring的核心是控制反轉(IoC)和麪向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架。
Ioc --Inverse of Control,控制反轉,將對象的創建權反轉給Spring.
DI -- Dependency Injection,依賴注入,在Spring框架負責創建Bean對象時,動態的將依賴對象注入到Bean組件中
使用IOC可以解決的程序耦合性高的問題
二.Spring的特點
* 方便解耦,簡化開發
* Spring就是一個大工廠,可以將所有對象創建和依賴關係維護,交給Spring管理
* AOP編程的支持
* Spring提供面向切面編程,可以方便的實現對程序進行權限攔截、運行監控等功能
* 聲明式事務的支持
* 只需要通過配置就可以完成對事務的管理,而無需手動編程
* 方便程序的測試
* Spring對Junit4支持,可以通過註解方便的測試Spring程序
* 方便集成各種優秀框架
* Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持
* 降低JavaEE API的使用難度
* Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大降低
三.BeanFactory和ApplicationContext的區別
* BeanFactory -- BeanFactory採取延遲加載,第一次getBean時纔會初始化Bean
* ApplicationContext -- 在加載applicationContext.xml時候就會創建具體的Bean對象的實例,還提供了一些其他的功能
* 事件傳遞
* Bean自動裝配
* 各種不同應用層的Context實現
四.DI(依賴注入)
屬性+set方法
public class CustomerServiceImpl {
// 提供成員屬性,提供set方法
private CustomerDaoImpl customerDao;
public void setCustomerDao(CustomerDaoImpl customerDao) {
this.customerDao = customerDao;
}
public void save(){
System.out.println("我是業務層service....");
// 原來編寫方式
// new CustomerDaoImpl().save();
// Spring的方式
customerDao.save();
}
}
配置文件中 service中注入dao
<bean id="customerDao" class="com.luo.CustomerDaoImpl"/>
<bean id="customerService" class="com.luo.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"/>
</bean>
五.Spring框架的屬性注入
1.構造方法的注入,兩步
* 編寫Java的類,提供構造方法
public class Car {
private String name;
private double money;
public Car(String name, double money) {
this.name = name;
this.money = money;
}
@Override
public String toString() {
return "Car [name=" + name + ", money=" + money + "]";
}
}
* 編寫配置文件
<bean id="car" class="org.westos.demo4.Car">
<constructor-arg name="name" value="大奔"/>
<constructor-arg name="money" value="100"/>
<!-- 用index 來寫屬性的編號也可以 從0開始數
<constructor-arg index="0" value="寶馬"/>
<constructor-arg index="1" value="545000"/>
-->
</bean>
2. 屬性的setter方法的注入方式
* 編寫Java的類,提供屬性和對應的set方法即可
* 編寫配置文件
3. 如果Java類的屬性是另一個Java的類,那麼需要怎麼來注入值呢?
* <property name="name" rel="具體的Bean的ID或者name的值"/>
* 例如:
<bean id="person" class="org.westos.demo4.Person">
<property name="pname" value="美美"/>
<property name="car2" ref="car2"/>
</bean>
六.屬性注入之.數組,集合(List,Set,Map),Properties等的注入
1. 如果是數組或者List集合,注入配置文件的方式是一樣的
private String [] arrs;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
//數組 或 List集合
<bean id="collectionBean" class="com.luo.CollectionBean">
<property name="arrs">
<list>
<value>美美</value>
<value>小風</value>
</list>
</property>
</bean>
//如果List集合中放的是對象就用
<bean id="collectionBean" class="com.luo.CollectionBean">
<property name="list">
<list>
<ref bean="car">
</list>
</property>
</bean>
2. 如果是Set集合,注入的配置文件方式如下:
<property name="sets">
<set>
<value>哈哈</value>
<value>呵呵</value>
</set>
</property>
3. 如果是Map集合,注入的配置方式如下:
<property name="map">
<map>
<entry key="張三" value="38"/>
<entry key="李四" value="38"/>
<entry key="王五" value="29"/>
</map>
</property>
4. 如果是properties屬性集合的方式,注入的配置如下:
<property name="pro">
<props>
<prop key="uname">root</prop>
<prop key="pass">123</prop>
</props>
</property>