Java开发 - Spring框架初体验(一)

简介: Java开发 - Spring框架初体验

目录


前言

了解框架的概念

Spring框架

关于Spring

在Maven中使用Spring

Spring怎么管理对象

spring怎么创建对象

通过@Bean注解创建对象

通过组件扫描创建对象

关于@ComponentScan("xxxxxx")

Spring Bean的作用域

自动装配技术

什么是自动装配

补充

IoC与DI

@Qualifier注解

@Resource注解

未提到的内容

结语


前言


学过Java的小伙伴都知道,Spring框架在Java中已经不是一个简单的框架那么简单了,它是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。关于其历史,博主不再介绍,今天这篇博客的作用是帮助初学者认识这个框架,了解它的基本功能,这对后续了解SSM框架乃至微服务的开发都有极其重要的作用。


了解框架的概念


框架( Framework )是构成一类特定软件可复用设计的一组相互协作的类。框架规定了你的应用的体系结构。它定义了整体结构,类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程。框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节。


你可以将框架理解为现实生活中的“毛胚房”,它已经完成了住房最基础 部分的设计,例如打地基、设计住房的基本格局、预留电路、水路的线路 接入等……当你使用一个框架时,就相当于得到了一间毛胚房,如果你想住进去,你需要做的事情主要是“装修”,把这个毛胚房加工成你希望的样子。


我们可以认为框架已经帮我们做好了基础的部分。框架对我们的帮助很大,但也因此对我们造成了一定的限制。因为需要遵守框架定下来的一些规则协议。所以在学医框架时,首先要做的就是掌握框架的使用方法,这样才能达到我们预期的目标,而关于实现原理这些,可以等到彻底掌握之后再去了解不迟。


Spring框架


Spring框架主要解决了创建对象、管理对象的问题。Spring框架的核心价值在于:开发者可以通过Spring框架提供的机制,将创建对象、管理对象的任务交给Spring来完成,而开发者不必在关注这个过程,只需要在需要创建对象的时候,通过Spring来获取即可。对了,框架我们也称之为容器,所以,Spring框架也称作Spring容器,当别人在谈到容器的时候,不至于不知道说的是什么。


Spring框架很好的支持了AOP,关于AOP,这是一块比较大比较复杂的内容,所以这里暂不多做介绍,将会在后期推出专门的博客来进行说明,本篇的意义在于让大家快速的了解Spring框架,为Java入门作基础。


关于Spring


public class UserMapper { 
    //向用户表中中插入数据 
    public void insert() {
    }
}

这是一个mapper类,作用是来操作操作sql来执行一些增删改查的命令的,假设我们要创建一个这样的对象:

UserMapper userMapper = new UserMapper();

只需要这么做就可以,但是在实际开发中,会存在类之间相互依赖的情况,一个对象可能需要被频繁创建,在客户端,我会声明一个全局变量,或者是属性,以方便在整个类中使用,在Java中我们当然希望也是这样的方式。事实上,你可以照猫画虎,也这样做,但是Java中提供了一种方式连对象初始化创建都不需要我们自己做,可以帮助我们大大提高开发的效率,而这,就是框架的好处。


比如:

public class UserController { 
    public UserMapper userMapper;
    public void register() { 
        userMapper.insert();
    }
}

在controller中,我们要在注册的时候使用前面的那个mapper,调用insert方法插入注册的用户数据 ,userMapper需要被new出来,我们先前说了,框架提供了便捷的方式帮助我们初始化。为什么要这么做呢?如果自行创建对象,当多个类都依赖UserMapper时,各自创建UserMapper对象, 违背了“只需要1个”的思想。


在开发中,有许多类型的对象、配置值都需要常驻内存、需要有唯一性,或都需要多处使用,自行维护这些对象或值是非常繁琐的,比如单例。通过 Spring框架可以极大的简化这些操作,曾经听别人说过:Spring框架这种自动创建对象的能力也是一种“单例”,此单例非彼单例,只思想上是单例,以后有机会再讲。


在Maven中使用Spring


当使用Spring时,我们一般使用maven工程,在pom文件中添加依赖如下:

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

版本号可按需调整。推荐大家使用旧的版本,因为相对稳定一些。


Spring怎么管理对象


spring怎么创建对象


Spring管理对象需要先创建对象,然后spring才能获取到对象并进行管理;

Spring管理的对象,我们称为Spring Bean;

创建对象我们常用两种方式:

通过@Bean注解

通过组件扫描

不懂没关系,接下来我们分别来说说他们分别是什么。


通过@Bean注解创建对象


我们先创建一个类,比如路径如下:cn.codingfire.spring.SpringBeanPro

public class SpringBeanPro {
}

在类中添加方法:

@Configuration
public class SpringBeanPro {
    @Bean
    public Random random() {
        return new Random();
    }
}

