目录
Spring 工厂创建对象的模式
单例:工厂默认在创建对象时都是使用单例方式,单例方式无论在工厂获取多少次,始终获取的是同一个对象
- 默认 Spring 在管理组件对象是 单例创建(singleton)
例如:service、dao - 如何修改工厂创建组件对象为多例
struts2 中 action 必须以多例形式管理,否则避免数据共同使用
<!--
单例/多例
scope:
singleton 单例模式
prototype 多例模式
-->
<bean id="userService" class="com.grocery.service.UserService" scope="singleton" />
Spring 工厂创建对象的原理
原理:反射 + 构造方法
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// 启动容器
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
// 获取容器中对象
UserService userService = (UserService) context.getBean("userService");
System.out.println(userService);
// 利用反射获取Bean(工厂原理)
UserService userService1 = (UserService) Class.forName("com.grocery.service.UserService").newInstance();
System.out.println(userService1);
}
Spring 工厂管理组件声明周期
1、组件对象什么时候创建
工厂启动,工厂中所有单例对象随之创建
工厂使用(获取),创建多例对象
2、组件对象什么时候销毁
工厂关闭,工厂中所有单例对象随之销毁
工厂不负责多例对象销毁,由虚拟机GC销毁
import com.grocery.dao.UserDao;
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getName(String userName){
System.out.println("userService:" + userName);
userDao.getName(userName);
}
public void init(){
System.out.println("组件对象初始化");
}
public void destory(){
System.out.println("组件对象销毁");
}
}
<bean id="userDao" class="com.grocery.dao.UserDao" />
<!--
声明周期
init-method 在对象初始化时调用方法
destroy-method 在对象销毁时调用方法
-->
<bean id="userService" class="com.grocery.service.UserService" autowire="byName" scope="singleton" init-method="init" destroy-method="destory"/>
Spring 工厂好处
- 解耦合 使用配置文件管理 Java 类,在生产环境中更换 Java 类的实现时不需要重新部署,修改文件即可
- 减少 JVM 内存占用 Spring 默认使用单例的模式创建 Bean,减少内存占用
- 通过依赖注入方式建立组件,使组件与组件的关系更加清晰,方便维护管理
- 打造轻量级的 JAVAEE 管理