JAVA_EE_Spring學習一

簡介:

??可以認為spring是一個容器(container)

  • 包含內(nèi)容:
    • Ioc/DI 控制反轉(zhuǎn)/依賴注入
    • AOP 面向切面編程
    • 聲明事務。


      Runtime
  • test:spring提供的測試功能。
  • core container:核心容器蛾洛。spring啟動最基本的條件诱担。
    • spring中最大的容器是,applicationContext。
    • Beans:負責創(chuàng)建并管理對象的。
    • Core:核心類庫。
    • Context:上下文參數(shù)稍走,獲取外部資源或者管理注解。
    • SpEl:expression.jar
  • Date Access/Integration:封裝數(shù)據(jù)訪問層相關(guān)內(nèi)容
  • Web:完成web相關(guān)功能是需要柴底。

一婿脸、Spring環(huán)境搭建

  1. 導包,除了上面所說的啟動基本條件的包外柄驻,還有一個日志打印的包狐树。
jar
  1. 在src下新建applicationContext.xml文件
  • Spring 容器ApplicationContext,xml文件配置的信息最終都存儲到了ApplicationContext容器中鸿脓。
  • spring配置文件:基于schema抑钟。語法檢查器涯曲。
    • schema文件擴展名.xsd
    • 把schema理解成DTD 的升級版。比DTD具備更好的擴展性在塔,
    • 通過bean標簽來創(chuàng)建對象幻件。
    • 默認是配置文件被加載時候就創(chuàng)建對象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 
    id:獲取到的對象標識
    class:創(chuàng)建哪個類的對象
 -->
    <bean id="peo" class="com.qdl.pojo.People" />
</beans>
  1. 編寫測試方法。
  • getBean("id值"蛔溃,“返回值類型”)绰沥。不寫返回值類型默認是object
  • getBeanDefinitionNames,獲取spring所管理的所有對象名字贺待。
//配置文件一加載 類就會創(chuàng)建徽曲,而且會去尋找無參構(gòu)造方法。
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        People people = ac.getBean("peo",People.class);
        System.out.println(people);
        //獲取spring所管理的對象名字
        String[] names = ac.getBeanDefinitionNames();

二麸塞、創(chuàng)建對象的三種方式(IoC)

IoC-控制反轉(zhuǎn)
  • 是什么秃臣?
    • 原來有程序員主動new實例化對象的事情,轉(zhuǎn)交給spring負責
    • 控制:控制類的對象哪工。
    • 發(fā)轉(zhuǎn):轉(zhuǎn)交給spring負責奥此。
  • 優(yōu)點:解耦,程序員不需要管理對象了雁比,解除了對象管理和程序員之間的耦合得院。
1. 通過構(gòu)造方法創(chuàng)建
  • 無參構(gòu)造創(chuàng)建:默認創(chuàng)建
  • 有參構(gòu)造創(chuàng)建:需要明確配置
<bean id="peo" class="com.qdl.pojo.People">
        
            ref 是引用另一個bean,value是基本數(shù)據(jù)類型或string類型 
            index:指代的是有參構(gòu)造器中的第幾個參數(shù)章贞,
            name:指代的是有參構(gòu)造器中參數(shù)的名字
            type:指代參數(shù)的類型。
        <constructor-arg index="0" value="1"></constructor-arg>
        <constructor-arg index="1" value="張三"></constructor-arg>
        <constructor-arg index="2" value="23"></constructor-arg>
    </bean>
2. 實例工廠
  • 工廠設(shè)計模式:幫助創(chuàng)建類對象非洲,一個工廠可以生產(chǎn)多個對象鸭限。
  1. 創(chuàng)建實例工廠
public class PeopleFactory {

    public People newInstance() {
        return new People(2,"秦得力",23);
    }
}
  1. 在xml文件中配置工廠對象和需要創(chuàng)建的對象。
<bean id="factory" class="com.qdl.pojo.PeopleFactory"></bean>
    <bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>
3. 靜態(tài)工廠
  1. 創(chuàng)建工廠的靜態(tài)方法两踏。
  2. 在xml文件中配置 bean如下,指定其中的工廠方法即可败京。
<bean id="peo2" class="com.qdl.pojo.PeopleFactory" factory-method="newInstance"></bean>

三、給bean對象參數(shù)賦值

1梦染、通過構(gòu)造方法赡麦,在創(chuàng)建類的時候賦初始值。
2帕识、設(shè)置注入(通過set方法)
  • 設(shè)置注入就是走的類的get和set方法泛粹。
  1. 如果是基本數(shù)據(jù)類型或者string 類型則使用下面的方法。
  • 其中的value標簽可以寫道property標簽中間肮疗。
<bean id="peo" class="com.qdl.pojo.People">
        <property name="id" value="1"></property>
        <property name="name" value="秦得力"></property>
        <property name="age" value="23"></property>
    </bean>
  1. 如果是參數(shù)類型是set
<property name="sets">
            <set>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </set>
        </property>
  1. 參數(shù)類型是list
  • 方法同上晶姊,
  • 但是如果list中只有一個值,可以使用下面的方法:
    <property name="list" value="1"></property>
  1. 參數(shù)類型是數(shù)組類型(array)
  • 方法同上伪货,
  • 如果數(shù)組中只有一個值们衙,同樣可以同上钾怔。
  1. 參數(shù)是map
<property name="maps">
            <map>
                <entry key="1" value="1"></entry>
                <entry key="2" value="2"></entry>
                <entry key="3" value="3"></entry>
            </map>
        </property>
  1. 參數(shù)是properties
<property name="demo">
            <props>
                <prop key="1">value</prop>
            </props>
        </property>

