一、通过无参的构造方法来创建对象
- 编写实体类
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",这个时候也会被创建),并且获取一次创建一次。
|
483

被折叠的 条评论
为什么被折叠?



