Day2 Spring初識(二)
阿新 • • 發佈:2018-02-27
配置文件 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初識(二)