Spring5之IOC操作Bean管理(基于xml和注解)(一)

简介: Spring5之IOC操作Bean管理(基于xml和注解)

前言

前几天Spring框架曝出RCE 0day漏洞,可导致远程代码执行 (RCE),使用JDK9及以上版本都有可能受到影响,还好博主用的是稳定的JDK8(JDK8真的是yyds)。本篇文章主要介绍一下spring核心之一的IOC/DI以及他们是如何通过XML和注解的方式实现Bean管理。天不生我小码农,码道万古如长夜,码字不易,感谢支持,当然可能有一些理解不到位的地方,欢迎指正。

一、Spring的核心

Spring是轻量级的开源JavaEE框架,Spring主要用到的设计模式有工厂模式和代理模式,一般而言,工厂模式分为三类:简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)。所有的框架主要用于解耦和快速开发,可以理解为框架=注解+反射+设计模式。Spring 有两个核心部分:IOC和AOP(这也是Spring面试常问的两个东西)。


1、IOC:控制反转,把对象创建和对象之间的调用过程交给Spring进行管理(DI和IOC是同一个概念的不同角度描述,控制反转是一种编程思想,依赖注入是实现控制反转的典型方法或者说DI是IOC的具体实现,DI需要在创建对象的基础上实现,给对象的属性进行赋值)。控制:包括对象的创建,属性的赋值以及对象之间关系的管理。反转:把原来由开发人员创建、管理对象的权限交给第三方即代码之外的spring容器进行实现,在JavaSE中,当我们缺少对象时,我们可以用关键字new一个对象,这也可以称为正转。


2、AOP:面向切面,不修改源代码的情况下增强功能(原理:动态代理技术,设计模式就是代理加装饰器)。

二、Spring的特点

1、方便解耦,简化开发


2、AOP编程支持


3、方便程序的测试(可以使用Junit测试单元)


4、方便和其他优秀的框架进行整合(比如博主以前所写的SSM集成框架,就是Spring集成了Mybatis等优秀框架,当然还有过时的SSH框架:Spring + Struts +Hibernate,以前老会开玩笑说学完春天学冬天,现在也用不上冬天了)


5、方便进行事务的操作


6、降低API的开发难度

三、Spring5的主要内容

ef1e953edff1d8219907ecfb3366ceb7_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YWo5p2R56ys5LqM5biF,size_20,color_FFFFFF,t_70,g_se,x_16.png

博主用的是5.2.5版本的,但官网已经更新到了5.3.18版本了

1、IOC容器

2、AOP

3、jdbcTemplate

4、事务管理

5、Spring 5新特性:Webflux(响应式编程及函数式编程)、函数式注册对象、Nullable注解等。

四、IOC底层

1、IOC底层的技术

IOC思想是基于IOC容器完成的,IOC容器的底层就是Object Factories(对象工厂,工厂顾名思义是用来生产产品的,利用对象工厂,我们创建对象时就可以得到解脱)。IOC底层技术包括xml解析、工厂模式、反射、注解。

2、IOC接口

Spring提供IOC容器的实现有两种方式(两个接口)


BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,不提供开发人员进行使用。加载配置文件时不会创建对象,只有在获取或者使用对象时才去加载对象(懒汉式)。


ApplicationContext:继承了BeanFactory接口,是Beanactory接口的子接口,它提供了更多更强大的功能,一般由开发人员使用,在加载配置文件的时候就会对对象进行创建。(饿汉式)


ApplicationContext接口有实现类,其中有两种是加载配置文件的具体实现类

1e7f65d29c99c14f890246b11904e5a0_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YWo5p2R56ys5LqM5biF,size_20,color_FFFFFF,t_70,g_se,x_16.png

对比源码会发现两者在前面的代码基本一致,主要是体现在后面加载配置文件的方式上,FileSystemXmlApplicationContext加载绝对路径的配置文件,ClassPathXmlApplicationContext加载类路径的配置文件。

 protected Resource getResourceByPath(String path) {
        if (path.startsWith("/")) {
            path = path.substring(1);
        }
        return new FileSystemResource(path);
    }
public ClassPathXmlApplicationContext(String path, Class<?> clazz) throws BeansException {
        this(new String[]{path}, clazz);
    }
    public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz) throws BeansException {
        this(paths, clazz, (ApplicationContext)null);
    }
    public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz, @Nullable ApplicationContext parent) throws BeansException {
        super(parent);
        Assert.notNull(paths, "Path array must not be null");
        Assert.notNull(clazz, "Class argument must not be null");
        this.configResources = new Resource[paths.length];
        for(int i = 0; i < paths.length; ++i) {
            this.configResources[i] = new ClassPathResource(paths[i], clazz);
        }
        this.refresh();
    }
    @Nullable
    protected Resource[] getConfigResources() {
        return this.configResources;
    }
相关文章
|
24天前
|
XML 安全 Java
|
1天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
|
2天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
1天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
1天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
1天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
6天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
35 6
|
8天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
53 3
|
22天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
41 2
|
22天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
32 1