想要彻底搞懂spring源码?首先你得先搞懂Spring IOC,安排

硬件开发流程 研发流程在一个有一定规模的企业中起到了非常重要的作用,也是一个产品或者项目成功量产出货依赖的平台体系,作为工程师如果想要走的更远,就必须了解流程体系,了解如何对产品的开发质量进行更好的管控。... 阅读详情

1.Spring概述

Spring是Java应用轻量级开源框架,所谓轻量级指的是:API简单,运行时占用资源少。 Spring的核心是 IOC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)。 Spring一个应用框架, 提供了表现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多应用技术。 Spring还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架。

2.IOC(Inverse Of Control)思想

IOC(控制反转)相当于一个容器,这个容器里面放你想放的对象或者要用到的对象。之前我们在创建对象直接nw创建。现在有了spring提供的IOC容器我们可以直接从容器中拿对象。转化了之前创建对象的方式,将对象的控制权从程序员手中转换到了spring IOC容器中。

3.重要API

两个接口 BeanFactory 这是SpringIOC容器的顶级接口,它定义了SpringIOC的最基础的功能,但是其功能比较简单, 一般面向Spring自身使用。 BeanFactroy在第一次使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。

javaApplicationContext 这是在BeanFactory基础上衍生出的接口,它扩展了BeanFactory的功能,一般面向程序员使用。 ApplicationContext是在容器启动时,一次性创建并加载了所有的Bean。

三个实现类


ClassPathXmlApplicationContext 读取类路径下的xml作为配置文件 javaFileSystemXmlApplicationContext 读取本地目录下的xml作为配置文件 javaAnnotationConfigApplicationContext 读取一个Java类作为配置文件

一个方法

getBean() 用于从Spring容器中获取Bean对象,参数可以使用三种情况:

getBean("id")                 使用bean的id从容器中查找对象
getBean(Bean.class)           使用bean的class类型从容器中查找对象
getBean("id", Bean.class)     使用bean的id 和 class类型从容器中查找对象
复制代码

一般用第二种,当接口有多个实现类的时候一般用第三种这样可以指定具体应用哪个实现类,当然一个接口有多个实现类的情况非常少。

4.Bean的配置(xml)

4.1Bean的创建方式

new的方式创建 这里拿创建一个UserDao对象举例 这种方式会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。 id为该对象的名字 class为该对象的实现类

<bean id="userDao" class="com.demo.dao.impl.UserDaoImpl"/>
复制代码

静态工厂创建

工厂类代码

/**
 * @Author WS Hu
 * @Date 2020/7/22 18:00
 * @Version 1.0
 */
public class FactoryBean {
    //静态工厂
    public static UserDao createUserDao(){
        return new UserDaoImpl();
    }

}
复制代码

在配置文件中添加静态工厂创建对象配置 id为该对象的名字 class为静态工厂类 factory-method为工厂中的静态方法

<!--使用静态工厂创建对象-->
    <bean id="userDao" class="com.demo.factory.FactoryBean" factory-method="createUserDao"/>

复制代码

实例化工厂创建

工厂类代码

/**
 * @Author WS Hu
 * @Date 2020/7/22 18:00
 * @Version 1.0
 */
public class FactoryBean {
        //实例工厂
    public UserDao createUserDaoSimple(){
        return new UserDaoImpl();
    }
}
复制代码

在配置文件中添加实例化工厂创建对象配置 第一个bean标签中: id为该工厂类的名字 class为实例化工厂类

第二个bean标签中: id为该对象的名字 class为实例化工厂类 factory-bean为工厂实例 factory-method为工厂中的实例化方法

 <!--使用实例工厂创建对象-->
    <bean id="factoryBean" class="com.demo.factory.FactoryBean"/>
    <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDaoSimple"/>
复制代码

4.2bean的作用范围

在Spring中,对于bean支持五种作用范围:

singleton(默认) 单例模式,即对象只创建一次, 然后一直存在
prototype 多例模式,即每次获取bean的时候,IOC 都给我们创建一个新对象request  web项目中,Spring创建一个Bean的对象,将对象存入到request域中(  同一个request获取到 的是同一个对象)
session web 项目中,Spring创建一个Bean 的对象,将对象存入到session域中
globalSession 用于分布式web开发中,创建的实例绑定全局session对象
复制代码

依赖注入(Dependency Injection,DI)

给对象中的属性赋值 依赖注入有两种方式,分别是使用构造函数和set方法

构造函数

满参构造

//满参构造
    public User(String id, String name, Date date) {
        this.id = id;
        this.name = name;
        this.date = date;
    }
复制代码

在配置文件中配置相关的值

<!--
        构造函数的依赖注入
        constructor-arg 指的是参数
        name    用于指定构造函数的形参名称
        index   用于指定构造函数的形参索引位置  一般省略
        type    用于指定构造函数的形参类型  一般省略   底层可以通过反射技术  自动获取
        value   用于给简单类型(基本类型  基本类型的包装类型  String)的变量赋值
        ref=""  用于指定一个当前容器中已经存在的bean的id
    -->
    <bean id="user" class="com.demo.domain.User">
        <constructor-arg name="id" value="1"/>
        <constructor-arg name="name" value="WSH"/>
        <constructor-arg name="date" ref="date"/>
    </bean>
    <bean id="date" class="java.util.Date"/>
复制代码

set方法

JavaBean中的set方法

public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDate(Date date) {
        this.date = date;
    }
复制代码

在配置文件中配置相关的值

<!--
    	set方法的依赖注入
    	property 指的是属性,需要注意的是属相指的是set方法名字抛去set剩下的字段
        name    用于指定构造函数的形参名称
        value   用于给简单类型(基本类型  基本类型的包装类型  String)的变量赋值
        ref=""  用于指定一个当前容器中已经存在的bean的id
    -->
<bean id="user" class="com.demo.domain.User">
        <property name="id" value="1"/>
        <property name="name" value="WSH"/>
        <property name="date" ref="date"/>
    </bean>
    <bean id="date" class="java.util.Date"/>
复制代码

IOC注解版

在IOC注解版中我们利用一些注解实现和配置文件相同的功能,省去了繁琐的配置问题。这时候配置文件中就不需要写某些配置信息了,在纯注解版中任何配置信息都不需要在配置文件中写。 首先要用注解我们要在配置文件里加一个爱声明

<!--
        组件扫描
        它要求我们制定一个基础包, Spring会去扫描这个包及其子包下的类中的注解只有被Spring扫描到的注解才会发挥作用
    -->
    <context:component-scan base-package="com.demo" />
复制代码

下面总结一些注解和应用场景 需要说明的是在web层,service层,dao层中推荐使用@Controller,@Service,@Repository这三个注解将对象存到容器中 但是在util包domain包等不属于三层的包中想要存对象一般用@Component

存对象注解

@Component@Controller @Service @Repository

	@Component
	用于实例化对象,相当于配置文件中的< bean id="" class=""/>
	它支持一个属性value,相当于xml中bean的id。如果不写,默认值为类名的首字母小写
	@Controller  @Service  @Repository
	这三个注解的功能跟@Component类似,他们分别标注在不同的层上。
	@Controller  标注在表现层的类上
	@Service     标注在业务层的类上
	@Repository  标注在持久层的类上
	推荐使用这三个,当一个类实在不好归属在这三个层上时,再使用@Component
复制代码

例如 将Account对象存入IOC容器中(Account在domain包下)

@Component
public class Account {
    private Integer aid;
    private String name;
    private Float balance;
复制代码

将AccountDaoImpl对象存入IOC容器中(dao包下)

将AccountServiceImpl对象存入IOC容器中(service包下)

@Scope

@Scope用于指定bean的作用范围(单例和多例),相当于配置文件中的< bean scope="">

@Scope用于指定bean的作用范围(单例和多例),相当于配置文件中的< bean scope=""> 
@Scope("prototype") //多例
@Scope("singleton") //单例
复制代码

@PostConstruct @PreDestroy

@PostConstruct @PreDestroy 这两个注解标注方法分别在对象的创建之后和销毁之前执行。
相当于< bean init-method="init" destroy-method="destory" /> 
复制代码

取对象

@Autowired @Resource

@Autowired
放在属性上:
表示先按照类型给属性注入值【by type】
如果IOC容器中存在多个与属性同类型的对象,则会按照属性名注入值【by name】
也可以配合@Qualifier("IOC容器中对象id")注解直接按照名称注入值
放在方法上:
表示自动执行当前方法,如果方法有参数,会自动从IOC容器中寻找同类型的对象给参数传值
也可以在参数上添加@Qualifier("IOC容器中对象id")注解按照名称寻找对象给参数传值

@Resource
只能放在属性上,表示先按照属性名匹配IOC容器中对象id给属性注入值【by name】
若没有成功,会继续根据当前属性的类型匹配IOC容器中同类型对象来注入值 【by type】
若指定了name属性@Resource(name = "对象id"),则只能按照对象id注入值
复制代码

@Value

@Value
用于简单数据类型的注入,相当于< property name="" value="" >,但通常不这么使用
此注解一般用于解析其它properties配置文件中的key值俩获取对应的value,写法如下:
@Value("${key}")
复制代码

@Configuration

@Configuration
用于指定当前类是一个 spring配置类,当创建容器时会从该类上加载注解。
复制代码

@Bean

@Bean

@Bean
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。它支持一个name属性,用于
给生成的bean取一个id。
复制代码

@ComponentScan

@ComponentScan
组件扫描注解。 相当于xml配置文件中的< context:component-scan base-package=""/
复制代码

@PropertySource

@PropertySource
用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties 配置
文件中,就可以使用此注解指定 properties 配置文件的位置。
复制代码

@Import

@Import
在一个配置类中,引入其他配置,具体写法:@Import(DaoConfig.class)
效果等于之前xml配置中的
复制代码

最后

感谢你看到这里,说的都是自己的一些看法和见解,如有不对,请指正!觉得文章对你有帮助的话不妨给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

软件设计师---钉子户 阅读详情

相关推荐

OpenHarmony系统参数权限配置避坑指南:从param get/set失败到SELinux标签实战

本文深入解析OpenHarmony系统参数权限配置的常见问题与解决方案,涵盖DAC和SELinux双重权限控制机制。通过实战案例演示如何配置`param get/set`权限,解决'Permission denied'错误,并提供三方应用访问参数的安全方案,帮助开发者高效完成系统调试与优化。

weixin_27013291的博客 450

关于class和id的优先级

css样式的使用方式 .v {background-color:red;} #v {background-color:yellow;} h1{background-color:blue;} .v .p{background-color:green;} #v .p {background-color:purple;} css样式的使用方式

duckduck10的博客 4026

【史诗级】详细阐述借助AI实现对Windows蓝屏原因进行精确定位的方法

在解决问题的过程中我决定把这一切都记录下来,并整理出一套通用的方法,方便快速精确定位引起蓝屏的真实原因。今天我的蓝屏代码是0x000000ef,而你或许是遇到另一个蓝屏代码,代码本身代表的含义不是这里的讨论重点,重要的是解决问题的底层逻辑。

sprlightning的博客 1万+

spring boot controller 构造函数_想要彻底搞懂spring源码,首先你得先搞懂Spring IOC,安排...

1.Spring概述Spring是Java应用轻量级开源框架,所谓轻量级指的是:API简单,运行时占用资源少。Spring的核心是 IOC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)。Spring一个应用框架, 提供了表现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多应用技...

