在 Spring(1)之 ioc底层原理中我简单了解sping框架,知道了spring控制反转的底层原理,知道控制反转(ioc)是通过配置文件方式来创建类的,因为有一个bean标签。我们现在就来仔细了解了解这个bean标签。
bean实例化三种方式
- 使用类的无参构造函数创建
//配置文件中
<bean id="user" class=“cn.bubbetg.ioc.User”></bean>
//对象
public class User{
//无参构造函数,默认
........
}
我们试试有参:
//当有参构造函数时
public class User{
private String username;
//有参构造函数
public User(String username){
this.username = username;
}
}
结果报错了(原因是因为写了有参构造函数而没有无参构造函数了):
- 使用静态工厂创建
//使用静态工厂
public class BeanFactory{
//创建静态方法,返回对象
public static Bean getBean(){
return new Bean();
}
}
//xml中配置
<bean id="bean" cass ="cn.bubbetg.bean.BeanFactory" factory-method="getBean"></bean>
- 使用实例工厂创建
// 此方法与静态工厂创建类似,只不过方法不是静态的了
public class BeanFactory{
//创建非静态方法,返回对象
public Bean getBean(){
return new Bean();
}
}
//xml中配置
<bean id="BeanFactory" cass ="cn.bubbetg.bean.BeanFactory" ></bean>
<bean id="bean" factory-bean="BeanFactory" factory-method="getBean"></bean>
可以发现,使用无参构成方法创建比较简单,重点知道。
bean标签中常用属性
通过前面例子我们也大概猜到了一些属性的特点含义了。
id属性
起一个名称,任意命名。不能包含特殊符号。
class属性
创建的对象所在类的全路径
name属性
功能和id一样,id不能包含特色符号,这个可以。
scope属性
有多个属性值:
- singleton
默认值,单例 - prototype
多例 - request
web项目中,Spring创建一个Bean的对象,将对象存入request中 - session
web项目中,Spring创建一个Bean的对象,将对象存入session中 - globalSession
web项目中,应用在Porlet环境中,若没有,相当于session。
在scope属性中讲到单例,多例,那么是单例,什么是多例呢??
看下面代码:
打印结果如下:
我们发现,地址相同,这就是单例模式。
当我们在xml配置文件中修改bean标签的scope属性:
<bean id="user" class=“cn.bubbetg.ioc.User” scope="prototype"></bean>
再看打印结果:
地址变了,也就是有多个实例 。
好了,最后打一波小广告:
我的微信公众号: