Spring三种创建bean对象的方式/作用范围/生命周期
项目结构
配置文件
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xiaoge</groupId> <artifactId>bean</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> </dependencies> </project>
-
bean.xml**(创建bean对象的方式/作用范围/生命周期)**
<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"> <!-- 把对象的创建交给spring来管理 --> <!-- spring对bean的管理细节 1. 创建bean的三种方式 2. bean对象的作用范围 3. bean对象的生命周期 --> <!-- 创建Bean的三种方式 --> <!-- 第一种方式: 使用默认构造函数创建. 早spring的配置文件中使用bean标签. 配以id和class属性之后. 且没有其他属性和标签时. 采用的就是默认构造函数创建bean对象. 此时如果类中没有默认构造函数. 则对象无法创建. <bean id="accountService" class="com.xiaoge.service.impl.AccountServiceImpl"></bean> --> <!-- 第二种方式: 使用普通工厂中的方法创建对象 (使用某个类中的方法创建对象, 并存入spring容器) <bean id="instanceFactory" class="com.xiaoge.factory.InstanceFactory"></bean> factory-bean: 指定工厂Bean factory-method: 指定工厂方法来获取对象 <bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean> --> <!-- 第三种方式: 使用工厂中的静态方法创建对象 (使用某个类中的静态方法创建对象, 并存入spring容器) <bean id="accountService" class="com.xiaoge.factory.StaticFactory" factory-method="getAccountService"></bean> --> <!-- bean的作用范围调整 bean标签的scope属性: 作用: 用于指定bean的作用范围 取值: 常用的就是单例的和多例的 singleton: 单例的(默认值) prototype: 多例的 request: 作用于web应用的请求范围 session: 作用于web应用的会话范围 global-session: 作用于集群环境的会话范围(全局会话范围), 当不是集群环境时, 它就是session <bean id="accountService" class="com.xiaoge.service.impl.AccountServiceImpl" scope="prototype"></bean> --> <!-- bean对象的生命周期 单例对象 出生: 当容器创建时对象出生 活着: 只要容器还在, 对象一直活着 死亡: 容器销毁, 对象消亡 总结: 单例对象的生命周期和容器相同 多例对象 出生: 当我们使用对象时spring框架为我们创建 活着: 对象只要是在使用过程中就一直活着. 死亡: 当对象长时间不用, 且没有别的对象引用时, 由Java的垃圾回收器回收 --> <bean id="accountService" class="com.xiaoge.service.impl.AccountServiceImpl" scope="prototype" init-method="init" destroy-method="destroy"></bean> </beans>
工厂
-
InstanceFactory
package com.xiaoge.factory; import com.xiaoge.service.AccountService; import com.xiaoge.service.impl.AccountServiceImpl; /** * @Author: 潇哥 * @DateTime: 2020/3/26 下午9:32 * @Description: 模拟一个工厂类(该类可能是存在于jar包中的, 我们无法通过修改源码的方式来提供默认构造函数) */ public class InstanceFactory { public AccountService getAccountService(){ return new AccountServiceImpl(); } }
-
StaticFactory
package com.xiaoge.factory; import com.xiaoge.service.AccountService; import com.xiaoge.service.impl.AccountServiceImpl; /** * @Author: 潇哥 * @DateTime: 2020/3/26 下午9:32 * @Description: 模拟一个工厂类(该类可能是存在于jar包中的, 我们无法通过修改源码的方式来提供默认构造函数) */ public class StaticFactory { public static AccountService getAccountService(){ return new AccountServiceImpl(); } }
业务层接口
-
AccountService
package com.xiaoge.service; /** * @Author: 潇哥 * @DateTime: 2020/3/19 下午7:26 * @Description: 账户业务层接口 */ public interface AccountService { /** * 模拟保存 */ public void saveAccount(); }
业务层实现类
-
AccountServiceImpl
package com.xiaoge.service.impl; import com.xiaoge.service.AccountService; /** * @Author: 潇哥 * @DateTime: 2020/3/19 下午7:28 * @Description: 账户业务层实现类 */ public class AccountServiceImpl implements AccountService { public AccountServiceImpl(){ System.out.println("对象已创建"); } public void saveAccount() { System.out.println("service中的saveAccount方法执行了"); } public void init() { System.out.println("对象初始化..."); } public void destroy() { System.out.println("对象销毁..."); } }
main
-
Client
package com.xiaoge.ui; import com.xiaoge.service.AccountService; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @Author: 潇哥 * @DateTime: 2020/3/19 下午7:35 * @Description: 模拟表现层, 调用业务层 */ public class Client { /** * @param args */ public static void main(String[] args) { // 1. 获取核心容器对象 ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); // 2. 获取对象 AccountService as = (AccountService)applicationContext.getBean("accountService"); // 3. 执行方法 as.saveAccount(); // 4. 手动释放容器 applicationContext.close(); // 运行结果 对象已创建 对象初始化... service中的saveAccount方法执行了 } }