学习之前,娱乐一下下了
Bean的作用域
Bean的作用域分为单实例和多实例
单实例:因为在开发当中每个请求都会创建一个对象,这样会极大的消耗cpu和内存,单实例的存在可以减少这种情况的发生
多实例:因为在一个请求改变对象的状态时,可能下一个请求再次请求时可能导致处理产生错误问题
而单实例和多实例的使用标准就是:对象是否含有改变的状态时,就是说在实际应用当中状态是否会发生变化。
创建一个基础类,如果创建数组不懂可以到我主页去了解Spring系列的内容
代码展示:
public class demo1 {
private String[] aa; //因为数组最后可以展示单实例和多实例的区别,这里以数组为例
public void setAa(String[] aa) {
this.aa = aa;
}
public void play(){
System.out.println(aa); //最后通过测试类去展示单实例和多实例的区别
}
}
配置xml文件
单实例:配置文件代码:
注意:在创建bean时默认的都是单实例,可以设置单实例:在bean标签加入scope属性;
属性值有:singleton,prototype,request,session,global session最长用的只用前两种
singleton:表示单实例,默认的都是单实例
protorype:表示多实例
单实例代码:
<bean id="d1" class="new_study.java_file.region.demo1" >
<property name="aa" value="作用"></property>
</bean>
多实例代码:
<bean id="d1" class="new_study.java_file.region.demo1" scope="prototype">
<property name="aa" value="作用"></property>
</bean>
创建一个测试类去实现注入属性的输出:
测试类代码:
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
@Test
public void show(){
ApplicationContext context = new ClassPathXmlApplicationContext("new_study/java_file/region/bean.xml");
demo1 demo1 = context.getBean("d1",demo1.class);
demo1 demo2 = context.getBean("d1",demo1.class);
demo1.play();
demo2.play();
}
}
单实例输出结果:
最后的用黄色标记的为HashCode值,而HashCode值表示的是对象的物理地址,这里可以看出单实例创建的两个类最后的显示的HashCode值一样,说明两次对象的创建都是占用一个物理地址。
多实例输出结果:
绿色荧光标记的hashcode值不相同,说明demo1 和demo2两个对象的创建都是各自占用一个物理地址,这就是多实例。
Bean的生命周期
生命周期:是指从对象创建到对象销毁的过程共分为七步
第一步:创建bean实例,创建无参数构造
第二步:为bean实例中的属性注入值,通过调用set方法
第三步:把bean实例传递给后置处理器postProcessBeforeInitialization
第四步:调用配置文件中配置的初始化方法
第五步:再次把bean实例传递给后置处理器postProcessAfterInitialization
第六步:获取创建bean实例对象
第七步:执行销毁的方法
代码展示:
bean实例类:
public class demo1 {
public demo1() {
System.out.println("bean生命周期的第一步");
}
private String testsx;
public void setTestsx(String testsx) {
this.testsx = testsx;
System.out.println("bean生命周期的第二步");
}
public void initMethod(){
System.out.println("bean周期的第三步");
}
public void destoryMethod(){
System.out.println("bean周期的第五步");
}
}
创建后置处理器类:实现第三步和第五步
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;
public class beanpost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之前的步骤:第三步");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之后的步骤:第五步");
return bean;
}
}
创建配置文件进行内容的配置:
<bean id="d1" class="new_study.java_file.lifeterm.demo1" init-method="initMethod" destroy-method="destoryMethod">
<!--init-method:初始化方法,调用bean实例中的创建的方法 destroy-method:执行销毁的方法调用bean实例销毁方法-->
<property name="testsx" value="利益风"></property>
</bean>
<bean id="post" class="new_study.java_file.lifeterm.beanpost"></bean> <!--创建后置对象处理器对象,使得第三步和第五步展现出来-->
创建测试类:测试生命周期的执行步骤
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class testdemo {
@Test
public void play(){
ApplicationContext context = new ClassPathXmlApplicationContext("new_study/java_file/lifeterm/bean.xml");
demo1 demo1 = context.getBean("d1",demo1.class);
System.out.println("bean生命周期的第四步");
System.out.println(demo1);
//手动创建执行对象销毁
((ClassPathXmlApplicationContext)context).close();
}
}
注意:ClassPathXmlApplicationContext是 ApplicationContext的子接口,在 ApplicationContext并没有close方法需要调用子接口ClassPathXmlApplicationContext中存在的close方法
这可以这样码:输出的结果并没有什么区别
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("new_study/java_file/lifeterm/bean.xml");
context.close();
输出结果:
后续会持续更新学习spring的心得笔记