Spring簡介及入門。

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的七大模塊
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)用者

圖示 :

spring開發(fā)步驟

導(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)部。
Bean的依賴注入

依賴注入(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有多個時,
則此方法會報錯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容