bean的创建方式
bean有三种创建方式
默认的构造函数创建
默认的创建方式在上一章里面也试过,为了方便复习。我就再搬运一份吧
<bean name="userDao" class="com.caesar.spring.study.dao.impl.UserDaoImpl" />
可以参考官方文档
通过工厂方法创建
首先创建一个工厂:
package com.caesar.spring.study.factory;
import com.caesar.spring.study.dao.UserDao;
import com.caesar.spring.study.dao.impl.UserDaoImpl;
/**
* @ClassName BeanFactory
* @Author Caesar
* @Date 2019/12/21 13:26
* @Description
*/
public class BeanFactory {
/**
* 功能描述 定义一个创建UserDao的工厂方法
* @author Caesar
* @date 2019/12/21
* @param
* @return com.caesar.spring.study.dao.UserDao
*/
public UserDao getInstance() {
return new UserDaoImpl();
}
}
xml配置
<!-- 使用工厂方法创建bean对象 -->
<beanname="factory" class="com.caesar.spring.study.factory.BeanFactory" />
<bean name="dao" factory-bean="factory" factory-method="getInstance" />
通过静态工厂方法创建
package com.caesar.spring.study.factory;
import com.caesar.spring.study.dao.UserDao;
import com.caesar.spring.study.dao.impl.UserDaoImpl;
/**
* @ClassName BeanFactory
* @Author Caesar
* @Date 2019/12/21 13:26
* @Description
*/
public class BeanFactory {
/**
* 功能描述 定义一个创建UserDao的工厂方法
* @author Caesar
* @date 2019/12/21
* @param
* @return com.caesar.spring.study.dao.UserDao
*/
public UserDao getInstance() {
return new UserDaoImpl();
}
/**
* 功能描述 定义创建UserDao的静态工厂方法
* @author Caesar
* @date 2019/12/21
* @param
* @return com.caesar.spring.study.dao.UserDao
*/
public static UserDao getUserDaoInstance() {
return new UserDaoImpl();
}
}
xml配置
<bean name="dao2" class="com.caesar.spring.study.factory.BeanFactory" factory-method="getUserDaoInstance" />
最后测试一下咯:
package com.caesar.spring.study.test;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @ClassName CreateBeanTest
* @Author Caesar
* @Date 2019/12/21 13:36
* @Description
*/
public class CreateBeanTest {
private ClassPathXmlApplicationContext ctx;
@Before
public void init() {
ctx = new ClassPathXmlApplicationContext("/applicationContext-bean.xml");
}
@Test
public void runTest() {
System.out.println(ctx.getBean("userDao"));
System.out.println(ctx.getBean("dao"));
System.out.println(ctx.getBean("dao2"));
}
@After
public void closeCtx() {
ctx.close();
}
}
// 看结果
/*
userDaoImpl 被实例化
userDaoImpl 被实例化
userDaoImpl 被实例化
com.caesar.spring.study.dao.impl.UserDaoImpl@38bc8ab5
com.caesar.spring.study.dao.impl.UserDaoImpl@687080dc
com.caesar.spring.study.dao.impl.UserDaoImpl@23d2a7e8
*/
静态工厂方法的创建是class,不是factory-bean,自己踩着坑了。复制粘贴了一下然后没有改
bean的作用域
默认的作用域是单例作用域。可以修改
<bean name="userDao" class="com.caesar.spring.study.dao.impl.UserDaoImpl" scope="singleton" /> <!-- 单例(spring容器中默认的创建对象方式 ) -->
<bean name="userDao" class="com.caesar.spring.study.dao.impl.UserDaoImpl" scope="prototype" /> <!-- 多例 -->
Bean的延迟初始化
prototype
是默认延迟初始化
设置singleton
的延迟初始化
<bean name="userDao" class="com.caesar.spring.study.dao.impl.UserDaoImpl" scope="singleton" lazy-init="true" />
设置全部延迟初始化
<?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"
default-lazy-init="true">
<bean name="userDao" class="com.caesar.spring.study.dao.impl.UserDaoImpl" scope="singleton" />
<bean name="userDao" class="com.caesar.spring.study.dao.impl.UserDaoImpl" scope="prototype" />
</beans>