spring 详解一 IOC(BeanFactory和ApplicationContext)

news2024/9/21 17:32:31

spring概述

重要部分

Spring是一个容器,用来管理java对象的创建以及其他功能的扩展,目前java的生态已经离不开spring,所以spring在java领域是一个极其重要的框架,在spring的思想中IOC(控制反转)AOP(切面编程)是重要部分,而实现控制反转包含属性注入,也叫依赖注入DI(依赖注入)

官网架构图

 Test 模块:

  • Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能

Data Access/Integration:

  • 数据访问和集成,提供jdbc、orm等框架的API

Core Container(Spring 的核心容器):

  • Beans 模块:提供了框架的基础部分,包括控制反转和依赖注入。
  • Core 核心模块:封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。
  • Context 上下文模块:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点
  • SpEL 模块:提供了强大的表达式语言支持,支持访问和修改属性值等

 AOP、Aspects、Instrumentation 和 Messaging:

  • AOP 模块:提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合
  • Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架
  • Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用
  • messaging 模块:Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持

 Web 模块:

  • Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。
  • Servlet 模块:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。
  • WebSocket 模块:提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。
  • Portlet 模块:提供了在 Portlet 环境中使用 MVC 实现,类似 Web-Servlet 模块的功能。

 开发环境准备

创建maven空项目引入spring依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>

创建测试java文件 

package com.tech.test.service;

public interface UserService {

    public void getUser();
}
package com.tech.test.service.impl;

import com.tech.test.service.UserService;
import org.springframework.beans.factory.InitializingBean;

public class UserServiceImpl implements UserService, InitializingBean {

    @Override
    public void getUser() {
        System.out.println("get User Success");
    }

    /**
     * Bean初始化方法
     */
    public void init(){
        System.out.println("初始化方法");
    }

    /**
     * Bean销毁前方法
     */
    public void destroy(){
        System.out.println("销毁前方法");
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("initBean...");
    }
}

 添加spring配置文件application.xml

<?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">

</beans>

BeanFactory

BeanFactory 是早期的spring Bean工厂,是一个容器的顶层接口,在applicationContext容器中最重要的部分也是BeanFactory,只不过是封装了BeanFactory之后有扩展了其他功能,常用工厂实现类是DefaultListableBeanFactory

 BeanFactory获取bean

 <bean id="userService" class="com.tech.test.service.impl.UserServiceImpl"></bean>
package com.tech.test.springtest;

import com.tech.test.service.UserService;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;

public class TestBeanFactory {

    public static void main(String[] args) {
        // 创建BeanFactory
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

        // 创建读取器 读取xml
        XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

        // 读取配置文件交给工厂
        xmlBeanDefinitionReader.loadBeanDefinitions("applicationContext.xml");

        // 从工厂通过名称获取bean实例 
        UserService userService = (UserService)beanFactory.getBean("userService");
        // 从工厂通过类型获取bean实例 byType 必须保证单例唯一 不用强转
        // UserService userService = beanFactory.getBean(UserService.class);

        // 使用方法
        userService.getUser();

    }

}

测试结果

 配置的id最后会转变成name,存在singletonObjects中,也叫单例池和一级缓存(后面介绍)

ApplicationContext 

ApplicationContext被称为spring容器,内部封装了BeanFactory,但比BeanFactory更加强大,提供了事件发布、资源解析,消息资源,国际化等,但ApplicationContext的核心功能还是BeanFactory

 ApplicationContext继承体系 

常用的有三个具体实现类作为容器

ClassPathXmlApplicationContext  :加载类路径下的xml配置的ApplicationContext

FileSystemXmlApplicationContext :加载系统磁盘下的xml配置的ApplicationContext

AnnotationConfigApplicationContext :加载注解配置类的ApplicationContext

当前只在单spring的环境下继承体系如上图所示,但加入了web依赖,继承体系会发生变化

 <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.7</version>
</dependency>

继承体系如下 

 ApplicationContext获取Bean

上述BeanFActory的applicationContext.xml的Bean配置不变

