热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习Spring5必知必会(3)~Spring的核心IoC和DI

一、Spring的核心IoC(基于XML)1、IoC容器(1)BeanFactory容器创建对象:使用BeanFactory@TestvoidtestBeanFactory(


一、Spring的核心 IoC(基于XML)


1、IoC容器

(1)BeanFactory容器创建对象:

//使用BeanFactory
@Test
void testBeanFactory() throws Exception {
Resource resource = new ClassPathResource("com/shan/container/container.xml");
BeanFactory factory = new XmlBeanFactory(resource);
Person person = factory.getBean("person", Person.class);
}

(2)BeanFactory的子接口 ApplicationContext容器创建对象:

//使用ApplicationContext
@Test
void testApplicationContext() throws Exception {
//习惯将上下文对象命名为ctx
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/shan/container/container.xml");
Person person = ctx.getBean("person", Person.class);
}

(3)bean创建时机(ApplicationContext 和 BeanFactory 创建对象的区别 ):



  • BeanFactory 在创建Spring容器的时候,并不会立马创建容器中管理的Bean对象,需要等到获取某一个 bean 的时候才会创建该 bean--延迟初始化。(懒加载



  • ApplicationContext 在启动 Spring 容器的时候就会创建所有的 bean(在 Web 应用使用Application



□ 当然可以通过属性设置懒加载:

对于某个bean对象,在该bean元素上通过 属性lazy-init 进行设置; 对所有bean对象,在beans上通过 属性default-lazy-init进行设置。


2、bean实例化方式(4种):


★ ① 构造器实例化(bean 中有 无参数构造器),标准、常用

② 静态工厂方法实例化:解决系统遗留问题。

③ 实例工厂方法实例化:解决系统遗留问题。


★ ④ 实现 FactoryBean 接口实例化:是第三种方式实例工厂的变种。 如集成 MyBatis 框架使用:org.mybatis.spring.SqlSessionFactoryBean

□ 方式2(工厂类中有一个创建bean对象的静态方法):在xml的配置:


□ 方式3(工厂类中有一个创建bean对象的方法):在xml的配置:



□ 方式4(实现 FactoryBean 接口实例化的方法):在xml的配置:(在方法3中,配置了两个bean,咱的思路是:将其中一个bean "固定化",

做法:将工厂实例化对象的方法规定为都叫 getObject 方法,因为咱定义的工厂类实现了FactoryBean接口(这是该接口的规范)

public class DogFactory implements FactoryBean{
@Override
public Dog getObject() throws Exception {
Dog dog = new Dog();
return dog;
}
@Override
public Class getObjectType() {
return Dog.class;
}
}



/* 使用spring的测试框架 */
@SpringJUnitConfig
public class App {
@Autowired
private Person person;
@Autowired
private BeanFactory factory;
@Autowired
private ApplicationContext ctx;
@Autowired
private Dog dog;

@Test
void testBeanFactory() throws Exception {
System.out.println(person);
System.out.println(dog);
}
}


3、bean作用域scope(常用单例)



  • 在 Spring 容器中是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围,定于语法格式:




    • 单例和多例: singleton: 单例(默认的作用域) prototype: 多例



    • 在web应用中(request、session、application)



    • globalSession: 一般用于 Porlet 应用环境 , 分布式系统存在全局 session 概念(单点登录)



    • websocket:将一个bean定义定义到WebSocket的生命周期





  • 缺省情况下是单例 singleton




4、bean初始化和销毁



  • 属性init-method="该类中初始化方法名" 和 属性destroy-method="该类中销毁方法名"

  • 没有使用spring的测试框架的话,就不能正常关闭IoC容器,即销毁bean对象了(可以手动关闭)


■ bean 的生命周期:bean 从出生到消亡的整个过程。

BeanFactory:延迟初始化特点

ApplicationContext:在启动Spring容器的时候,就会去创建bean对象


5、bean的生命周期

①执行Bean 构造器 ②为Bean注入属性 ③调用Bean元素的init-method 进行初始化 ④获取Bean对象,调用Bean对象的某个方法 ⑤调用Bean元素的destroy-method 进行销毁对象 ⑥销毁Spring容器



二、Spring的 DI



  • DI:Dependency Injection (依赖注入):Spring 创建对象的过程转给你,将对象依赖的属性(常量、对象、集合)通过配置设置值给该对象



  • IoC: 将对象的创建权,反转给了Spring容器



■ 注入:☺ 简单理解就是给对象设置值(通过对象的setter方法【属性注入方法】、通过对象的构造器设置值【构造器注入方法】)


□ 设置值的类型:


  • 常量类型(固定不变),简单类型 value

  • 对象类型(引用类型) ref

  • 集合类型 各自集合对应的元素...


1、通过XML配置装配


(1)XML自动装配(不推荐)通过bean元素的属性 autowire 自动装配


✿(2)setter注入 [ 属性注入(根据类型区分)]

■(常用) 注入常量 value






■(常用) 注入对象 ref









■ 注入集合 、、






set1
set2
set3





list1
list2





array1











p1=v1
p2=v2




● 属性的设置值是在 init 方法执行之前完成。com.shan.di_construstor


(3)构造器注入(跟属性注入差不多,常用的是属性注入,就是将property换成constructor-arg 元素)















✿(4)bean元素继承 (本质是xml配置内容的拷贝)



  • 通过abstract属性进行抽取

  • 通过parent属性进行引入

image


(5) 配置数据库连接池










✿ 动态加载配置文件(db.properties---数据库连接的配置信息)

(6)property place holder


1)要是使用标签Context,需要先引入Context的约束(在beans的基础进行修改即可):

image


2) context:property-placeholder 属性占位符




3)使用 ${} 动态引入属性值









本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15939167.html



推荐阅读
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 在ASP.NET中,实现页面间数据传递有多种技术方案。其中一种常见方法是通过URL链接地址传递参数,例如在 `send.aspx` 页面中,可以通过点击按钮将数据附加到URL中,然后在目标页面 `receive.aspx` 中解析这些参数。此外,还可以利用Session、ViewState、Cookie等机制来实现跨页面的数据共享,每种方法都有其适用场景和优缺点。 ... [详细]
author-avatar
o0沢田纲吉0o
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有