[Spring5]IOC容器_Bean管理_bean的作用域和bean的生命周期

IOC操作Bean管理(bean作用域)

1.在Spring里面,设置创建bean实例是单实例还是多实例

2.在Spring里面,默认情况下,bean是单实例对象

package com.atguigu.spring.test;import com.atguigu.spring.collectiontype.Book;
import com.atguigu.spring.collectiontype.Course;
import com.atguigu.spring.factoryBean.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class testBook {@Testpublic void testCollection(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");Book book1 = context.getBean("book", Book.class);Book book2 = context.getBean("book",Book.class);System.out.println(book1);System.out.println(book2);//        com.atguigu.spring.collectiontype.Book@6aaceffd
//        com.atguigu.spring.collectiontype.Book@6aaceffd}
}

3.如何设置单实例还是多实例

(1)在spring配置文件bean标签里面有属性用于设置单实例还是多实例

(2)scope属性值

第一个值 默认值,singleton,表示是单实例对象

第二个值 prototype,表示是多实例对象

了解的两个值:

request:每次创建对象,会把对象放在Request域中

session:每次创建对象,会把对象放在Session域中

(3)singleton和prototype区别

第一 singleton单实例,prototype 多实例

第二 设置scope值是singleton的时候,加载spring配置文件的时候就会创建单实例对象

设置scope值是prototype的时候,不是在加载spring配置文件的时候创建对象,在调用getBean方法的时候创建多实例对象

    <bean id = "book" class = "com.atguigu.spring.collectiontype.Book" scope="prototype" ><property name="list" ref = "bookList"></property></bean>

测试:

package com.atguigu.spring.test;import com.atguigu.spring.collectiontype.Book;
import com.atguigu.spring.collectiontype.Course;
import com.atguigu.spring.factoryBean.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class testBook {@Testpublic void testCollection(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");Book book1 = context.getBean("book", Book.class);Book book2 = context.getBean("book",Book.class);System.out.println(book1);System.out.println(book2);//        com.atguigu.spring.collectiontype.Book@6aaceffd
//        com.atguigu.spring.collectiontype.Book@c86b9e3}
}

IOC操作Bean管理(bean生命周期)

1.生命周期
(1)从对象创建到对象销毁的过程
2.bean生命周期
(1)通过构造器创建bean实例(无参构造)
(2)为bean的属性设置值和其他bean引用(调用set方法)
(3)调用bean的初始化的方法(需要进行配置初始化的方法)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)

3.演示bean生命周期

package com.atguigu.spring.collectiontype;public class Order {private String oname;//无参构造public Order(){System.out.println("1.order无参构造");}public void setOname(String oname){this.oname = oname;System.out.println("2.调用set方法设置属性值");}//创建执行的初始化的方法public void initMethod(){System.out.println("3.执行初始化方法");}//创建执行的销毁的方法public void destroyMethod(){System.out.println("5.执行销毁的方法");}}
<?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 = "order" class = "com.atguigu.spring.collectiontype.Order" init-method="initMethod" destroy-method="destroyMethod"><property name="oname" value="手机"></property></bean></beans>

测试:

package com.atguigu.spring.test;import com.atguigu.spring.collectiontype.Book;
import com.atguigu.spring.collectiontype.Course;
import com.atguigu.spring.collectiontype.Order;
import com.atguigu.spring.factoryBean.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class testBook {@Testpublic void testCollection3(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Order order = context.getBean("order", Order.class);System.out.println("4.获取创建bean实例对象");System.out.println(order);//手动让bean实例销毁((ClassPathXmlApplicationContext) context).close();}/*1.order无参构造
2.调用set方法设置属性值
3.执行初始化方法
4.获取创建bean实例对象
com.atguigu.spring.collectiontype.Order@3b0090a4
5.执行销毁的方法*/}

在这里插入图片描述

4.bean的后置处理器,bean生命周期有七步
(1)通过构造器创建bean实例(无参构造)
(2)为bean的属性设置值和其他bean引用(调用set方法)
(3)把bean实例传递给bean后置处理器的方法

 @Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return null;}

(4)调用bean的初始化的方法(需要进行配置初始化的方法)
(5)把bean实例传递给bean后置处理器的方法

 @Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return null;}

(6)bean可以使用了(对象获取到了)
(7)当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)

5.演示添加后置处理器效果

