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>