Spring框架优势以及@Autowired依赖注入过程

递归流沙
• 阅读 2429

Spring框架优势

大家都知道使用spring框架可以由其管理对象(Bean),实现其控制反转的特点,这一大特点会为我们带来一下优势:

解耦

首先第一点优势就是解耦!
通过spring框架底层通过反射来创建对象而不是通过我们自己来new对象,很大程度上就已经降低了代码的耦合度.
耦合度就是对象之间的依赖关系,对象之间的依赖程度越高,维护成本也就越高,所以通过spring框架来管理对象而降低耦合度对我们的项目来说是很有益处的.

延迟加载

第二点优势就是延迟加载!
由spring管理对象,可以通过@Lazy注解标记,来使得对象的创建达到延迟加载的效果,只有在使用时才会打破延迟.

@Lazy可以用于描述类/方法
底层是通过value属性的true/false值,来表示是否延迟.
默认value属性为true,表示要延迟构建以及延迟初始化-->@Lazy(true)
如果写false,和没写该注解相同,表示不支持延迟-->@Lazy(false)

应用场景:
大对象(例如池对象),稀少用(容器初始化创建对象也用不到)
通常配合单例作用域使用

指定作用域

第三点优势就是可以指定作用域!
由spring管理对象,可以通过@Scope注解标记,指定类实例的作用域.

@Scope(" ")-" "中可以填入两个值:
singleton:单例作用域,类的实例在一个JVM内存中只有一份,spring负责创建负责销毁,还会存储到bean池中(默认)
prototype:多利作用域,类的实例何时需要何时创建,spring负责创建不负责销毁

一般可重用的对象设为单例;
一般不可重用对象或仅使用一次就不再使用对象设为多例.

描述生命周期

第四点优势就是可以描述生命周期!
由spring管理对象,可以通过@PostConstruct/@PreDestroy注解标记,来描述生命周期的初始化/销毁方法.

@PostConstruct此注解描述的方法为生命周期初始化方法,此方法会在对象构造方法之后执行,在这样的方法中一般会为创建好的对象再次进行一些初始化.
@PreDestroy此注解描述的方法为生命周期销毁方法,此方法会在对象销毁之前执行,在这样的方法中可以实现一些资源销毁操作.

实例如下:

@Scope
//@Scope("prototype")
@Lazy
@Component//将类交给spring管理
public class ObjectPool {
    public int size;
    public ObjectPool() {
        System.out.println("ObjectPool()");
    }
    @PostConstruct
    public void init() {
        System.out.println("init()");
    }
    @PreDestroy
    public void destiry() {
        System.out.println("destiry()");
    }
}
@SpringBootTest
public class ObjectPoolTests {
    @Autowired
    private ObjectPool objectPool1;
    @Autowired
    private ObjectPool objectPool2;
    @Test
    void testObjectPool() {
        System.out.println("objectPool1="+objectPool1);
        System.out.println(objectPool1==objectPool2);//比较对象地址
        objectPool1.size=10;
        System.out.println(objectPool2.size);
    }
}

以上代码实际运行后,可以观察其方法打印顺序,以及对象地址值的比较,继而验证上述注解的作用.

@Autowired依赖注入

从上面代码块中的实例里可以看到在测试类中是通过@Autowired注解标记的方式将对象作为属性注入到另一个类中的.这也是使用spring框架时常用到的一个方式.

@Autowired

@Autowired描述属性或方法时,系统底层会先根据描述属性或方法参数的类型去spring容器中进行查找:

当有且只有一个相同类型的对象时,会直接注入;
但若检测到多个类型都满足注入要求,还会根据@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,若有会直接注入,没有则会抛出异常.

@Qualifier

如果我们有明确的要求,希望@Autowired注入的类型/名称都是指定类型/名字的对象,可以通过@Qualifier注解对其属性或参数进行描述.

@Qualifier注解必须配合@Autowired注解使用!

实例如下

@SpringBootTest
public class CacheTests {
    //描述属性
    @Autowired
    @Qualifier("weakCache")
    private Cache cache;