weixin_39754603的博客 1856

Docker入门教程:在腾讯云轻量服务器上部署你的第一个容器化应用 (2025)

还在为“在我电脑上明明是好的”而烦恼?本篇Docker入门教程,用通俗易懂的比喻解释镜像、容器的核心概念,并手把手带你在腾讯云轻量服务器上,从运行Nginx到编写Dockerfile打包自己的Python应用,轻松掌握容器化部署。

Clownseven的博客 2086

【ElementUI】el-table列宽自适应优化方案(v-fit-columns进阶指南)

本文深入探讨了ElementUI中el-table列宽自适应插件v-fit-columns的进阶应用。针对常见的表头错位、与fixed固定列冲突等难题,提供了基于$nextTick与doLayout的黄金组合、隔离自适应区域等稳如泰山的解决方案,并分享了配置优化、性能调优及封装最佳实践,帮助开发者实现优雅且稳健的表格列宽自适应。

weixin_29011667的博客 350

spring boot @value取不到值_想要彻底搞懂spring源码?首先你得先搞懂Spring IOC,安排

1.Spring概述Spring是Java应用轻量级开源框架,所谓轻量级指的是:API简单,运行时占用资源少。 Spring的核心是 IOC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)。 Spring一个应用框架, 提供了表现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多应...

weixin_39649490的博客 146

TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片)

1 基础知识讲解 1.1 在RAM中运行还是在flash中运行指的是什么? 1.1.1 背景:程序编译完之后生成的.bin文件,.bin文件中包含代码段,代码段中全是汇编指令,而汇编指令中包含多个函数,各函数头的地址不同,如存在A函数和B函数,假设RAM地址区间是0x0000-0x8000,flash的地址区间是0xA000-0xF000,A函数要调用B函数,则A函数调用B函数的那段汇编指令中包含的是B函数头的存储地址,A函数和B函数都在flash中有存储 1.1.2 情况1:B函数是配置为在RAM中运行,

weixin_43776284的博客 8072

图解Spring源码1-Spring Ioc源码引入:什么是IoC,IoC解决了什么问题

小陈想开一家咖啡店,于是独自创业。找咖啡豆供应商、买咖啡机、招员工,样样都要自己来。开店成本很高。后来,小陈选择加盟连锁咖啡店。总部帮他对接供应商、提供咖啡机,还负责员工培训。小陈只需按流程做好咖啡服务顾客,经营轻松许多。独立开店时,小陈事事操心,就像没有 IOC,系统耦合度高,难以维护与扩展。加盟后,总部统一管理资源,小陈专注核心业务,如同引入 IOC,降低耦合度,经营变得高效。上面的故事你可能还无法对应到程序开发场景中,下面我们进行Java代码模拟。

weixin_40343837的博客 81

Cursor+Apifox MCP Server实战:5分钟搞定API自动化测试用例生成

本文详细介绍了如何利用Cursor IDE与Apifox MCP Server,在5分钟内将API文档自动转化为高质量的自动化测试用例。通过配置MCP Server建立数据桥梁,开发者可直接用自然语言指令,让AI基于真实接口规范生成可立即执行的pytest测试代码,大幅提升接口测试效率,特别适合快节奏的SaaS项目。

ooo22的博客 535

Revit+Deepseek AI插件保姆级安装教程:从零配置到一键生成模型

本文提供Revit集成Deepseek AI插件的完整安装与配置教程。从环境准备、插件获取安装,到Deepseek API密钥配置及界面集成,手把手指导用户实现从自然语言指令到三维模型的智能生成,旨在为建筑设计师带来革命性的高效工作流。

weixin_29050513的博客 1016
上一篇: 又创新作,阿里SpringBoot高阶手册爆火,简直不要太香
下一篇: Spring学习思路和环境准备,准备入门的同学一定要来看看
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值