1. 程式人生 > >Day2 Spring初識(二)

Day2 Spring初識(二)

配置文件 class context 生命 text pro xmlns star xmla

Bean的實例化

bean實例化方式有3種:默認構造、靜態工廠、實例工廠

默認構造

調用無參構造, 屬性+setter

User.java

package entity;

public class User {
    private int id;
    private String name;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        
return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }

ApplicatitonContext.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"> <!-- 1.默認調用無參構造 屬性+setter name:真實賦值使用setter方法 scope:作用域
--> <bean id="user" class="entity.User"> <property name="id" value="1"></property> <property name="name" value="zs"></property> </bean> </beans>

Test.java

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import entity.User;


public class Test {
    
    @org.junit.Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicatitonContext.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user);
    }
}

運行結果

二月 01, 2018 8:19:43 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2a33fae0: startup date [Thu Feb 01 20:19:43 CST 2018]; root of context hierarchy
二月 01, 2018 8:19:44 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [ApplicatitonContext.xml]
User [id=1, name=zs]

調用有參構造 屬性+有參構造

User.java

package entity;

public class User {
    private int id;
    private String name;
    
    public User(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    } 
}

ApplicatitonContext.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">

    <!-- 2.調用有參構造      屬性+有參構造
        constructor-arg:
            name:屬性名稱
            value:簡單類型的值
            ref:引用
            
            index:參數的索引
            type:參數的類型
     -->
    <bean id="user" class="entity.User">
        <constructor-arg name="id" value="1"  ></constructor-arg>
        <constructor-arg name="name" value="lisi"></constructor-arg>
        
        <!-- <constructor-arg index="0" type="int"  value="1"></constructor-arg>
        <constructor-arg index="1" value="zs"></constructor-arg> -->
    </bean>
    
    
    
</beans>

Test.java

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import entity.User;


public class Test {
    
    @org.junit.Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicatitonContext.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user);
    }
}

運行結果

二月 01, 2018 8:23:39 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2a33fae0: startup date [Thu Feb 01 20:23:39 CST 2018]; root of context hierarchy
二月 01, 2018 8:23:39 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [ApplicatitonContext.xml]
User [id=1, name=lisi]

靜態工廠

User.java

技術分享圖片
package entity;

public class User {
    private int id;
    private String name;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
    
    
}
View Code

StaticFactory.java

技術分享圖片
package factory;

import entity.User;

public class StaticFactory {
    
    public static User createUser() {
        return new User();
    }
}
View Code

ApplicatitonContext.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="user" class="factory.StaticFactory" factory-method="createUser"></bean>
    
    
</beans>
View Code

Test.java

技術分享圖片
package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import entity.User;


public class Test {
    
    @org.junit.Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicatitonContext.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user);
    }
}
View Code

運行結果

二月 01, 2018 8:28:44 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2a33fae0: startup date [Thu Feb 01 20:28:44 CST 2018]; root of context hierarchy
二月 01, 2018 8:28:44 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [ApplicatitonContext.xml]
User [id=0, name=null]

動態工廠

User.java

技術分享圖片
package entity;

public class User {
    private int id;
    private String name;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
    
    
}
View Code

InstanceFactory.java

技術分享圖片
package factory;

import entity.User;

public class InstanceFactory {
    
    public User createUser(){
        return new User();
    }
}
View Code

ApplicatitonContext.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">

    <!-- 3.實例工廠 -->
    <bean id="factory" class="factory.InstanceFactory"></bean>
    <bean id="user" factory-bean="factory" factory-method="createUser"></bean>
    
    
</beans>
View Code

Test.java

技術分享圖片
package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import entity.User;


public class Test {
    
    @org.junit.Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicatitonContext.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user);
    }
}
View Code

運行結果

二月 01, 2018 8:32:59 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2a33fae0: startup date [Thu Feb 01 20:32:59 CST 2018]; root of context hierarchy
二月 01, 2018 8:32:59 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [ApplicatitonContext.xml]
User [id=0, name=null]

Bean的作用域

  • singleton:(單實例模式)spring容器只會存在一個共享的bean實例,並且所有針對該bean的請求只會返回同一個bean實例。
  • propertype(no-singleton):對每一次針對該bean的請求都會生成一個新的bean實例。 相當於java中的new 操作。定義為propertype的bean其生命周期很長,不易回收,通常要額外的處理。
  • request:針對每一次的http請求都會產生一個新的bean實例,Bean僅在當前的http request範圍內有效
  • session:針對每一次的http請求都會產生一個新的bean實例,Bean僅在當前的http session範圍內有效

Bean的聲明周期

圖示說明

技術分享圖片

技術分享圖片

初始化方法和銷毀方法

User.java

技術分享圖片
package entity;

public class User {
    private int id;
    private String name;
    
    public void init() {
        System.out.println("初始化");
    }
    
    public void destory() {
        System.out.println("銷毀");
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
    
    
}
View Code

ApplicatitonContext.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">

    <!-- 1.默認調用無參構造   屬性+setter 
            name:真實賦值使用setter方法
            scope:作用域
    -->
     <bean id="user" class="entity.User" init-method="init" destroy-method="destory">
        <property name="id" value="1"></property>
        <property name="name" value="zs"></property>
    </bean>  
    
</beans>
View Code

Test.java

技術分享圖片
package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import entity.User;


public class Test {
    
    @org.junit.Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicatitonContext.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user);
        //容器關閉,必須使用單例默認,只有容器關閉之後才能調用destroy方法
        ((ClassPathXmlApplicationContext)context).close();
    }
}
View Code

運行結果

二月 01, 2018 8:44:32 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2a33fae0: startup date [Thu Feb 01 20:44:32 CST 2018]; root of context hierarchy
二月 01, 2018 8:44:32 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [ApplicatitonContext.xml]
初始化
二月 01, 2018 8:44:32 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@2a33fae0: startup date [Thu Feb 01 20:44:32 CST 2018]; root of context hierarchy
User [id=1, name=zs]
銷毀

生命周期管理

兩個時機

Spring可以管理實例化bean之間以及銷毀之前的行為

註入依賴關系之後:

  • 使用init-method屬性:通過指定init-method屬性,確定某個方法應該在Bean依賴關系結束之後執行。這種方式無需要將代碼與Spring的接口耦合在一起代碼汙染極小。通常在bean當中進行方法定義如init()方法,然後在配置文件Bean元素中加入init-method屬性來實現這個過程。
  • 實現InnitializingBean接口:這種方式無須指明init-method屬性,當窗口依賴註入以後,會自動調用afterPropertiesSet方法,它和init-method執行效果一樣,但這種方式屬於侵入性的代碼設計不推薦使用

銷毀Bean之前:

  • destroy-method:用於在執行Bean銷毀之前所執行的方法,這種方式和init-method一樣無壓需要代碼與Spring的接口耦合在一起代碼汙染極小。在bean中加入destory-method屬性和實現這個過程
  • 實現DisposeableBean接口:無需要指明destory-method屬性,當容器依賴註入以後,會自動調用destroty方法,屬於侵入性代碼設計不推薦使用

Day2 Spring初識(二)