    @Test
    void testCache() {
        System.out.println("cache="+cache);
    }
}
@Component
public class SearchService {
    private Cache cache;
    
    //描述方法
    @Autowired
    public SearchService( @Qualifier("softCache") Cache cache) {
        this.cache=cache;
        System.out.println("SearchService.this.cache="+this.cache);
    }
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
SSM的基本知识点
\SpringSpring框架是一个容器,它的主要作用是创建和管理对象。Spring框架实现了解耦。Spring框架通过DI实现了IoC。关于Spring框架,必须掌握和理解的:1. Spring的基本概念与特性;2. 常用的注解:通用的4个注解,自动装配的注解;3.
Easter79 Easter79
3年前
SpringIOC官方文档解读
IoC容器本章介绍了Spring的控制反转(IoC)容器。1.1。SpringIoC容器和Bean简介本章介绍了反转控制(IoC)原则的Spring框架实现。IoC也称为依赖注入(DI)。在此过程中,对象可以通过①构造函数参数(),②工厂方法的参数③或在构造或从工厂方法返回后在对象实例上设置的属性来定义其依
Wesley13 Wesley13
3年前
Java项目笔记之知识点总结03
不点蓝字,我们哪来故事?SSM本质是Spring去集成SpringMVC和MyBatis,即控制器对象、业务对象、Mapper对象等都交由Spring容器管理,使用SpringIoC和DI来完成对象创建及其属性注入,使用AOP来配置事务。作用是在框架上基础上开发,发挥各
Stella981 Stella981
3年前
Spring IOC
springioc是spring的核心之一,也是spring体系的基础,那么springioc所依赖的底层技术是什么的?反射,以前我们开发程序的时候对象之间的相互调用需要用new来实现,现在所有的bean都是通过spring容器来管理。这样做有什么好处呢?解耦!以前程序直接的调用用new直接给写死了,现在我们可以通过注入不同的接口实现类来完成对象直接的调
Easter79 Easter79
3年前
Spring常用知识点总结
1\.Spring有哪些优点?  轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。  控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。  面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来
Wesley13 Wesley13
3年前
JAVA日常记录
11.IOC的优点是什么IOC(InversionofControl)控制反转,将控制权(创建对象和对象之间的依赖关系的权利)交给spring容器。接口驱动设计(InterfaceDrivenDesign)的好处,可以灵活提供不同的子类实现(其实就是解耦),提高程序的灵活性、可扩展性和可维护性。IOC模式将耦合代
Stella981 Stella981
3年前
Spring 学习笔记(二):SpringIoC
1IoC与DIIoC是InversionofControl的简称,也就是控制反转。通常来说,创建对象需要调用者手动创建,也就是newXXX()的方式。当Spring框架出现后,对象的实例不再由调用者创建,而是由Spring容器创建,这样控制权就由调用者转移到Spring容器,控制权发生了反
Easter79 Easter79
3年前
Spring概念和Bean管理(配置文件)
Spring概念1.spring是开源的轻量级框架(免费,依赖少,可以直接使用)2.spring核心主要两部分:  (1)aop:面向切面编程,扩展功能不是修改源代码实现  (2)ioc:控制反转,  比如有个类,在类里面有个方法(不是静态方法),调用类里面的方法,需要创建类的对象,使用对象调用方法,创
Wesley13 Wesley13
3年前
Java开发工程师最新面试题库系列——Spring部分(附答案)
Spring1.Spring框架是什么?答:Spring是轻量级的面向切面和控制反转的框架。_初代版本为2002年发布的interface21_,Spring框架是为了解决企业级应用开发的复杂性的出现的,它可以帮助开发人员管理对象之间的关系。能实现模块与模块之间、类与类之间的解耦合,Spring是一个大杂烩,它集成其他
Easter79 Easter79
3年前
Spring知识点提炼
1\.Spring框架的作用清理:Spring是轻量级的,基本的版本大小为2MB控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。面向切面的编程AOP:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。容器:Spring包含并管理应用中对象
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
递归流沙
递归流沙
Lv1
我懂人性薄凉却忍不住追随他的脚步
文章
4
粉丝
0
获赞
0