package com.tech.test.springtest;

import com.tech.test.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestApplicationContext {
    public static void main(String[] args) {
        // 加载容器
        ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 获取Bean
        UserService userService = (UserService) classPathXmlApplicationContext.getBean("userService");
        // 使用方法
        userService.getUser();

    
    }
}

测试结果 

 与BeanFactory的效果一致,配置的id最后会转变成name,存在singletonObjects中,也叫单例池和一级缓存(后面介绍) 

BeanFactory和ApplicationContext的区别 

BeanFactory加载Bean是懒加载,在getBean的时候才回去创建Bean,Application是容器创建就实例化好所有的bean,通过断点可验证

ApplicationContext内部封装了BeanFactory,并且比BeanFactory更强大 

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

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

相关文章

Portraiture最新PS/LR 4.1.0.3皮肤修饰插件

Portraiture是一款惹人喜爱的PS磨皮插件。它能智能地对图像中的皮肤材质、头发、眉毛、睫毛等部位进行平滑和减少疵点处理&#xff0c;相对于Camera RAW&#xff0c;它能选择肌肤的色彩范围&#xff0c;对选择的部分进行单独处理。这样避免了其他部分同时被美化。 Portraiture…

C#(五十)之stringBuilder类

使用StringBuilder 需引用命名空间 using System.Text; String类与StringBuilder类的区别&#xff1a; string是各位用的最多的类型之一&#xff0c;是一个特殊的引用类型&#xff0c;直接派生于Object&#xff0c;因此它的值储存在托管堆上。构造一个新字符串的时候&#xf…

使用TestNG搭建自动化测试框架设计说明书

TestNG自动化测试框架V1.0 1. 背景............................................................................................................................ 4 1.1 编写背景.....................................................................................…

深度神经网络量化算法基础理论

关于量化&#xff0c;之前的博客中首先从第一个将量化思想应用在神经网络模型上的工作开始介绍&#xff0c;随后阐述了量化领域的极端情况&#xff0c;即二值化与三值化&#xff0c;并指出尽管目前已经存在多种对二值网络的优化方法&#xff0c;但是显然因极端量化带来的严重精…

Day45|70. 爬楼梯 (进阶)、 322. 零钱兑换 、279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 1.题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;…

算法与数据结构(一)--算法复杂性

一.算法复杂性的概念 算法的复杂性是指运行算法所需要的计算机资源的量。需要的时间资源的量称为时间复杂性&#xff0c;需要的空间资源的量称为空间复杂性。 这个量应该集中反映算法的效率&#xff0c;而从运行该算法的实际计算机中抽象出来。换句话说&#xff0c;这个量应该…

[物理层]信道的极限容量

信道的极限容量 信号在传输过程中会受到各种因素的影响&#xff0c;会造成信号失真。 失真的因素&#xff1a; 码元传输速率信号传输距离噪声干扰传输媒体质量 因此&#xff0c;怎么提高信息的传输速率&#xff1f; 奈氏准则 [ 香农公式 提高信道的传输速率&#xff1a; …

【C语言初阶(12)】数组(超详解)

文章目录 前言1. 一维数组1.1 一维数组的创建1.2 一维数组的初始化1.3 一维数组的访问1.4 一维数组在内存中的存储 2. 二维数组2.1 二位数组的创建2.2 二维数组的初始化2.3 二维数组的访问 3. 数组越界4. 数组作为函数参数4.1 冒泡排序介绍4.2 冒泡排序函数的设计 5. 数组名6. …

短视频矩阵管理系统私信群聊功能源码开发分享

短视频获客工具的兴起&#xff0c;也有越来越多的企业及商家在发现了更多商机。除了在做短视频推广获客的同时&#xff0c;也有不少意向客户潜藏在评论区需要我们深度挖掘&#xff0c;那么对于一些流量比较高的账号&#xff0c;想在成千上万的评论区里挖掘意向客户&#xff0c;…

C#一个开源跨平台的 HTTP 客户端库——RestSharp

