一.实例化的三种方式
1.使用无参构造方法实例化(最常用)
xml配置
<bean id="userDao" class="dao.impl.UserDaoImpl"/>
id为要实例化的对象它是Bean实例在Spring容器中的唯一标识
class 是要实例化的类的全类名
它会根据默认无参构造方法来创建类对象
如果bean中没有默认无参构造函数,将会创建失败
测试类
public void test() {
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
USerDao userDao = (USerDao) app.getBean("userDao");
userDao.save(); //通过得到的对象调用方法
}
2.工厂静态方法实例化
public class StaticFactoryBean {
public static UserDao createUserDao(){
return new UserDaoImpl();
}
}
静态方法可以直接使用类名进行调用,所以StaticFactoryBean类不需要进行实例化
xml 配置
class静态工厂的全类名,factory-method静态工厂的方法
<bean id="userDao" class="factory.StaticFactoryBean"
factory-method="createUserDao" />
3.工厂实例方法实例化
public class DynamicFactoryBean {
public UserDao createUserDao(){
return new UserDaoImpl();
}
}
该类中的方法为非静态,所以必须先实例化类才能调用方法
xml配置
<bean id="factoryBean" class="factory.DynamicFactoryBean"/>
factory-bean工厂的实例化对象,factory-method实例工厂的方法
<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>
二.scope标签及对比
取值 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | Spring创建一个Bean的对象,并将对象存入到request域中 |
session | Spring创建一个Bean的对象,并将对象存入到session域中 |
global session | 应用在Portlet环境,如果没有Portlet环境那么globalSession就相当于session |
常用的两种取值对比
1)当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着,存在于容器中
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
2)当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着,存在于内存中
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了