(1)创建类,实现接口BeanPostProcessor,创建后置处理器

package com.atguigu.spring.factoryBean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPost implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("在初始化之前执行的方法");return null;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("在初始化之后执行的方法");return null;}
}

示例:

package com.atguigu.spring.factoryBean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPost implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("在初始化之前执行的方法");return null;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("在初始化之后执行的方法");return null;}
}
<?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 = "order" class = "com.atguigu.spring.collectiontype.Order" init-method="initMethod" destroy-method="destroyMethod"><property name="oname" value="手机"></property></bean><!--配置后置处理器--><bean id = "myBeanPost" class = "com.atguigu.spring.factoryBean.MyBeanPost"></bean></beans>

测试:

package com.atguigu.spring.test;import com.atguigu.spring.collectiontype.Book;
import com.atguigu.spring.collectiontype.Course;
import com.atguigu.spring.collectiontype.Order;
import com.atguigu.spring.factoryBean.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class testBook {@Testpublic void testCollection3(){ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");Order order = context.getBean("order", Order.class);System.out.println("4.获取创建bean实例对象");System.out.println(order);//手动让bean实例销毁((ClassPathXmlApplicationContext) context).close();//        1.order无参构造
//        2.调用set方法设置属性值
//            在初始化之前执行的方法
//        3.执行初始化方法
//            在初始化之后执行的方法
//        4.获取创建bean实例对象
//        com.atguigu.spring.collectiontype.Order@74e52ef6
//        5.执行销毁的方法}}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手动造轮子——为Ocelot集成Nacos注册中心

前言近期在看博客的时候或者在群里看聊天的时候&#xff0c;发现很多都提到了Ocelot网关的问题。我之前也研究过一点&#xff0c;网关本身是一种通用的解决方案&#xff0c;主要的工作就是拦截请求统一处理&#xff0c;比如认证、授权、熔断、限流、注册发现、负载均衡等等。随…

程序员修神之路--简约而不简单的分布式通信基石

点击“蓝字”关注&#xff0c;领取架构书籍菜菜哥&#xff0c;请教一个问题呗面试又被卡住了&#xff1f;还是你了解我呀&#xff0c;tcp协议面向连接是怎么回事呢&#xff1f;这个说详细起来&#xff0c;那本好几百页的tcp协议的书籍你倒是可以看看分布式系统可以总结为是处于…

[Spring5]IOC容器_Bean管理注解方式_创建对象

IOC操心Bean管理&#xff08;基于注解方式&#xff09; 1.什么是注解 &#xff08;1&#xff09;注解是代码特殊标记&#xff0c;格式&#xff1a;注解名称(属性名称属性值,属性名称属性值…) &#xff08;2&#xff09;使用注解&#xff0c;注解作用在类上面&#xff0c;方…

一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗

一&#xff1a;背景1. 讲故事最近因为各方面原因换了一份工作&#xff0c;去了一家主营物联柜的公司&#xff0c;有意思的是物联柜上的终端是用 wpf 写的&#xff0c;代码也算是年久失修&#xff0c;感觉技术债还是蛮重的&#xff0c;前几天在调试一个bug的时候&#xff0c;看到…

.Net Core in Docker极简入门(上篇)

点击上方蓝字"小黑在哪里"关注我吧环境准备Docker基础概念Docker基础命令Docker命令实践构建Docker镜像Dockerfilebulid & run前言Docker 是一个开源的应用容器引擎&#xff0c;它十分火热&#xff0c;如今几乎成为了后端开发人员必须掌握的一项技能。即使你在生…

[Spring5]AOP底层原理

AOP底层原理 1.AOP底层使用动态代理 &#xff08;1&#xff09;有两种情况动态代理 第一种 有接口的情况&#xff0c;使用JDK动态代理 a.创建接口实现类代理对象&#xff0c;增强类的方法 第二种 没有接口的情况&#xff0c;使用CGLIB动态代理 a.创建子类的代理对象&#…

Hangfire定时触发作业,好像很简单?

【导读】本节我们继续稍微详细讲讲在我没有详细了解源码的前提下来探讨通过Hangfire定时触发作业有哪些需要注意的事项间隔时间内执行作业举个栗子&#xff0c;每隔10秒监控系统CPU&#xff0c;若CPU飙高&#xff08;根据实际业务定义百分比&#xff09;则在控制台打印输出&…

五分钟快速搭建Serverless免费邮件服务

1. 引言本文将带你快速基于 Azure Function 和 SendGrid 构建一个免费的Serverless&#xff08;无服务器&#xff09;的邮件发送服务&#xff0c;让你感受下Serverless的强大之处。该服务可以每月免费发送2,5000封&#xff0c;这是完全白嫖啊&#xff0c;感兴趣的&#xff0c;赶…

[Swagger2]SpringBoot集成Swagger

SpringBoot集成Swagger 引入依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</…

IdentityServer4 4.x版本 配置Scope的正确姿势

点击上方蓝字"小黑在哪里"关注我吧前言IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证的框架IdentityServer4官方文档&#xff1a;https://identityserver4.readthedocs.io/看这篇文章前默认你对IdentityServer4 已经有一…

[Swagger2]配置Swagger

配置Swaggr 1、Swagger实例Bean是Docket&#xff0c;所以通过配置Docket实例来配置Swaggger。 package com.xxxx.swagger2.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.doc…

.Net Core微服务入门全纪录(完结)——Ocelot与Swagger

点击上方蓝字"小黑在哪里"关注我吧前言上一篇【.Net Core微服务入门全纪录&#xff08;八&#xff09;——Docker Compose与容器网络】完成了docker-compose.yml文件的编写&#xff0c;最后使用docker compose的一个up指令即可在docker中运行整个复杂的环境。本篇简单…

[Swagger2]Swaggr配置扫描接口配置Swagger开关

Swagger配置扫描接口 1、构建Docket时通过select()方法配置怎么扫描接口。 Bean public Docket docket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()// 通过.select()方法&#xff0c;去配置扫描接口,RequestHandlerSelectors配置如何扫描…

最全.Net学习资料库上线,今日可免费下载各类资源!(附百度云链接)

送资料送资料1 适合学习者&#xff1a;0-10年.Net开发人员2 更新时间&#xff1a;2020年7月24日3 在哪领取&#xff1a;文末扫码免费领取4 包含课程&#xff1a;零基础就业必修/高级开发必修/架构师必修5 配套资料&#xff1a;视频配套源码/最新面试题合集/最新技术书/安装包你…

[Swagger2]拓展:其他皮肤

拓展&#xff1a;其他皮肤 我们可以导入不同的包实现不同的皮肤定义&#xff1a; 1、默认的 访问 http://localhost:8080/swagger-ui.html <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><ve…

如何基于 DDD 构建微服务?

本文将讨论微服务与 DDD 涉及到的概念、策划和设计方法&#xff0c;并且尝试将一个单体应用拆分成多个基于 DDD 的微服务。微服务的定义微服务中的“微”虽然表示服务的规模&#xff0c;但它并不是使应用程序成为微服务的唯一标准。当团队转向基于微服务的架构时&#xff0c;他…

.NET Core ResponseCache【缓存篇(一)】

一、前言源码1、最近一直在看项目性能优化方式&#xff0c;俗话说的好项目优化第一步那当然是添加缓存&#xff0c;我们的项目之所以卡的和鬼一样&#xff0c;要么就是你的代码循环查询数据库&#xff08;这个之前在我们的项目中经常出现&#xff0c;现在慢慢在修正&#xff09…

[Swagger2]分组和接口注释及小结

分组和接口注释及小结 配置API分组 1、如果没有配置分组&#xff0c;默认是default。通过groupName()方法即可配置分组&#xff1a; Bean public Docket docket(Environment environment) {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName(&qu…

Asp.Net Core 中的“虚拟目录”

写在前面现在部署Asp.Net Core应用已经不再限制于Windows的IIS上&#xff0c;更多的是Docker容器、各种反向代理来部署。也有少部分用IIS部署的&#xff0c;IIS部署确实是又快又简单&#xff0c;图形化操作三下五除二就可以发布好一个系统了。在过去Asp.Net MVC 项目部署的时候…

[mybatis]缓存_缓存有关的设置以及属性

缓存有关的设置以及属性 全局配置中的设置 和缓存有关的设置/属性1.cacheEnabletrue&#xff1b;false&#xff1b;关闭缓存(二级缓存关闭)(一级缓存一直可用的)2.每个select标签都有useCache“true”&#xff1b; false&#xff1b;不使用缓存(一级缓存依然使用&#xff0c;二…