可自定义一个类去返回一个对象,博主懒,通过Random来做。要注意的是,@Configuration注解必不可少, 方法上的@Bean注解也必不可少,不要问为什么,因为不这么做,无法达到效果,记住即可,关于这些注解的作用,其实很难描述清楚,很多注解在不同环境下语义是不一样的,但有时候,用什么注解都是一个效果,此处可不行啊,后续会出一篇注解大全来总结介绍Java中常用的注解,请大家暂时不要纠结这些注解。


本例中:


@Configuration添加在类的生明之前,表示此类是配置类,会自动执行配置类中的@Bean方法,并解读配置类上的其他注解。


@Bean添加在配置类中用于创建对象的方法之前,使得Spring框架自动调用次方法,并管理次方法饭蝴蝶结果,@Bean方法必须存在于@Configuration注解下的类中


接着,我们需要测试我们的类是否已经被spring管理,所以,需要来测试下:


让Spring先跑起来,这个代码很长了,看看:

AnnotationConfigApplicationContext ac
                = new AnnotationConfigApplicationContext(SpringBeanPro.class);

这玩意不需要纠结,它只是用于加载Spring配置,注意,要在构造方法中添加参数,即我们的类。


从Spring中获取对象

Random random = (Random) ac.getBean("random");

其实就是方法的名称,这里运用了反射机制,听过的大概知道原理,不懂的也不再额外介绍,嗯~大概就是通过字符串获取实体类或方法的一种机制。


输出测试,看看有没有获取到对象

System.out.println(random);

结束

ac.close();

以上代码,你需要知道的有三点:


getBean方法,次方法会被重载多次:

Object getBean(String beanName) 通过此方法,传入的beanName必须是有效的,否则将导致 NoSuchBeanDefinitionException

T getBean(Class<T> beanClass);使用此方法时,传入的类型在Spring中必须有且仅有1个对象,如果Spring容器中没 有匹配类型的对象,将导致NoSuchBeanDefinitionException,如果有2个或更多, 将导致NoUniqueBeanDefinitionException

T getBean(String beanName, Class<T> beanClass) ;此方法仍是根据传入的beanName获取对象,并且根据传入的beanClass进行类型转换

两个注解,缺一不可,有意思的是,@Configuration注解并不是必须的, 但@Bean方法的使用规范是将其声明在@Configuration类中

使用的@Bean注解可以传入String类型的参数,如果传入,则此注解对应的方法的返回结果的beanName就是@Bean注解中传入的String参数值,后续调用getBean() 方法时,如果需要传入beanName,就应该传入在@Bean注解中配置的String参数值,而不是方法名

@Configuration
public class SpringBeanPro {
    @Bean("random")
    public Random xxxxx() {
        return new Random();
    }
}
目录
相关文章
|
4天前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
1天前
|
数据采集 供应链 JavaScript
分享基于Java开发的Java毕业设计实战项目题目
这篇文章分享了67套基于Java开发的毕业设计实战项目题目,覆盖了互联网、企业管理、电子政务、Java基础项目、ERP系统、校园相关、医疗以及其他细分行业等多个领域,并推荐了使用IDEA、Vue和Springboot的技术栈。
|
1天前
|
安全 前端开发 Java
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择。依赖注入使对象管理交由Spring容器处理,实现低耦合高内聚;AOP则分离横切关注点如事务管理,增强代码模块化。Spring还提供MVC、Data、Security等模块满足多样需求,并通过Spring Boot简化配置与部署,加速微服务架构构建。掌握这些核心概念与工具,开发者能更从容应对挑战,打造卓越应用。
7 1
|
1天前
|
分布式计算 Java API
Java 8带来了流处理与函数式编程等新特性,极大提升了开发效率
Java 8带来了流处理与函数式编程等新特性,极大提升了开发效率。流处理采用声明式编程模型,通过filter、map等操作简化数据集处理,提高代码可读性。Lambda表达式支持轻量级函数定义,配合Predicate、Function等接口,使函数式编程无缝融入Java。此外,Optional类及新日期时间API等增强功能,让开发者能更优雅地处理潜在错误,编写出更健壮的应用程序。
7 1
|
4天前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
1天前
|
人工智能 网络协议 Java
23.12月中旬 上海寻序人工智能科技-上海嘉定-Java开发实习生-薪资150-230/d 面经
关于上海寻序人工智能科技有限公司Java开发实习生岗位的面试经验分享,涵盖了技术问题如对象存储MinIO、ArrayList扩容、Object类方法、hashCode和equals方法、处理哈希冲突、JVM垃圾回收器、GC算法、网络协议、邮件协议、HTTP请求方法、Linux和Docker命令、Dockerfile制作等。
4 0
|
11月前
|
SQL Java 数据库连接
Java面试题日积月累(SSM框架面试题22道)
Java面试题日积月累(SSM框架面试题22道)
69 0
|
1月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
35 1
|
1月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
31 0
|
1月前
|
存储 安全 Java
Java面试题:请解释Java中的泛型集合框架?以及泛型的经典应用案例
Java面试题:请解释Java中的泛型集合框架?以及泛型的经典应用案例
26 0