Spring學習(三)bean的作用域、生命週期、後置處理器

bean節點中scope屬性定義了bean的作用域

作用域:

prototype:多例,在使用時創建對應的對象

<bean id="person1" class="com.ztt.spring.Person" scope="prototype">
	<constructor-arg value="22" type="java.lang.Integer"></constructor-arg>
	<constructor-arg value="abc" type="java.lang.String"></constructor-arg>
</bean>
package com.ztt.testSpring;

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

import com.ztt.spring.Person;

public class testPerson {
	public static void main(String[] args){
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	Person person1 = ac.getBean("person1", Person.class);
	Person person2 = ac.getBean("person1", Person.class);
	System.out.println("person1:" + person1);
	System.out.println("person2:" + person2);
}
}

運行結果:

person1:com.ztt.spring.Person@53dcaa65
person2:com.ztt.spring.Person@3c36f7e6

singleton:單例,只能創建一個對象,初始化容器時就創建了對象

<bean id="person1" class="com.ztt.spring.Person" scope="singleton">
	<constructor-arg value="22" type="java.lang.Integer"></constructor-arg>
	<constructor-arg value="abc" type="java.lang.String"></constructor-arg>
</bean>
package com.ztt.testSpring;

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

import com.ztt.spring.Person;

public class testPerson {
	public static void main(String[] args){

	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

	Person person1 = ac.getBean("person1", Person.class);
	Person person2 = ac.getBean("person1", Person.class);
	System.out.println("person1:" + person1);
	System.out.println("person2:" + person2);
}
}

運行結果:

person1:com.ztt.spring.Person@2c478134
person2:com.ztt.spring.Person@2c478134

request:請求,在一次請求中創建一個bean

session:會話,在一次會話中創建一個bean

生命週期:

①:通過構造器或者工廠方法創建bean實例

②:爲bean的屬性賦值和對其它bean的引用

③:調用bean的初始化方法

④:bean可以使用了

⑤:當容器關閉時,調用bean的銷燬方法

package com.ztt.spring;

public class Cat {
	private String color;
	private String sex;
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		System.out.println("two:賦值");
		this.color = color;
	}
	public void init(){
		System.out.println("three:初始化");
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "four:使用";
	}
	public void destroy(){
		System.out.println("five:銷燬");
	}
	public Cat(String color, String sex) {
		super();
		this.color = color;
		this.sex = sex;
	}
	public Cat() {
		super();
		System.out.println("one:創建對象");
	}
}

需在配置文件中添加兩個屬性:init-method和destroy-method

<bean id="cat" class="com.ztt.spring.Cat" p:color="white" p:sex="female" init-method="init" destroy-method="destroy"></bean>

測試類:

package com.ztt.spring;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class testCat {
	public static void main(String[] args){
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("catBean.xml");
		Cat cat = (Cat)ac.getBean("cat",Cat.class);
		System.out.println(cat);
		ac.close();
	}
}

運行結果:

one:創建對象
two:賦值
three:初始化
four:使用
five:銷燬

後置處理器:

後置處理器允許在調用初始化方法前後對bean進行額外的處理

bean後置處理器對IOC容器裏的所有bean實例逐一處理,,而非單一實例,其典型應用是:檢查bean屬性的正確性或根據特定的標準更改bean的屬性

bean後置處理器需要實現接口:org.springframework.beans.factory.config.BeanPostProcessor,在初始化方法被調用前後,Spring將把每個bean實例分別傳遞給上述接口的以下兩個方法:

package com.ztt.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class AfterHandler implements BeanPostProcessor{

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		// TODO Auto-generated method stub
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		Car car = (Car) bean;
		if(car.getBrand().equals("Audi")){
			car.setPrice(199999.99);
		}else{
			car.setPrice(0.00);
		}
		return car;
	}
}

上述方法中,根據brand設置price

<!-- 此處無需設置id,因爲無需調用,對spring管理的所有bean都有效-->
<bean class="com.ztt.spring.AfterHandler"></bean>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章