• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • spring框架入門學習

    標簽: 框架  spring

    1.   Spring概述

    1.1. Spring是什么

    Spring是一個開放源代碼的設計層面框架,他解決的是業務邏輯層和其他各層的松耦合問題,
    因此它將面向接口的編程思想貫穿整個系統應用。Spring是于2003 年興起的一個輕量級的Java 開發框架,
    由Rod Johnson創建。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架。


    J2EE三層架構體系

    l  表現層(頁面數據顯示、頁面跳轉調度)jsp/servlet

    l  業務層(業務處理和功能邏輯、事務控制)-serivice

    l  持久層(數據存取和封裝、和數據庫打交道)dao


    一站式

    Spring提供了JavaEE各層的解決方案,表現層:Spring MVC,持久層:JdbcTemplate、ORM框架整合,業務層:IoC、AOP、事務控制。

    輕量級:Spring的出現取代了EJB的臃腫、低效、繁瑣復雜、脫離現實。


    1.2. Spring體系架構


    1.3. Spring的核心技術

    IoC(Inverse of Control 反轉控制): 將對象創建權利交給Spring工廠進行管理。

    AOP(Aspect Oriented Programming 面向切面編程),基于動態代理功能增強。

    1.4. 為什么要學習Spring



    2.   Spring IOC快速入門


    2.1. 什么是IOC

    Inverse of Control,控制反轉,將對象的創建權力反轉給Spring框架!!

    解決問題:使用IOC可以解決的程序耦合性高的問題!!

    2.2. IOC的原理

    2.2.1.準備工作

    創建UserDao接口及其實現類UserDaoImpl

    package cn.baidu.dao;
    
    public interface UserDao {
    
    	public void save();
    	
    }
    
    package cn.baidu.dao.impl;
    
    import cn.baidu.dao.UserDao;
    
    public class UserDaoImpl implements UserDao {
    
    	@Override
    	public void save() {
    		System.out.println("持久層:用戶保存");
    	}
    
    }
    

    創建UserService接口及其實現類UserServiceImpl

    package cn.baidu.service;
    
    public interface UserService {
    
    	public void save();
    	
    }

    package cn.baidu.service.impl;
    
    import cn.baidu.dao.UserDao;
    import cn.baidu.dao.impl.UserDaoImpl;
    import cn.baidu.service.UserService;
    
    publicclass UserServiceImpl implements UserService {
    	
    	private UserDao userDao = new UserDaoImpl();
    	
    	@Override
    	public void save() {
    		System.out.println("業務層:用戶保存");
    		userDao.save();
    	}
    
    }
    

    2.2.2.創建測試類測試

    package cn.baidu.test;
    
    import org.junit.Test;
    
    import cn.baidu.service.UserService;
    import cn.baidu.service.impl.UserServiceImpl;
    
    publicclass Test1 {
    
    	@Test
    	public void test(){
    		UserService userService = new UserServiceImpl();
    		userService.save();
    	}
    }
    

     創建另一個UserDao的實現UserDaoImpl2

    package cn.baidu.dao.impl;
    
    import cn.baidu.dao.UserDao;
    
    public class UserDaoImpl2 implements UserDao{
    
    	@Override
    	public void save() {
    		System.out.println("持久層:用戶保存2");
    	}
    
    }
    

    觀察以上程序發現:UserServiceUserDao耦合性過高,如果需要換一個UserDao的實現,則需要更改源代碼

    2.2.3.創建工廠類解決耦合性的問題

    package cn.baidu.utils;
     
    import cn.baidu.dao.UserDao;
    import cn.baidu.dao.impl.UserDaoImpl;
     
    public class BeanFactory {
     
       public static UserDao getBean(){
          return new UserDaoImpl();
       }
    }


    修改UserServiceImpl實現類獲取UserDao的方式

    public class UserServiceImpl implements UserService {
    	
    //	private UserDao userDao = new UserDaoImpl();
    	
    //	采用工廠類獲取UserDao對象
    	private UserDao userDao = BeanFactory.getBean();
    	
    	@Override
    	public void save() {
    		System.out.println("業務層:用戶保存");
    		userDao.save();
    	}
    
    }
    

    觀察發現:當需要更換UserDao的實現時,不需要更改UserServiceImpl類,但還是要更改工廠類。

    2.2.4.創建配置文件徹底解決耦合性的問題

    在src下創建配置文件beans.xml

    <?xml version="1.0"encoding="UTF-8"?>
    <bean id="userDao"class="cn.baidu.dao.impl.UserDaoImpl2"></bean>
    


    修改工廠類,從配置文件讀取對象

    public class BeanFactory {
    	
    	//存放所有的對象
    	private static final Map<String,Object>map = new HashMap<String,Object>();
    	
    	static{
    		SAXReader sax = new SAXReader();
    		try {
    			Document document = sax.read(BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml"));
    			Element root = document.getRootElement();
    			//獲取id屬性的值
    			String id = root.attributeValue("id");
    			//獲取class屬性的值
    			String value = root.attributeValue("class");
    			//根據class屬性的值實例化對象
    			Object obj = Class.forName(value).newInstance();
    			//把對象存放到Map中
    			map.put(id, obj);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 根據id獲取對象
    	 * @param id
    	 * @return
    	 */
    	public static Object getBean(String id){
    		return map.get(id);
    	}
    }
    


    修改UserServiceImpl類

    public class UserServiceImpl implements UserService {
    	
    //	private UserDao userDao = new UserDaoImpl();
    	
    //	采用工廠類獲取UserDao對象
    //	private UserDao userDao = BeanFactory.getBean();
    	
    //	從配置文件中讀取需要的對象
    	private UserDao userDao = (UserDao) BeanFactory.getBean("userDao");
    
    	@Override
    	public void save() {
    		System.out.println("業務層:用戶保存");
    		userDao.save();
    	}
    
    }
    


    觀察發現:當需要更改UserDao時,只需要更改配置文件就行,不用更改源代碼,程序徹底解耦了!!!


    2.3. Spring開發包

    官網地址:https://spring.io/

    下載網址:http://repo.spring.io/libs-release-local/org/springframework/spring/


    本次學習采用4.2.4這個版本

    開發包目錄結構


    開發過程中還需要其他開源技術框架依賴Jar包集(dependencies,作用是方便依賴的其他技術的jar的導入):


    2.4. Spring IOC入門

    2.4.1.新建Java工程spring4_day01,導入jar包

    Spring核心容器需要四個jar包



    同時還需要與日志相關的兩個jar包,從spring-framework-3.0.2.RELEASE-dependencies中尋找



    復制log4j.properties到src下:



    如何在Java工程中導入jar包?

    在Java工程中新建一個目錄lib,把需要導入的jar包復制到lib下,右鍵需要導入的jar包,build path,添加到項目中

    2.4.2.創建一個接口和實現類

    package cn.baidu.dao;
    
    public interface UserDao {
    
    	public void save();
    	
    }
    
    package cn.baidu.dao.impl;
    
    import cn.baidu.dao.UserDao;
    
    public class  UserDaoImpl implements UserDao {
    
    	@Override
    	public void  save() {
    		System.out.println("用戶保存...");
    	}
    
    }
    


    2.3.4.創建Spring的核心配置文件

    在src下新建Spring核心配置文件applicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
    </beans>
    


    2.4.4.配置UserDaoImpl類

    <?xml version="1.0"encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userDao"class="cn.baidu.dao.impl.UserDaoImpl"></bean>
    </beans>
    

    2.4.5.編寫測試類

    public class  Test1 {
    
    	@Test
    	public void test1(){
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    	}
    }
    
    測試發現:我們可以從spring容器中獲取對象。

    3.   Spring中的工廠

    3.1. ApplicationContext接口

    使用ApplicationContext工廠的接口,使用該接口可以獲取到具體的Bean對象

    接口下有兩個具體的實現類

    *ClassPathXmlApplicationContext            --加載類路徑下的Spring配置文件
     *FileSystemXmlApplicationContext            --加載本地磁盤下的Spring配置文件

    public class  Test1 {
    
    	@Test
    	public void  test1(){
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    	}
    	
    	@Test
    	public void  test2(){
    		ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:/spring/applicationContext.xml");
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    	}
    	
    }
    

    3.2. BeanFactory工廠

    BeanFactory是Spring框架早期的創建Bean對象的工廠接口

    /**
    	 * 早期版本的spring工廠:BeanFactory
    	 */
    	@Test
    	public void  test3(){
    		BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
    		System.out.println("工廠對象創建出來了");
    		UserDao userDao = (UserDao) factory.getBean("userDao");
    		userDao.save();
    	}
    

     BeanFactory和ApplicationContext的區別
                *BeanFactory                --BeanFactory采取延遲加載,第一次getBean時才會初始化Bean
                *ApplicationContext        -- 在加載applicationContext.xml時候就會創建具體的Bean對象的實例,還提供了一些其他的功能:
                                           * 事件傳遞
                                           * Bean自動裝配
                                           * 各種不同應用層的Context實現


    4.   Spring配置文件

    4.1.  id屬性

    id屬性是bean的唯一標識

    4.2. class屬性

    bean的全路徑名

    <bean id="userDao"class="cn.baidu.dao.impl.UserDaoImpl"/>

    4.3. scope屬性

    scope屬性代表Bean的作用范圍

    singleton:單例(默認值)

    prototype:多例,在Spring框架整合Struts2框架的時候,Action類也需要交給Spring做管理,配置把Action類配置成多例!!

    request:應用在web應用中,將創建的對象存入到request域中。

    session:應用在web應用中,將創建的對象存入到session域中

    globalsession:應用在porlet環境下使用。將創建的對象存入到全局的session中。

    <bean id="userDao"class="cn.baidu.dao.impl.UserDaoImpl"scope="prototype"/>

    修改測試類:

    @Test
    public void test1(){
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    		System.out.println("工廠對象創建出來了");
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    }
    

    測試發現:scopeprototype時,每次獲取bean,都會重新實例化

    4.4. init-method屬性

    當bean被載入到容器的時候調用init-method屬性指定的方法

    public class  UserDaoImpl implements UserDao {
    	
    	public UserDaoImpl() {
    		System.out.println("調用了UserDaoImpl的構造方法");
    	}
    	
    	public void  init(){
    		System.out.println("調用了init方法...");
    	}
    
    	@Override
    	public void  save() {
    		System.out.println("用戶保存...");
    	}
    
    }
    
    <bean id="userDao"class="cn.baidu.dao.impl.UserDaoImpl"init-method="init"/>
    測試結果:

    4.5. destory-method屬性

    當bean從容器中刪除的時候調用destroy-method屬性指定的方法

    想查看destroy-method的效果,有如下條件:

               scope= singleton有效

               web容器中會自動調用,但是main函數或測試用例需要手動調用(需要使用ClassPathXmlApplicationContext的close()方法)

    @Test
    public void  test1(){
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    		System.out.println("工廠對象創建出來了");
    		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    		userDao.save();
    		//要看到destroy方法執行,需要調用ClassPathXmlApplicationContext.close方法
    		((ClassPathXmlApplicationContext)applicationContext).close();
    }
    

    5.   Spring生成bean的三種方式

    5.1. 無參構造方法

    默認調用無參構造方法實例化bean

    5.2. 靜態工廠實例化方式

    通過調用工廠類的靜態方法來生成bean

    編寫DepartmentDao接口

    package cn.baidu.dao;
    
    publicinterface DepartmentDao {
    
    	public void  save();
    }
    

    編寫DepartmentDaoImpl實現類

    package cn.baidu.dao.impl;
    
    import cn.baidu.dao.DepartmentDao;
    
    public class  DepartmentDaoImpl implements DepartmentDao{
    
    	@Override
    	public void  save() {
    		System.out.println("部門保存...");
    	}
    
    }
    

    編寫工廠類

    package cn.baidu.dao.impl;
    
    import cn.baidu.dao.DepartmentDao;
    
    public class  DepartmentDaoFactory {
    
    	/**
    	 * 靜態工廠方法獲取對象
    	 * @return
    	 */
    	public static  DepartmentDao create(){
    		return new  DepartmentDaoImpl();
    	}
    }
    
    編寫applicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userDao" class="cn.baidu.dao.impl.UserDaoImpl" init-method="init" destroy-method="destory"/>
    <bean id="departmentDao" class="cn.baidu.dao.impl.DepartmentDaoFactory" factory-method="create"></bean>
    </beans>
    

    5.3. 實例工廠實例化方式

     實例工廠代碼:

    package cn.baidu.dao.impl;
    
    import cn.baidu.dao.DepartmentDao;
    
    public class  DepartmentDaoFactory {
    
    	/**
    	 * 靜態工廠方法獲取對象
    	 * @return
    	 */
    	public static  DepartmentDao create(){
    		return new  DepartmentDaoImpl();
    	}
    	
    	/**
    	 * 實例工廠方法獲取對象
    	 * @return
    	 */
    	public DepartmentDao create1(){
    		return new  DepartmentDaoImpl();
    	}
    }
    

    編寫applicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userDao" class="cn.baidu.dao.impl.UserDaoImpl" init-method="init "destroy-method="destory"/>
    <!--  <bean id="departmentDao" class="cn.baidu.dao.impl.DepartmentDaoFactory" factory-method="create"></bean> -->
    <bean id="departmentDaoFactory" class="cn.baidu.dao.impl.DepartmentDaoFactory"></bean>
    <bean id="departmentDao" factory-bean="departmentDaoFactory" factory-method="create1"></bean>
    </beans>
    

    6.   依賴注入

    6.1. 什么是依賴注入

    IOC和DI的概念:
            *IOC        -- Inverse of Control,控制反轉,將對象的創建權反轉給Spring!!
            *DI        -- Dependency Injection,依賴注入,在Spring框架負責創建Bean對象時,動態的將依賴對象注入到Bean組件中!!

    如果UserServiceImpl的實現類中有一個屬性,那么使用Spring框架的IOC功能時,可以通過依賴注入把該屬性的值傳入進來!!

    6.2. 構造方法注入

     Car實體類

    package cn.baidu.domain;
    
    public class  Carimplements Serializable{
    privatestaticfinallongserialVersionUID = 1L;
    	private String name;
    	private Double price;
    	
    	public Car(String name, Double price) {
    		this.name = name;
    		this.price = price;
    	}
    
    	public String getName() {
    		returnname;
    	}
    
    	public void  setName(String name) {
    		this.name = name;
    	}
    
    	public Double getPrice() {
    		returnprice;
    	}
    
    	public void  setPrice(Double price) {
    		this.price = price;
    	}
    
    	@Override
    	public String toString() {
    		return"Car [name=" + name + ", price=" + price + "]";
    	}
    	
    }
    

    配置applicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userDao" class="cn.baidu.dao.impl.UserDaoImpl" init-method="init" destroy-method="destory"/>
    <!--  <bean id="departmentDao" class="cn.baidu.dao.impl.DepartmentDaoFactory" factory-method="create"></bean> -->
    <bean id="departmentDaoFactory" class="cn.baidu.dao.impl.DepartmentDaoFactory"></bean>
    <bean id="departmentDao" factory-bean="departmentDaoFactory" factory-method="create1"></bean>
    <!-- 構造方法注入 -->
    <bean id="car" class="cn.baidu.domain.Car">
    	<constructor-arg name="name" value="奧迪A6"></constructor-arg>
    	<constructor-arg name="price" value="57.3"></constructor-arg>
    </bean>
    </beans>
    

    運行結果:


    6.3. set方法注入

    Student實體類

    public class  Student implements Serializable {
    
    	privatestaticfinallongserialVersionUID = 1L;
    	
    	private Long id;
    	private String name;
    	
    	public Long getId() {
    		returnid;
    	}
    	public void  setId(Long id) {
    		this.id = id;
    	}
    	public String getName() {
    		returnname;
    	}
    	public void  setName(String name) {
    		this.name = name;
    	}
    	@Override
    	public String toString() {
    		return"Student [id=" + id + ", name=" + name + "]";
    	}
    }
    

     配置applicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userDao" class="cn.baidu.dao.impl.UserDaoImpl" init-method="init" destroy-method="destory"/>
    <!--  <bean id="departmentDao" class="cn.baidu.dao.impl.DepartmentDaoFactory" factory-method="create"></bean> -->
    <bean id="departmentDaoFactory" class="cn.baidu.dao.impl.DepartmentDaoFactory"></bean>
    <bean id="departmentDao" factory-bean="departmentDaoFactory" factory-method="create1"></bean>
    <!-- 構造方法注入 -->
    <bean id="car" class="cn.baidu.domain.Car">
    	<constructor-arg name="name" value="奧迪A6"></constructor-arg>
    	<constructor-arg name="price" value="57.3"></constructor-arg>
    </bean>
    <!-- set方法注入 -->
    <bean id="student" class="cn.baidu.domain.Student">
    	<property name="id" value="11"></property>
    	<property name="name" value="張三"></property>
    </bean>
    </beans>
    

    測試結果:


    注意:采用set方法注入時,類中一定要有無參構造方法,因為spring會先調用無參構造方法實例化對象。

    6.4. set方法注入對象

    People實體類

    public class  People implements Serializable {
    
    	privatestaticfinallongserialVersionUID = 1L;
    	private Long id;
    	private String name;
    	private Car car;
    	public Long getId() {
    		returnid;
    	}
    	public void  setId(Long id) {
    		this.id = id;
    	}
    	public String getName() {
    		returnname;
    	}
    	public void  setName(String name) {
    		this.name = name;
    	}
    	public Car getCar() {
    		returncar;
    	}
    	public void  setCar(Car car) {
    		this.car = car;
    	}
    	@Override
    	public String toString() {
    		return"People [id=" + id + ", name=" + name + ", car=" + car + "]";
    	}
    	
    }
    

     配置applicationContext.xml

    <!-- set方法注入對象 -->
    <bean id="people" class="cn.baidu.domain.People">
    <property name="name" value="小明"></property>
    <property name="car" ref="car"></property>
    </bean>
    
    運行結果:


    6.5. set方法其它注入寫法

    通過set方法注入還有其它兩種寫法:

    6.5.1.p命名空間的寫法

    新建Car1類

    package cn.baidu.domain;
    
    public class  Car1 {
    
    	private String name;
    	private double price;
    	
    	public void  setName(String name) {
    		this.name = name;
    	}
    	public void  setPrice(doubleprice) {
    		this.price = price;
    	}
    	@Override
    	public String toString() {
    		return"Car1 [name=" + name + ", price=" + price + "]";
    	}
    	
    }
    

    在applicationContext.xml中引入p命名空間


    采用p:屬性名的形式注入值(spring2.5提供的)

    <!-- p命名空間注入 -->
    <bean id="car1" class="cn.baidu.domain.Car1" p:name="奔馳" p:price="100.2">
    </bean>
    

    6.5.2.SpEL的寫法(spring3.0提供)

    <!-- SpEL注入 -->
    <bean id="car1" class="cn.baidu.domain.Car1">
    <property name="name" value="#{'哈弗H5'}"></property>
    <property name="price" value="#{10}"></property>
    </bean>
    

    注入字符串:#{‘字符串’}

    注入數字:#{數字}

    注入其它對象:#{對象id}

    <bean id="people" class="cn.baidu.domain.People">
    	<property name="name" value="#{'小明'}"></property>
    	<property name="car" value="#{car}"></property>
    </bean>
    

    還可以注入其它對象的屬性或方法的返回值

    public class  CarInfo {
    
    	public String getCarName(){
    		return "寶駿560";
    	}
    	
    	public double calculatePrice(){
    		return Math.random() * 10000;
    	}
    }
    
    <bean id="carInfo"class="cn.baidu.domain.CarInfo"></bean>
    <!-- SpEL注入 -->
    <bean id="car1" class="cn.baidu.domain.Car1">
    <!-- <property name="name" value="#{'哈弗H5'}"></property>
    <property name="price" value="#{10}"></property> -->
    <property name="name" value="#{carInfo.carName}"></property>
    <property name="price" value="#{carInfo.calculatePrice()}"></property>
    </bean>
    

    注意:#{carInfo.carName}會調用getCarName方法獲取汽車的名稱;而#{carInfo.calculatePrice()}會直接調用calculatePrice方法獲取汽車價格。

    6.6. 數組或list注入

    數組和list注入的寫法是一樣的

    新建bean類

    public class  CollectionBean {
    
    	private String[] array;
    
    	public void  setArray(String[] array) {
    		this.array = array;
    	}
    
    	@Override
    	public String toString() {
    		return"CollectionBean [array=" + Arrays.toString(array) + "]";
    	}
    	
    }
    

    在applicationContext.xml中配置

    <bean id="collectionBean" class="cn.baidu.domain.CollectionBean">
    	<property name="array">
    		<list>
    			<value>威少</value>
    			<value>哈登</value>
    			<value>萊昂納德</value>
    		</list>
    	</property>
    </bean>
    

    6.7. Set集合的注入

    public class  CollectionBean {
    
    	private String[] array;
    	private Set<String>set;
    
    	public void  setArray(String[] array) {
    		this.array = array;
    	}
    
    	public void  setSet(Set<String>set) {
    		this.set = set;
    	}
    
    	@Override
    	public String toString() {
    		System.out.println(set.getClass());
    		return"CollectionBean [array=" + Arrays.toString(array) + ", set=" + set + "]";
    	}
    
    }
    
    <bean id="collectionBean" class="cn.baidu.domain.CollectionBean">
    	<property name="array">
    		<list>
    			<value>威少</value>
    			<value>哈登</value>
    			<value>萊昂納德</value>
    		</list>
    	</property>
    	<property name="set">
    		<set>
    			<value>蘋果</value>
    			<value>梨子</value>
    			<value>香蕉</value>
    		</set>
    	</property>
    </bean>
    

    提示:spring在注入set的時,給我們注入的是一個LinkedHashSet,所以在輸入set集合中的元素時,是按照我們注入的順序來的,并不是無序的。

    6.8. Map集合的注入

    public class  CollectionBean {
    
    	private String[] array;
    	private Set<String>set;
    	private Map<String,String>map;
    
    	public void  setArray(String[] array) {
    		this.array = array;
    	}
    
    	public void  setSet(Set<String>set) {
    		this.set = set;
    	}
    	
    	public void  setMap(Map<String, String>map) {
    		this.map = map;
    	}
    
    	@Override
    	public String toString() {
    		return"CollectionBean [array=" + Arrays.toString(array) + ", set=" + set + ", map=" + map + "]";
    	}
    
    }
    
    <bean id="collectionBean" class="cn.baidu.domain.CollectionBean">
    	<property name="array">
    		<list>
    			<value>威少</value>
    			<value>哈登</value>
    			<value>萊昂納德</value>
    		</list>
    	</property>
    	<property name="set">
    		<set>
    			<value>蘋果</value>
    			<value>梨子</value>
    			<value>香蕉</value>
    		</set>
    	</property>
    	<property name="map">
    		<map>
    			<entrykey="id"value="11"></entry>
    			<entrykey="name"value="張三"></entry>
    			<entrykey="age"value="20"></entry>
    		</map>
    	</property>
    </bean>
    

    Properties的注入

    public class  CollectionBean {
    
    	private String[] array;
    	private Set<String>set;
    	private Map<String,String>map;
    	private Properties props;
    
    	public void  setArray(String[] array) {
    		this.array = array;
    	}
    
    	public void  setSet(Set<String>set) {
    		this.set = set;
    	}
    	
    	public void  setMap(Map<String, String>map) {
    		this.map = map;
    	}
    
    	public void  setProps(Properties props) {
    		this.props = props;
    	}
    
    	@Override
    	public String toString() {
    		return"CollectionBean [array=" + Arrays.toString(array) + ", set=" + set + ", map=" + map + ", props=" + props
    				+ "]";
    	}
    
    }
    
    <bean id="collectionBean" class="cn.baidu.domain.CollectionBean">
    	<property name="array">
    		<list>
    			<value>威少</value>
    			<value>哈登</value>
    			<value>萊昂納德</value>
    		</list>
    	</property>
    	<property name="set">
    		<set>
    			<value>蘋果</value>
    			<value>梨子</value>
    			<value>香蕉</value>
    		</set>
    	</property>
    	<property name="map">
    		<map>
    			<entry key="id"value="11"></entry>
    			<entry key="name"value="張三"></entry>
    			<entry key="age"value="20"></entry>
    		</map>
    	</property>
    	<property name="props">
    		<props> 
    			<prop key="username">李四</prop>
    			<prop key="password">123</prop>
    		</props>
    	</property>
    </bean>
    

    6.9. 配置文件的分離

    Spring配置文件的分離有兩種方式:

    (1)采用import標簽導入另一個配置文件

    Bean1類
    Public class Bean1 {
    	private String xxx;
    	public String getXxx() {
    		returnxxx;
    	}
    	Public void setXxx(String xxx) {
    		this.xxx = xxx;
    	}
    	@Override
    	public String toString() {
    		return "Bean1 [xxx=" + xxx + "]";
    	}
    }
    

    applicationContext2.xml

    <?xml version="1.0"encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="bean1" class="cn.itcast.demo.Bean1">
    	<property name="xxx" value="hello"></property>
    </bean>
    </beans>
    

    在applicationContext.xml中引入applicationContext2.xml文件

    <import resource="applicationContext2.xml"/>

    (2)在實例化ApplicationContext的時候,指定多個配置文件

    @Test
    	public void test9(){
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
    		Bean1 bean1 = (Bean1) ac.getBean("bean1");
    		System.out.println(bean1);
    	}
    

    版權聲明:本文為weixin_39910092原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_39910092/article/details/78176869

    智能推薦

    Spring MVC框架入門

    文章目錄 MVC設計模式簡介 Spring MVC處理用戶請求的完整流程 Spring MVC框架搭建 視圖解析器 Spring MVC獲取請求參數方式&注解 Spring MVC的轉發與重定向 請求參數類型轉換 內容出處: Spring MVC 角色劃分清晰,分工明細,并且和 Spring 框架無縫結合。作為當今業界最主流的 Web 開發框架,Spring MVC 已經成為當前最熱門的開...

    Spring框架入門分析

    定位 輕量級的企業級 Java 應用程序開發框架,基礎版本只有 2 MB 左右的大小。核心特性是可以用于開發任何 Java 應用程序,但是在 Java EE 平臺上構建 web 應用程序是需要擴展的。 Spring 框架的目標是使 J2EE 開發變得更容易使用,通過啟用基于 POJO 編程模型來促進良好的編程實踐。 架構分析:Core Containe IOC容器: Spring BeanFact...

    Spring Boot框架入門學習記錄(一)

    首先來學習如何建立一個項目然后輸出hello world! 一、創建一個maven工程 創建好后如圖 二、導入spring boot相關的依賴 打開pom.xml,這是一個配置文件 org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE org.springframework.boot spring-boot-starte...

    全面學習Spring框架入門與提高(含代碼)

    這一篇文章我將和大家一起回顧整個Spring框架技術,由于內容較多,內容共分為三大部分。每一篇都從簡到難地安排了一些小知識點,東西是當時我老師講的,現在將知識點都整理下來,供大家一起討論學習,也方便以后自己復習。如果有不對的地方歡迎大家指正。 1.初識Spring框架,聲明周期和延時加載… 2.注入,自動裝配,注入集合類型,注入properties類型… 3.Sprin...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