四、DI/依賴注入

  • 和IoC是一樣的蒙挑,只不過是在其中一個對象中傳入另一個對象的參數(shù)
  • 上面一段是people類宗侦,中間傳入?yún)?shù)desk類的一個對象,使用DI注入忆蚀。
    <bean id="peo" class="com.qdl.pojo.People">
            <property name="desk" ref="desk"></property>
    </bean>
-----------------------------------------------------------------
    <bean id="desk" class="com.qdl.pojo.Desk">
        <property name="id" value="1"></property>
        <property name="price" value="100"></property>
    </bean>

五矾利、使用spring簡化mybatis

1、導包
  • mybatis所有的包蜓谋、spring基本包梦皮、spring-jdbc、spring-tx桃焕、spring-aop剑肯、spring整合mybatis的包。
2观堂、配置xml文件
-- 數(shù)據(jù)源封裝類:獲取數(shù)據(jù)庫連接的類
    1让网、導包:JDBC的spring支持包,mybatis的包师痕、
 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false &amp; serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="qinyu888"></property>
    </bean>
    -- 回憶前面我們寫mybatis的時候溃睹,在opensession之前加載的mybatis.xml
    因此,這里需要為其添加datasource胰坟。
     -->
     -- 創(chuàng)建sqlSessionFactory對象 -->
    <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    -- 掃描器因篇,相當于mybatis.xml中的mappers下的package標簽,掃描mapper后笔横,會給對應接口創(chuàng)建對象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        -- 要掃描哪個包 -->
        <property name="basePackage" value="com.qdl.mapper"></property>
        -- 和factory產(chǎn)生關(guān)系 -->
        <property name="sqlSessionFactory" ref="factory"></property>
    </bean>
    -- 這里的ref中為什么要這樣寫竞滓,是因為spring會自動把mpper的類名這樣命名 -->
    <bean id="peopleService" class="com.qdl.service.impl.PeopleServiceImpl">
        <property name="peopleMapper" ref="peopleMapper"></property>
    </bean>
3、編寫代碼
  1. 編寫pojo
  2. 編寫mapper包下時吹缔,必須使用接口綁定方案或注解方案(必須有接口)因為再service的實現(xiàn)層中商佑,必須要創(chuàng)建接口對象。不然沒辦法創(chuàng)建
  3. 再sevice實現(xiàn)類中聲明Mapper接口對象厢塘,并生成get和set方法茶没。(為了讓spring來代理)
  • spring無法管理servlet
public class PeopleServiceImpl implements PeopleService {
    private PeopleMapper peopleMapper=null;
    public PeopleMapper getPeopleMapper() {
        return peopleMapper;
    }
    public void setPeopleMapper(PeopleMapper peopleMapper) {
        this.peopleMapper = peopleMapper;
    }
    public List<People> show() {
        return peopleMapper.selAll();
    }
}

4. 編寫servlet層代碼,流程如下所示

  • 兩種方式加載配置文件:
    • 使用tomcat手動加載配置文件晚碾。
    • 使用tomcat自動加載配置文件需要步驟如下:
  1. 導包:spring-web
  2. 編寫web.xml配置文件抓半,讓tomcat自動去加載
<!-- 上下文參數(shù) -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- spring配置文件 -->
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <!-- 封裝了一個監(jiān)聽器,幫助加載spring的配置文件 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
  1. 書寫servlet代碼
  • 上面注釋的的手動加載格嘁,下面的是讓tomcat管理琅关,加載好我們拿出來用。
//@WebServlet("/people")
public class PeopleServlet extends HttpServlet {
    private PeopleService peopleService;
    
    @Override
    public void init() throws ServletException {
        //下面這一條代碼是我們設(shè)置tomcat去加載配置文件
        //ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        // spring和web整合后的所有信息都存放再webApplicationContext中 
        //下面這段代碼可以讓tomcat啟動的時候自動加載配置文件。
        WebApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());    
        peopleService = ac.getBean("peopleService",PeopleServiceImpl.class);
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    List<People> show = peopleService.show();
    PrintWriter out=resp.getWriter();
    out.write(show.toString());
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涣易,一起剝皮案震驚了整個濱河市画机,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌新症,老刑警劉巖步氏,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異徒爹,居然都是意外死亡荚醒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門隆嗅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來界阁,“玉大人,你說我怎么就攤上這事胖喳∨萸” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵丽焊,是天一觀的道長较剃。 經(jīng)常有香客問我,道長技健,這世上最難降的妖魔是什么写穴? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮雌贱,結(jié)果婚禮上啊送,老公的妹妹穿的比我還像新娘。我一直安慰自己欣孤,他們只是感情好馋没,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著导街,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纤子。 梳的紋絲不亂的頭發(fā)上搬瑰,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音控硼,去河邊找鬼泽论。 笑死,一個胖子當著我的面吹牛卡乾,可吹牛的內(nèi)容都是我干的翼悴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹦赎!你這毒婦竟也來了谍椅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤古话,失蹤者是張志新(化名)和其女友劉穎雏吭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陪踩,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡杖们,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肩狂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘完。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖傻谁,靈堂內(nèi)的尸體忽然破棺而出孝治,到底是詐尸還是另有隱情,我是刑警寧澤栅螟,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布荆秦,位于F島的核電站,受9級特大地震影響力图,放射性物質(zhì)發(fā)生泄漏步绸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一吃媒、第九天 我趴在偏房一處隱蔽的房頂上張望瓤介。 院中可真熱鬧,春花似錦赘那、人聲如沸刑桑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祠斧。三九已至,卻和暖如春拱礁,著一層夾襖步出監(jiān)牢的瞬間琢锋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工呢灶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吴超,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓鸯乃,卻偏偏與公主長得像鲸阻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容