id和name
般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称
id属性在ioc容器中必须是唯一的
如果Bean的名称中含有特殊字符,就需要使用name属性
class
class用于设置一个类的完全路径名称,主要作用是ioc容器生成类的实例
创建的类是单例还是多例通过scope属性来确定
![](https://img.haomeiwen.com/i12257488/5dad7fee1c55fe7d.png)
代码实现,首先先建立一个类(我的是Person类),之后配置bean。
<bean id="person" class="com.jiaoshou.ioc.demo3.Person"/>
默认的为singleton
开始测试代码如下
public void demo3() {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Person person1=(Person)applicationContext.getBean("person");
Person person2=(Person)applicationContext.getBean("person"); System.out.println(person1);
System.out.println(person2);
}
我们需要打印一下这两个类的地址值是否相同,进人判断是单例模式还是多例模式
打印结果
![](https://img.haomeiwen.com/i12257488/99d7dfc5f39bc449.png)
修改配置信息
<bean id="person" class="com.jiaoshou.ioc.demo3.Person" scope="prototype"/>
修改为多例模式
打印结果
![](https://img.haomeiwen.com/i12257488/533ff6a177dbe6d5.png)
Bean的生命周期
Spring初始化bean或销毁bean时,有时需要做一-些处理工作,因此spring可以在创建和销毁bean的时候调用bean的两个生命周期方法。
<bean id="xxx" class="xxx" init-method="init" destory-method="destroy"/>
init-method里面的值是被初始化的时候要执行的方法
destory-method里面的值是对象被销毁时执行的方法
注意:初始化方法和销毁方法,要求scope="singleton"单例模式,因为非单利模式不知道什么时候才要执行初始化方法或者销毁方法
![](https://img.haomeiwen.com/i12257488/2c7b642ddb2c1eb0.png)
11个过程
1. instantiate bean对象实例化(当被实例化的时候执行)
2. populate properties封装属性(设置属性)
<property name="name" value="叫兽"/>
3.如果Bean实现BeanNameAware执行setBeanName
先实现BeanNameAware接口,下面是方法
public void setBeanName(String s) {
System.out.println("第三步:设置Bean的名称"+name);
}
4.如果Bean实现BeanFactoryAware或者ApplicationContextAware设置工厂setBeanFactory或者上下文对象setApplicationContext
继承ApplicationContextAware接口
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("第四部:了解工厂信息");
}
5.如果存在类实现BeanPostProcessor (后处理Bean) , 执行postProcessBeforeInitialization
在配置的时候只需要class,因为在生成实例化的时候自动调用,不需要在其它地方调用
<bean class="com.jiaoshou.ioc.demo3.MyBeanPostProcessor"/>
public class MyBeanPostProcessor implements BeanPostProcessor {
//初始化前的方法
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("第五步:初始化前方法");
return o;
}
}
6.如果Bean实现InitializingBean执行afterPropertiesSet
实现InitializingBean接口
public void afterPropertiesSet() throws Exception {
System.out.println("第六步:属性设置后");
}
7.调用<bean init-method="xxx">指定初始化方法xxx
8.如果存在类实现BeanPostProcessor (处理Bean) , 执行postProcessAfterInitialization
<bean class="com.jiaoshou.ioc.demo3.MyBeanPostProcessor"/>
public class MyBeanPostProcessor implements BeanPostProcessor {
//初始化后的方法
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("第八步:初始化后方法");
return o;
}
}
9.执行业务处理
10.如果Bean实现DisposableBean执行destroy
实现DisposableBean接口
public void destroy() throws Exception {
System.out.println("第十步:执行Spring的销毁方法");
}
11.调用<bean destroy-method="xxx">指定销毁方法xxx
网友评论