一、RestSharp简介 GitHub - restsharp/RestSharp: Simple REST and HTTP API Client for .NETSimple REST and HTTP API Client for .NET. Contribute to restsharp/RestSharp development by creating an account on GitHub.https://github.com/restsharp/RestSharp …

SpringBoot实战(十九)集成Ribbon

目录 一、负载均衡的分类1.服务端负载均衡2.客户端负载均衡 二、定义和依赖1.Ribbon2.Spring Cloud Ribbon3.Spring Cloud Loadbalancer 三、搭建测试项目1.Maven依赖2.yaml配置3.配置类4.启动类5.接口类 四、测试五、补充&#xff1a;认识 Ribbon 的组件 一、负载均衡的分类 …

knife4j实现微服务swagger文档聚合

使用knife4j实现分布式swagger文档聚合 在项目开发过程中,接口文档的使用是在所难免的,但是在微服务场景下,多个服务之间的swagger是分散的,虽然swagger提供了微服务的聚合方式,配置过于繁琐,加之swagger本身的功能比较少,而且ui布局也比较蛋痛,此处推荐一款新框架用于增强swa…

RestTemplate中exchange发起请求

RestTemplate中exchange简单使用 简介什么是RestTemplate 常用方法实战 简介 在项目中&#xff0c;我们可能需要发起HTTP请求&#xff0c;请求目标URL来获取响应数据做一些处理。就需要用到HTTP请求工具&#xff0c;常用的Java类工具有&#xff1a;HttpUrlConnection、Apache …

[TIFS 2023] 用增强压缩感知做安全模型对比联邦学习

Secure Model-Contrastive Federated Learning With Improved Compressive Sensing | IEEE Journals & Magazine | IEEE Xplore摘要&#xff1a; 联邦学习&#xff08;FL&#xff09;已广泛应用于金融风险控制、电子政务、智慧医疗等各个领域。为了保护数据隐私&#xff0…

Leetcode每日一题:167. 两数之和 II - 输入有序数组(2023.7.8 C++)

目录 167. 两数之和 II - 输入有序数组 题目描述&#xff1a; 实现代码与解析&#xff1a; 暴力&#xff08;超时&#xff09; 双指针 原理思路&#xff1a; 二分 原理思路&#xff1a; 167. 两数之和 II - 输入有序数组 题目描述&#xff1a; 给你一个下标从 1 开始的…

MySQL性能瓶颈定位慢查询

目录 1 性能优化的思路2 引言3 MySQL慢查询日志3.1 慢查询参数3.2 开启慢查询日志&#xff08;临时&#xff09;3.3 开启慢查询日志&#xff08;永久&#xff09;3.4 慢查询测试 4 MySQL性能分析 EXPLAIN4.1 概述4.2 EXPLAIN字段介绍4.2.1 id字段4.2.2 select_type 与 table字段…

Leetcode-每日一题【21.合并两个有序链表】

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4]输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 []输出&#xff1a;…

1.Git使用技巧-常用命令1

Git使用技巧-常用命令 文章目录 Git使用技巧-常用命令一、git 创建仓库demo 二、本地仓库常用命令提交详解git commitgit commit --amend 三、 推送到远程分支git push 总结参考 一、git 创建仓库 创建远端仓库&#xff1a; git init – bare // 创建远端裸仓库&#xff1b; 远…

【华为机试】HJ16 购物单详解+完整源代码示例

从毕业到入职&#xff0c;忙于各种事情&#xff0c;所以博客一直也没有空更新。从入职到现在差不多整三个月了&#xff0c;刚刚在比亚迪这边转正。目前干的工作涉及到开发的工作不是很多&#xff0c;但是又怕之前的技能荒废了。所以最近有个想法&#xff0c;再把C算法和数据结构…

Android Zygote 启动流程

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: Android系统包含netd、servicemanager、surfaceflinger、zygote、media、installd、bootanimation 等基本服务&#xff0c;具体作用请看下图。 Android…