spring创建对象的方式
1.空参构造方式
<!-- 创建方式1: 空构造方法 -->
<bean name="user" class="cn.zdfy.domain.User"></bean>
测试代码
ApplicationContext ac=new ClassPathXmlApplicationContext("cn/zdfy/b_create/applicationContext.xml");
User u=(User) ac.getBean("user");
System.out.println(u);
2.静态工厂
UserFactory类
package cn.zdfy.b_create;
import cn.zdfy.domain.User;
public class UserFactory {
public static User createUser(){
System.out.println("静态工厂创建User");
return new User();
}
}
xml配置
<bean name="userByFactory" class="cn.zdfy.b_create.UserFactory" factory-method="createUser"></bean>
测试代码
ApplicationContext ac=new ClassPathXmlApplicationContext("cn/zdfy/b_create/applicationContext.xml");
User u=(User) ac.getBean("userByFactory");
System.out.println("userByFactory--------------"+u);
3.实例工厂
UserFactory类
public User createUser2(){
System.out.println("实例工厂创建User");
return new User();
}
xml配置
<bean name="createUser2" factory-bean="useractory" factory-method="createUser2"></bean>
<bean name="useractory" class="cn.zdfy.b_create.UserFactory" ></bean>
测试代码
ApplicationContext ac=new ClassPathXmlApplicationContext("cn/zdfy/b_create/applicationContext.xml");
User u=(User) ac.getBean("createUser2");
System.out.println("createUser2--------------"+u);
spring的分模块配置
<import resource="/cn/zdfy/b_create/applicationContext.xml"/>
Bean元素
<!-- 将User对象交给spring容器管理 -->
<!-- Bean元素:使用该元素描述需要spring容器管理的对象
class属性:被管理对象的完整类名.
name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象.
可以重复.可以使用特殊字符.
id属性: 与name属性一模一样.
名称不可重复.不能使用特殊字符.
结论: 尽量使用name属性.
-->
<bean name="user" class="cn.zdfy.domain.User"></bean>
Bean元素进阶
scope属性
singleton(默认值):单例对象.被标识为单例的对象在spring容器中只会存在一个实例.【重点】
<bean name="user" class="cn.zdfy.domain.User" scope="singleton"></bean>
测试代码
ApplicationContext ac=new ClassPathXmlApplicationContext("cn/zdfy/b_create/applicationContext.xml"); User u1=(User) ac.getBean("user"); User u2=(User) ac.getBean("user"); User u3=(User) ac.getBean("user"); User u4=(User) ac.getBean("user"); System.out.println("u1=========u4 "+(u1==u4));
结果如下
u1=========u4 true
- prototype:多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的.【重点】
<bean name="user" class="cn.zdfy.domain.User" scope="prototype"></bean>
测试代码和上面一样,结果如下
u1=========u4 false
- request:web环境下.对象与request生命周期一致.
- session:web环境下,对象与session生命周期一致.
生命周期属性
配置一个方法作为生命周期初始化方法.spring会在对象创建之后立即调用. init-method
配置一个方法作为生命周期的销毁方法.spring容器在关闭并销毁所有容器中的对象之前调用. destory-method
即在User类里面加上这两个方法
package cn.zdfy.domain;
public class User {
private String name;
private Integer age;
public User() {
System.out.println("Spring空参---------------");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
public void init(){
System.out.println("User--------------init");
}
public void destroy(){
System.out.println("User-------------destroy");
}
}