一、通过无参的构造方法来创建对象
- 编写实体类
public
class
User {
public
User() {
System.
out
.println(
"user的无参构造方法"
);
}
private
String
name
;
public void setName(String name) {
this.name = name;
}
public
void
show() {
System.
out
.println(
"name="
+
name
);
}
}
- 编写beans.xml配置文件
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
>
<!-- scope属性默认是单例的可以不用写 -->
<
bean
id
=
"user"
class
=
"com.liujie.model.User"
scope="singleton"
>
<
property
name
=
"name"
value
=
"张三"
></
property
>
</
bean
>
</
beans
>
spring中bean的作用域(scope属性),有如下5种类型:
在多数情况,我们只会使用
singleton和
prototype两种scope,如果在spring配置文件内未指定scope属性,
默认为singleton。
|
- 测试
public
class
Test {
public
static
void
main(String[]
args
) {
// 解析beans.xml文件,生成管理相应的bean对象
ApplicationContext
context
=
new
ClassPathXmlApplicationContext(
"beans.xml"
);
// BeanFactory context = new ClassPathXmlApplicationContext("beans.xml");
User
user
= (User)
context
.getBean(
"user"
);
user
.show();
//用来检测spring创建user对象时是否使用的是单例模式(通过构造方法是否被调用多次来检测的)
context
.getBean(
"user"
);
context
.getBean(
"user"
);
}
}
二、通过有参构造方法来创建对象
- 编写实体类
public
class
User {
private
String
name
;
public User(String name) {
super();
this.name = name;
}
public
void
show() {
System.
out
.println(
"name="
+
name
);
}
}
- 编写beans.xml配置文件
第一种:根据参数的下标来设置
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
>
<
bean
id
=
"user"
class
=
"com.liujie.model.User"
>
<!-- index指构造方法参数,下标从0开始 -->
<
constructor-arg
index="0"
value
=
"李四"
></
constructor-arg
>
</
bean
>
</
beans
>
第二种:根据参数名称来设置
<
bean
id
=
"user"
class
=
"com.liujie.model.User"
>
<!-- name指参数名 -->
<
constructor-arg
name="name"
value
=
"李四"
></
constructor-arg
>
</
bean
>
第三种:根据参数类型来设置
<
bean
id
=
"user"
class
=
"com.liujie.model.User"
>
<
constructor-arg
type="java.lang.String"
value
=
"李四"
></
constructor-arg
>
</
bean
>
- 测试
public
class
Test {
public
static
void
main(String[]
args
) {
ApplicationContext
context
=
new
ClassPathXmlApplicationContext(
"beans.xml"
);
User
user
= (User)
context
.getBean(
"user"
);
user
.show();
}
}
三、通过工厂方法来创建对象
静态工厂:
- 编写实体类
public
class
User {
private
String
name
;
public
User(String
name
) {
super
();
this
.
name
=
name
;
System.
out
.println(
"user有参构造方法"
);
}
public
void
show() {
System.
out
.println(
"name="
+
name
);
}
}
- 编写工厂类
public
class
UserFactory {
public static
User newInstance(String
name
) {
return
new
User(
name
);
}
}
- 编写beans.xml配置文件
<
bean
id
=
"user"
class
=
"com.liujie.factory.UserFactory"
factory-method
=
"newInstance"
>
<
constructor-arg
index
=
"0"
value
=
"王五"
></
constructor-arg
>
</
bean
>
- 测试
public
class
Test {
public
static
void
main(String[]
args
) {
ApplicationContext
context
=
new
ClassPathXmlApplicationContext(
"beans.xml"
);
User
user
= (User)
context
.getBean(
"user"
);
user
.show();
context
.getBean(
"user"
);
context
.getBean(
"user"
);
}
}
动态工厂:
- 编写工厂类
public
class
UserDynamicFactory {
public
User newInstance(String
name
) {
return
new
User(
name
);
}
}
- 编写beans.xml配置文件
<
bean
id
=
"userFactory"
class
=
"com.liujie.factory.UserDynamicFactory"
></
bean
>
<
bean
id
=
"user"
factory-bean
=
"userFactory"
factory-method
=
"newInstance"
>
<
constructor-arg
index
=
"0"
value
=
"王五"
></
constructor-arg
>
</
bean
>
不管是动态工厂还是静态工厂,user对象还是受
<
bean
id
=
"user"
factory-bean
=
"userFactory"
factory-method
=
"newInstance"
scope="prototype"
>
中的scope参数的影响。
|
bean创建对象的方式 |
如果bean对象的
scope="singleton"(默认),bean对象是
直接创建的,通过
applicationContext.getBean获取对象时,永远都
不会创建新的对象;
如果bean对象的
scope="prototype",bean对象
不会直接创建,编写bean以后一定要通过
applicationContext.getBean获取对象
时,才会是创建对象(如果有被引用的bean且scope="prototype",这个时候也会被创建),并且
获取一次创建一次。
|