文章目录
- Spring配置文件详解
- Bean标签基本配置
- Bean标签范围配置scope
- 配置测试(scope="singleton")
- 编写spring.xml
- 创建测试包
- 创建SpringTest类
- 引入junit依赖
- 编写SpringTest
- 测试运行test1()
- 配置测试(scope="prototype")
- 编写spring.xml
- 测试运行
- Spring配置详解2
- Bean的创建时机
- 再次变更scope="singleton"
- 编写UserDaoImpl
- 测试运行
- 再次变更scope="prototype"
- 测试运行
- 结论
- singleton
- prototype
- Spring配置文件详解3
- Bean的声明周期配置
- 测试案例
- 编写UserDaoImpl.java
- 编写spring.xml
- 编写SpringTest
- 测试运行
- 更改测试方法,执行销毁
- 测试运行
- Spring配置文件详解4
- Bean实例化三种方式
- 测试案例(工厂静态方法)
- 编写StaticFactory类
- 编写spring.xml
- 测试运行
- 测试案例(工厂实例方法)
- 编写spring.xml
- 测试运行
- 总结
Spring配置文件详解
Bean标签基本配置
用于配置对象交由Spring来创建
默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功
基本属性:
- id:Bean实例在Spring容器中的唯一标识
- class:Bean的全限定名称
Bean标签范围配置scope
指对象的作用范围,取值如下
配置测试(scope=“singleton”)
编写spring.xml
resources->applicationContext.xml
设置scope属性为singleton
<bean id="userDao" class="com.taotao.dao.impl.UserDaoImpl" scope="singleton">
创建测试包
src包下创建text包->创建java包与resources包
创建SpringTest类
com.taotao.test.SpringTest
引入junit依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
编写SpringTest
package com.taotao.test;
import com.taotao.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* create by 刘鸿涛
* 2022/4/4 21:42
*/
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
UserDao userDao2 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
System.out.println(userDao2);
}
}
测试运行test1()
一个Bean对象
配置测试(scope=“prototype”)
编写spring.xml
<bean id="userDao" class="com.taotao.dao.impl.UserDaoImpl" scope="prototype">
测试运行
两个Bean对象
Spring配置详解2
Bean的创建时机
再次变更scope=“singleton”
<bean id="userDao" class="com.taotao.dao.impl.UserDaoImpl" scope="singleton">
编写UserDaoImpl
com.taotao.dao.UserDao
package com.taotao.dao.impl;
import com.taotao.dao.UserDao;
/**
* create by 刘鸿涛
* 2022/4/3 22:36
*/
public class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("UserDaoImpl创建.....");
}
public void save() {
System.out.println("save running...");
}
}
测试运行
SpringTest.java
加载配置文件时,创建Bean
再次变更scope=“prototype”
<bean id="userDao" class="com.taotao.dao.impl.UserDaoImpl" scope="prototype">
测试运行
每次getBean时,创建Bean对象
结论
singleton
当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
- 对象创建:当应用加载,创建容器时,对象就被创建了
- 对象运行:只要容器在,对象一直活着
- 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
prototype
当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
- 对象创建:当使用对象时,创建新的对象实例
- 对象运行:只要对象在使用中,就一直活着
- 对象销毁:当对象长时间不用时,被Java的垃圾回收器回收了
Spring配置文件详解3
Bean的声明周期配置
- init-method:指定类种中的初始化方法名称
- destroy-method:指定类中销毁方法名称
测试案例
编写UserDaoImpl.java
package com.taotao.dao.impl;
import com.taotao.dao.UserDao;
/**
* create by 刘鸿涛
* 2022/4/3 22:36
*/
public class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("UserDaoImpl创建.....");
}
public void init(){
System.out.println("初始化方法....");
}
public void destory(){
System.out.println("销毁方法....");
}
public void save() {
System.out.println("save running...");
}
}
编写spring.xml
指定初始化方法、指定销毁时方法
<bean id="userDao" class="com.taotao.dao.impl.UserDaoImpl" init-method="init" destroy-method="destory" >
编写SpringTest
package com.taotao.test;
import com.taotao.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* create by 刘鸿涛
* 2022/4/4 21:42
*/
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
}
}
测试运行
销毁方法还未调用,Bean就被销毁了
更改测试方法,执行销毁
package com.taotao.test;
import com.taotao.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* create by 刘鸿涛
* 2022/4/4 21:42
*/
@SuppressWarnings({"all"})
public class SpringTest {
@Test
//测试scope属性
public void test1(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
System.out.println(userDao1);
//声明手动关闭
((ClassPathXmlApplicationContext) app).close();
}
}
测试运行
Spring配置文件详解4
Bean实例化三种方式
- 无参构造方法实例化
- 工厂静态方法实例化
- 工厂实例方法实例化
测试案例(工厂静态方法)
编写StaticFactory类
package com.taotao.factory;
import com.taotao.dao.UserDao;
import com.taotao.dao.impl.UserDaoImpl;
/**
* create by 刘鸿涛
* 2022/4/4 22:39
*/
public class StaticFactory {
public static UserDao getUserDao(){
return new UserDaoImpl();
}
}
编写spring.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="userDao" class="com.taotao.dao.impl.UserDaoImpl" ></bean>-->
<bean id="userDao" class="com.taotao.factory.StaticFactory" factory-method="getUserDao"></bean>
</beans>
测试运行
测试案例(工厂实例方法)
编写DynamicFactory类
package com.taotao.factory;
import com.taotao.dao.UserDao;
import com.taotao.dao.impl.UserDaoImpl;
/**
* create by 刘鸿涛
* 2022/4/4 22:45
*/
public class DynamicFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
编写spring.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="userDao" class="com.taotao.dao.impl.UserDaoImpl" ></bean>-->
<!-- <bean id="userDao" class="com.taotao.factory.StaticFactory" factory-method="getUserDao"></bean>-->
<bean id="factory" class="com.taotao.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>
</beans>
测试运行
总结
- 只需要记住无参构造方法实例化
- 工厂静态与工厂实例都不常用