1.Spring的優(yōu)點:
- Spring是一個開源免費的輕量級框架(容器)
- Spring是一個輕量級的、非入侵式的框架
- 支持事務(wù)的處理,對框架整合的支持
- 以 控制反轉(zhuǎn)(IOC),面向切面編程(AOP)為內(nèi)核。
- 方便解耦,簡化開發(fā):將對象的創(chuàng)建交給spring 無需new
- 提供了展現(xiàn)層SpringMVC和持久層Spring JDBCTemplate以及業(yè)務(wù)層事務(wù)管理等眾多企業(yè)級應(yīng)用技術(shù)。
- 還能整合開源世界眾多第三方框架和類庫
總結(jié):Spring就是一個輕量級的控制反轉(zhuǎn)(IOC)和面向切面編程(AOP)的框架
Spring的七大模塊

弊端:
配置十分繁瑣,人稱“配置地獄”。
2.Spring程序的開發(fā)步驟:
在xml配置文件中對dao進(jìn)行id編號
業(yè)務(wù)層:
UserDao userDao = Spring客戶端.getBean(id標(biāo)識)
傳入Spring框架:
讀取xml配置文件 根據(jù)id標(biāo)識獲得Bean全限定名 --> 通過反射創(chuàng)建對象 并返回給調(diào)用者
圖示 :

① 導(dǎo)入 Spring 開發(fā)的基本包坐標(biāo)
② 編寫 Dao 接口和實現(xiàn)類
③ 創(chuàng)建 Spring 核心配置文件
④ 在 Spring 配置文件中配置 UserDaoImpl
⑤ 使用 Spring 的 API 獲得 Bean 實例
3.Spring配置文件:
3.1 bean標(biāo)簽的配置
用于配置對象交由Spring 來創(chuàng)建。
默認(rèn)情況下它調(diào)用的是類中的無參構(gòu)造函數(shù),如果沒有無參構(gòu)造函數(shù)則不能創(chuàng)建成功
基本屬性:
- id:Bean實例在Spring容器中的唯一標(biāo)識
- class:Bean的全限定名稱
-
scope: 范圍配置,默認(rèn)為singleton范圍配置
3.2 Bean標(biāo)簽范圍配置
1)當(dāng)scope的取值為singleton時
Bean的實例化個數(shù):1個
Bean的實例化時機(jī):當(dāng)Spring核心文件被加載時,實例化配置的Bean實例
Bean的生命周期:
- 對象創(chuàng)建:當(dāng)應(yīng)用加載,創(chuàng)建容器時,對象就被創(chuàng)建了
- 對象運行:只要容器在,對象一直活著
- 對象銷毀:當(dāng)應(yīng)用卸載,銷毀容器時,對象就被銷毀了
2)當(dāng)scope的取值為prototype時
Bean的實例化個數(shù):多個
Bean的實例化時機(jī):當(dāng)調(diào)用getBean()方法時實例化Bean
- 對象創(chuàng)建:當(dāng)使用對象時,創(chuàng)建新的對象實例
- 對象運行:只要對象在使用中,就一直活著
- 對象銷毀:當(dāng)對象長時間不用時,被 Java 的垃圾回收器回收了
3.3 Bean的生命周期配置
- init-method:指定類中的初始化方法名稱
- destroy-method:指定類中銷毀方法名稱
3.4 Bean實例化的方式
- 無參構(gòu)造方法實例化
- 工廠靜態(tài)方法實例化
- 工廠實例方法實例化
3.5 Bean的依賴注入
因為UserService和UserDao都在Spring容器中,而最終程序直接使用的是UserService,所以可以在Spring容器中,將UserDao設(shè)置到UserService內(nèi)部。
依賴注入(Dependency Injection):它是 Spring 框架核心 IOC 的具體實現(xiàn)。
在編寫程序時,通過控制反轉(zhuǎn),把對象的創(chuàng)建交給了 Spring,但是代碼中不可能出現(xiàn)沒有依賴的情況。
IOC 解耦只是降低他們的依賴關(guān)系,但不會消除。例如:業(yè)務(wù)層仍會調(diào)用持久層的方法。
那這種業(yè)務(wù)層和持久層的依賴關(guān)系,在使用 Spring 之后,就讓 Spring 來維護(hù)了。
簡單的說,就是坐等框架把持久層對象傳入業(yè)務(wù)層,而不用我們自己去獲取。
怎么將UserDao怎樣注入到UserService內(nèi)部呢?
- set方法
- 構(gòu)造方法
1)set方法注入
在UserServiceImpl中添加setUserDao方法:
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
配置Spring容器調(diào)用set方法進(jìn)行注入
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
2)構(gòu)造方法注入
創(chuàng)建有參構(gòu)造
public class UserServiceImpl implements UserService {
@Override
public void save() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
}
}
配置Spring容器調(diào)用有參構(gòu)造時進(jìn)行注入
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
3.6 Bean的依賴注入的數(shù)據(jù)類型
1) 普通數(shù)據(jù)類型的注入
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="company" value="傳智播客"></property>
<property name="age" value="15"></property>
</bean>
2)集合數(shù)據(jù)類型(List<String>)的注入
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="strList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
</bean>
3)集合數(shù)據(jù)類型(List<User>)的注入
<bean id="u1" class="com.itheima.domain.User"/>
<bean id="u2" class="com.itheima.domain.User"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="userList">
<list>
<bean class="com.itheima.domain.User"/>
<bean class="com.itheima.domain.User"/>
<ref bean="u1"/>
<ref bean="u2"/>
</list>
</property>
</bean>
4)集合數(shù)據(jù)類型( Map<String,User> )的注入
<bean id="u1" class="com.itheima.domain.User"/>
<bean id="u2" class="com.itheima.domain.User"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="userMap">
<map>
<entry key="user1" value-ref="u1"/>
<entry key="user2" value-ref="u2"/>
</map>
</property>
</bean>
5)集合數(shù)據(jù)類型(Properties)的注入
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<property name="properties">
<props>
<prop key="p1">aaa</prop>
<prop key="p2">bbb</prop>
<prop key="p3">ccc</prop>
</props>
</property>
</bean>
4.Spring相關(guān)API
4.1ApplicationContext的實現(xiàn)類
1)ClassPathXmlApplicationContext
它是從類的根路徑下加載配置文件 推薦使用這種
2)FileSystemXmlApplicationContext
它是從磁盤路徑上加載配置文件,配置文件可以在磁盤的任意位置。
3)AnnotationConfigApplicationContext
當(dāng)使用注解配置容器對象時,需要使用此類來創(chuàng)建 spring 容器。它用來讀取注解。
4.2getBean()方法使用
app.getBean("id")
app.getBean(Class)
其中,當(dāng)參數(shù)的數(shù)據(jù)類型是字符串時,表示根據(jù)Bean的id從容器中獲得Bean實例,返回是Object,需要強(qiáng)轉(zhuǎn)。
當(dāng)參數(shù)的數(shù)據(jù)類型是Class類型時,表示根據(jù)類型從容器中匹配Bean實例,當(dāng)容器中相同類型的Bean有多個時,
則此方法會報錯。
