当前位置: 首页 > news >正文

做网盘网站的成本企业网站建设目标

做网盘网站的成本,企业网站建设目标,私人设计工作室前景,java网站建设技术参数Spring底层原理(五) 本章内容 介绍Aware接口与InitializingBean接口、Bean的初始化与销毁、Scope Aware接口 作用:用于注入一些与容器相关的信息 类名作用BeanNameAware注入Bean的名称BeanFactoryAware注入BeanFactory容器ApplicationContextAware注入ApplicationContext容…

Spring底层原理(五)

本章内容

介绍Aware接口与InitializingBean接口、Bean的初始化与销毁、Scope

Aware接口

作用:用于注入一些与容器相关的信息

类名作用
BeanNameAware注入Bean的名称
BeanFactoryAware注入BeanFactory容器
ApplicationContextAware注入ApplicationContext容器
EmbeddedValueResolverAware${}

🔖 注入功能使用@Autowired就能实现,为什么还要用Aware接口呢?

  • @Autowired的解析需要用到bean后处理器,属于扩展行为
  • Aware接口属于内置功能,不加任何扩展,Spring就能识别

某些情况下,扩展功能会失效,而内置功能不会失效

InitializingBean接口

该接口提供了一种内置的初始化手段,内置的注入和初始化不受拓展功能的影响,总会被执行,因此Spring框架内部的类常用它

@Autowired失效分析

Java配置类不包含BeanFactoryPostProcessor的情况

在这里插入图片描述

Java配置类包含BeanFactoryPostProcessor的情况,创建其中的BeanFactoryPostProcessor必须提前创建Java配置类,而此时的BeanPostProcessor还未准备好,导致@Autowired等注解失效

解决办法:不要使用@Autowired@PostConstruct注解,而是使用InitializingBean接口

案例代码

@Slf4j
@Configuration
public class Config2 {@Autowiredpublic void app(ApplicationContext context) {log.info("===== 注入容器:{}", context);}@PostConstructpublic void init(){log.info("===== 初始化");}@Beanpublic BeanFactoryPostProcessor processor1(){return beanFactory->{log.info("执行processor1");};}
}
public class A05Application {public static void main(String[] args) throws IOException {GenericApplicationContext context = new GenericApplicationContext();context.registerBean(AutowiredAnnotationBeanPostProcessor.class);context.registerBean(CommonAnnotationBeanPostProcessor.class);context.registerBean(ConfigurationClassPostProcessor.class);context.registerBean("config2",Config2.class);context.refresh();for (String name : context.getBeanDefinitionNames()) {System.out.println(name);}context.close();}
}

更正后

@Slf4j
@Configuration
public class Config2 implements InitializingBean, ApplicationContextAware {@Beanpublic BeanFactoryPostProcessor processor1(){return beanFactory->{log.info("执行processor1");};}@Overridepublic void afterPropertiesSet() throws Exception {log.info("===== 初始化");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {log.info("===== 注入容器:{}", applicationContext);}
}
Bean的初始化与销毁
初始化
  • 使用@Bean(initMethod="")
  • 使用@PostConstruct注解
  • 使用InitializingBean接口

执行顺序:@PostConstruct @Bean(initMethod="") InitializingBean

销毁
  • 使用@Bean(distoryMethod="")
  • 使用@PreDistory注解
  • 使用DisposableBean接口

执行顺序:@PreDistory @Bean(distoryMethod="") DisposableBean

注意:Aware接口的执行时机在(初始化/销毁)注解和接口之间

Scope
Scope的类型有哪些
  • singleton:单例对象
  • prototype:原型,每次获取会创建一个新的对象
  • request:作用于Web的request作用域中,每次请求会创建一个新的对象
  • session:作用于Web的session作用域中,每个新的会话会创建一个新的对象
  • application:作用域Web的applicaion作用域中
Scope的销毁
  • singleton:当容器关闭时销毁
  • prototype:不受容器管控
  • request:每次请求结束
  • session:会话超时
  • application:没有被spring正确实现

指定Bean的作用域可以使用@Scope注解指定

Web作用域演示

在这里插入图片描述

Scope失效问题

当在singleton作用域调用其他作用域的对象时会导致其他作用域失效,原因是因为依赖注入只会注入一次

解决方案

  • 在注入的对象上使用@Lazy注解,SpringIoC容器会在启动的时候实例化所有单实例 bean 。如果我们想要实现 Spring 在启动的时候延迟加载 bean,即在首次调用bean的时候再去执行初始化
  • 指定@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)
  • 使用ObjectFactory来创建对象
  • 使用ApplicationContext获取对象

原理:都是延迟其他scope bean的获取时机

http://www.hkea.cn/news/856583/

相关文章:

  • 做uml图网站百度账号快速注册入口
  • 广西梧州南京 seo 价格
  • 网站警察备案seo关键词优化平台
  • 网站开发设计实训 报告惠州网站建设
  • 网站开发的原理山西免费网站关键词优化排名
  • 石家庄网站建设全包免费推广网站2024
  • 阿里云网站备案时间无锡seo网站管理
  • 景点介绍网站模板重庆百度关键词推广
  • 做亚马逊网站费用吗曲靖新闻今日头条
  • bing 网站管理员2023今日新闻头条
  • 深圳市做网站前十强百度一下搜索网页
  • 做执法设备有哪些网站国家免费培训学校
  • 顺德乐从有做阿里巴巴的网站吗杭州网站设计
  • 做英文网站 用阿里服务器行吗b2b网站推广排名
  • 搭建网站做淘宝客网赌怎么推广拉客户
  • 网站建设前台与后台最新技术2021最新免费的推广引流软件
  • 做网站基本语言淘宝如何提升关键词排名
  • wordpress怎样分类目录添加标签seo文章范文
  • 订阅号可以做网站吗南宁seo外包服务商
  • 邢台哪儿做网站便宜宁波 seo排名公司
  • 深圳网站优化咨询网上广告怎么推广
  • 网站右击无效是怎么做的网络营销产品
  • 中宣部网站政治建设网站服务器是什么意思
  • 淮安网站定制徐州seo外包公司
  • 嘉兴类网站系统总部网站建设技术解决方案
  • 做网站的教科书外包网络推广公司推广网站
  • 模板名字 wordpress优化大师如何删掉多余的学生
  • 3d网站建设制作百度关键词优化手段
  • 新手做那些网站比较好东莞企业网站排名
  • 欧美风格网站360指数