Spring學習之旅(四)Spring工做原理再探

上篇博文對Spring的工做原理作了個大概的介紹,想看的同窗請出門左轉。今天詳細說幾點。html

(一)Spring IoC容器及其實例化與使用java

Spring IoC容器負責Bean的實例化、配置和組裝工做有兩個接口:BeanFactory和ApplicationContext。其中ApplicationContext繼承於BeanFactory,對企業級應用開發提供了更多的支持。在實際應用中都是用該接口。web

1)實例化Spring容器(主要有四種)spring

1.ClassPathXmlApplicationContext: 在類路徑下尋找配置XML文件實例化容器。服務器

ApplicationContext act = new ClassPathXmlApplicationContext("hellobean.xml");

2.FileSystemXmlApplicationContext:在文件系統路徑下尋找配置文件來實例化容器。框架

ApplicationContext act=new FileSystemXmlApplicationContext("d:/beans.xml");

3.XmlWebApplicationContext:從Web應用目錄WEB-INF中的XML配置文件實例化容器。(小編未能實現成功,請實現成功的同窗指教)eclipse

WebApplicationContext wctx = new XmlWebApplicationContext();

4.在web.xml配置文件中,經過配置監聽器實例化容器。(假定已經配置了Spring的配置文件)測試

在web.xml中註冊Spring提供的Servlet監視器,它會在當前Web應用被加載時將Spring的ApplicationContext保存到ServletContext對象中。ui

Spring配置文件可指定多個,之間用逗號隔開。this

//在網頁中經過request對象或其餘方式,獲取Web服務器容器
  ServletContext sc=request.getServletContext(); //利用spring框架提供的靜態方法,從Web服務器中獲取Spring容器
  WebApplicationContext wact=WebApplicationContextUtils.getRequiredWebApplicationContext(sc);

2)生成Bean實例

Spring容器經過getBean()方法,從容器中獲取所管理的對象。

例如:

HelloBeans student=(HelloBeans)wctx.getBean("stu1");

(二)基於XML文件方式的Bean配置

在java容器中造成Bean稱爲裝配。

Bean的裝配形式有兩種:基於XML文件的方式和基於註解的方式。

基於XML文件的方式就是用一個XML文件對Bean信息實施配置。主要有兩部分:命名空間、Bean及有關信息的配置。

4種配置Bean的方法:

例子:定義兩個實體類

public class Address { private String city; private String school; //無參構造器
    public Address(){ this.city="taian"; this.school="nongda"; } //有參構造器
    public Address(String city,String school){ this.city=city; this.school=school; } //省略了setter/getter方法
}
public class Student { private String name; private int age; Address address; //默認構造器
    public Student(){} //有參構造器
    public Address(String name,int age,Address address){ this.name=name; this.age=age; this.address=address; } //省略了setter/getter方法
}

第1種配置方法,利用帶參數的構造器注入:

<bean name="a1" class="com.edu.bean.Address">
<constructor-arg index="0" type="java.lang.String" value="北京"/>
<constructor-arg index="1" type="java.lang.String" value="清華"/>
</bean>

第2種配置方法,利用無參構造器注入:

<bean name="a2" class="com.edu.bean.Address"/>

第3種配置方法,利用屬性的setter方法注入:

<bean name="a3" class="com.edu.bean.Address">
<property name="city" value="北京"></property>
<property name="school" value="清華"></property>
</bean>

第4種配置方法,利用屬性的setter方法注入引用屬性:

<bean name="addr" class="com.edu.bean.Address">
<property name="city" value="北京"></property>
<property name="school" value="清華"></property>
</bean>


<bean name="ss" class="com.edu.bean.Student">
<property name="name" value="張三"></property>
<property name="age" value="20"></property>
<property name="address" ref="addr"></property>
</bean>

(三)Spring表達式——SpEL(Spring  Expression  Lanuage)

使用「#{...}」做爲定界符。全部在大括號中的字符都將被認爲是SpEL。SpEL爲Bean的屬性動態賦值提供了便利。

如下示例每一組兩條語句均爲等價表示:

<property name="count" value="#{5}"></property>
<property name="count" value="5"></property>

<property name="address" value="#{addr}"></property>
<property name="address" ref="addr"></property>

<property name="address" value="#{addr.city}"></property>

(四)基於註解方式的Bean配置

 先說個例子:

打開eclipse,創建java web工程以下:

注意:除常規web項目導入包外,另需導入aop方面的jar包(放在lib目錄下)

其中,UserDao類:

package com.edu.annotation; import org.springframework.stereotype.Service; @Service(value="abc") public class UserDao { public void save(){ System.out.println("保存數據完成!"); } }

beans-annotation.xml:

<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.edu.annotation"/>

</beans>

用於測試的主類Main:

package com.edu.annotation; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext act = new ClassPathXmlApplicationContext("beans-annotation.xml"); UserDao userDao=(UserDao)act.getBean("abc"); userDao.save(); } }

運行結果爲:保存數據完成!

從例子中咱們能夠看到,基於註解方式和基於XML方式Bean配置做用相同。

在java的實現類中,Spring提供了在類內進行Bean定義的標註(寫在類名上一行),從而標識該類建立Bean,讓Spring管理。

爲了便於分類管理,基於註解方式的Bean配置分爲4類:

1.@Component:基本註解(通用Bean標註)

2.@Respository:標識持久層組件

3.@Service:標識服務層(業務層)組件

4.@Controller:標識表現層組件

 

當一個類(組件被標註爲Bean後),每個Bean都有一個標識名稱(給Bean命名)。分兩種

1.若沒有在註解中指定,則實行Spring的默認命名策略:使用非限定類名,將類名的第一個字母小寫;

2.若在註解中指定(使用value屬性),就像例子中同樣,則使用指定名稱。

 

使用基於註解的Bean裝配時的幾點注意

1.beans-annotation.xml中命名空間和不使用時的不一樣;

2.需導入aop的jar包。

 

更多詳細的基於註解的Bean裝配,請各位移步官網自行查看,這裏再也不贅述。

連接奉上:https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/core.html#beans-annotation-config

本篇參考書籍《Java EE框架開發技術與案例教程》

相關文章
相關標籤/搜索