Spring创建Bean的三种方式及Bean的生命周期
Spring创建Bean的三种方式及Bean的生命周期
Spring创建Bean的三种方式
第一种方式:使用默认构造函数创建
在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。
Spring配置文件
<bean id="accountServiceOne" class="com.zjw.service.impl.AccountServiceOneImpl" />
Java类
package com.zjw.service.impl;
import com.zjw.service.IAccountServiceOne;
/**
* 账户的业务层实现类
* 对象创建的三种方式一:通过构造方法创建对象
*/
public class AccountServiceOneImpl implements IAccountServiceOne {
public AccountServiceOneImpl() {
System.out.println("AccountServiceOneImpl……我创建了。。");
}
@Override
public void saveAccount() {
System.out.println("AccountServiceOneImpl中的saveAccount方法执行了");
}
}
测试
/**
* 模拟一个表现层,用于调用业务层
*/
public class Client {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//对象创建的三种方式一:通过构造方法创建对象
IAccountServiceOne accountServiceOne = (IAccountServiceOne) ac.getBean("accountServiceOne");
System.out.println(accountServiceOne);
accountServiceOne.saveAccount();
System.out.println("main 方法结束了。。。。");
}
}
结果
AccountServiceOneImpl……我创建了。。。
com.zjw.service.impl.AccountServiceOneImpl@258e2e41
AccountServiceOneImpl中的saveAccount方法执行了
main 方法结束了。。。。
第二种方式:使用普通工厂中的方法创建对象
使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
Spring配置
<!--第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)-->
<bean id="instanceFactory" class="com.zjw.factory.InstanceFactory"/>
<bean id="accountServiceTwo" factory-bean="instanceFactory" factory-method="getAccountService" />
工厂类
/**
* @author zjw
*/
public class InstanceFactory {
public IAccountServiceTwo getAccountService(){
return new AccountServiceTwoImpl();
}
}
Java类
/**
* 账户的业务层实现类
* 第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
*/
public class AccountServiceTwoImpl implements IAccountServiceTwo {
public AccountServiceTwoImpl() {
System.out.println("AccountServiceTwoImpl……我创建了。。");
}
@Override
public void saveAccount() {
System.out.println("AccountServiceTwoImpl中的saveAccount方法执行了");
}
}
测试
/**
* 模拟一个表现层,用于调用业务层
*/
public class Client {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//第二种方式:使用普通工厂中的方法创建对象
IAccountServiceTwo accountServiceTwo = ac.getBean("accountServiceTwo", IAccountServiceTwo.class);
System.out.println(accountServiceTwo);
accountServiceTwo.saveAccount();
System.out.println("main 方法结束了。。。。");
}
}
结果
AccountServiceTwoImpl……我创建了。。
com.zjw.service.impl.AccountServiceTwoImpl@258e2e41
AccountServiceTwoImpl中的saveAccount方法执行了
main 方法结束了。。。。
第三种方式:使用工厂中的静态方法创建对象
Spring配置
<!--第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring)-->
<bean id="accountServiceThree" class="com.zjw.factory.StaticFactory" factory-method="getAccountService" />
工厂类
public class StaticFactory {
public static IAccountServiceThree getAccountService(){
return new AccountServiceThreeImpl();
}
}
Java类
/**
* 账户的业务层实现类
* 第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring)
*/
public class AccountServiceThreeImpl implements IAccountServiceThree {
public AccountServiceThreeImpl() {
System.out.println("AccountServiceThreeImpl……我创建了。。");
}
@Override
public void saveAccount() {
System.out.println("AccountServiceThreeImpl中的saveAccount方法执行了");
}
}
测试
/**
* 模拟一个表现层,用于调用业务层
*/
public class Client {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//第二种方式:使用工厂中的静态方法创建对象
IAccountServiceThree accountServiceThree= ac.getBean("accountServiceThree", IAccountServiceThree.class);
System.out.println(accountServiceThree);
accountServiceThree.saveAccount();
System.out.println("main 方法结束了。。。。");
}
}
结果
AccountServiceThreeImpl……我创建了。。
com.zjw.service.impl.AccountServiceThreeImpl@258e2e41
AccountServiceThreeImpl中的saveAccount方法执行了
main 方法结束了。。。。
Bean的生命周期
- 单例对象
出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象给你消亡
总结:单例对象的生命周期和容器相同
- 多例对象
出生:当我们使用对象时spring框架为我们创建
活着:对象只要是在使用过程中就一直活着
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收
Spring配置
<!--
init-method:对象创建后执行的方法
destroy-method:对象销毁时执行的方法
单例对象,容器关闭后执行
多例模式,java虚拟机决定
scope:单例还是多例对象
singleton:默认,单例
prototype:多例
-->
<bean id="accountService" class="com.zjw.service.impl.AccountServiceImpl"
init-method="init" destroy-method="destroy" />
Java类
/**
* 账户的业务层实现类
*/
public class AccountServiceImpl implements IAccountService {
public AccountServiceImpl() {
System.out.println("AccountServiceImpl……我创建了。。");
}
@Override
public void saveAccount() {
System.out.println("AccountServiceImpl……saveAccount方法执行了");
}
public void init(){
System.out.println("AccountServiceImpl……init方法执行了。。");
}
public void destroy(){
System.out.println("AccountServiceImpl……destroy方法执行了。。");
}
}
测试
/**
* 模拟一个表现层,用于调用业务层
*/
public class Client {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//Bean的生命周期
IAccountService accountService = (IAccountService) ac.getBean("accountService");
System.out.println(accountService);
accountService.saveAccount();
System.out.println(ac.isSingleton("accountService"));
ac.close();
System.out.println(accountService);
System.out.println("main 方法结束了。。。。");
}
}
结果
AccountServiceImpl……我创建了。。
AccountServiceImpl……init方法执行了。。
com.zjw.service.impl.AccountServiceImpl@add0edd
AccountServiceImpl……saveAccount方法执行了
true
AccountServiceImpl……destroy方法执行了。。
com.zjw.service.impl.AccountServiceImpl@add0edd
main 方法结束了。。。。
Spring创建Bean的三种方式及Bean的生命周期的更多相关文章
- Spring实例化Bean的三种方式及Bean的类型
1.使用类构造器实例化 [默认的类构造器] <bean id=“orderService" class="cn.itcast.OrderServiceBean"/ ...
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- Spring学习之实例化bean的三种方式
实例化bean的三种方式 构造器实例化bean Person.java public class Person { private String name; private Integer age; ...
- Spring创建JobDetail的两种方式
一.Spring创建JobDetail的两种方式 二.整合方式一示例步骤 1.将spring核心jar包.quartz.jar和Spring-context-support.jar导入类路径. 2.编 ...
- Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...
- spring生成EntityManagerFactory的三种方式
spring生成EntityManagerFactory的三种方式 1.LocalEntityManagerFactoryBean只是简单环境中使用.它使用JPA PersistenceProvide ...
- Spring 使用AspectJ的三种方式
Spring 使用AspectJ 的三种方式 一,使用JavaConfig 二,使用注解隐式配置 三,使用XML 配置 背景知识: 注意 使用AspectJ 的 时候 要导入相应的Jar 包 嗯 昨天 ...
- Spring静态注入的三种方式
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen1403876161/article/details/53644024Spring静态注入的三 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- js学习-DOM之动态创建元素的三种方式、插入元素、onkeydown与onkeyup两个事件整理
动态创建元素的三种方式: 第一种: Document.write(); <body> <input type="button" id="btn" ...
随机推荐
- mac安装gcc7
查看gcc版本 gcc --version 1.安装gcc brew install gcc@7 cd /usr/local/Cellar 改名mv gcc\@7/ gcc 2.打开mac的SIP ...
- DeepSeek实战:3分钟学会提取网页纯文本!(含提示词)
DeepSeek实战:3分钟学会提取网页纯文本!(含提示词) | 原创作者/编辑:凯哥Java | 分类:人工智能学习系列教程 大家好,我是凯哥Java. ...
- WPF程序性能优化总结
原文链接: https://blog.csdn.net/u010265681/article/details/77571947 WPF程序性能由很多因素造成,以下是简单地总结: 元素: 1. 减少需要 ...
- Python构建包、上传包详细步骤
1.从git上拉取最新的代码 2.在当前项目目录中创建setup.py文件 setup.py 1 # coding: utf-8 2 3 """打包 4 " ...
- rgba颜色转换为十六进制
RGBA颜色转HEX 转换步骤: 先将r.g.b分别转换为十六进制,比如 r.g.b分别为 255,则转换后得到的为 FF.FF.FF 将a 乘以 255,然后获得的积的整数部分转换为十六进制,如 a ...
- C#短链接生成方法
public class Program { static void Main() { Random rd = new Random(); for (int i = 0; i < 10; i++ ...
- go json omitempty 关键字 脱坑
用法 大家对于 json 和 struct 之间的转换一定不陌生,为了将代码中的结构体与 json 数据解耦,通常我们会在结构体的 field 类型后加上解释说明,例如在表示一个地址的时候, json ...
- Docker之一简介
什么是Docker Docker是Google使用go语言进行开发的,对进程进行封装隔离,始于操作系统层面的虚拟化技术. 因为隔离的进程独立于宿主机和其它的隔离进程,因此成为容器 Docker在容器的 ...
- Linux权限与特殊权限
目录 5.1 权限讲解 5.1.1 什么是权限 5.1.2 为什么要管理权限 5.1.3 权限的分类 5.1.4 Linux的文件属于谁? 5.1.5 文件属主.属组.其他用户 5.1.6 所属者的表 ...
- 算法图解,关于数组,链表,以及大O表示法
有关数组.链表以及大O表示法 关于数组 [1] 连续性:数组在内存中连续储存,就像是看电影的一群人排排坐. [2] 易读性:数组中的元素可以随意读取. [3] 难改性:由于连续的特性,增减元素都会导致 ...