Spring学习之路:环境搭建、核心API与配置文件细节

1.软件版本

1.JDK 1.8+

2.Maven3.5+

3.IDEA2018+

4.SpringFramework 5.1.5

官方网站 www.spring.io

2.环境搭建

  • Spring的jar包

#设置 pom依赖

可以去Maven中央仓库

复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.4.RELEASE</version>
</dependency>
  • Spring的配置文件

1.配置文件的放置位置:任意位置,没有硬性要求

2.配置文件命名: 建议 applicationContext.xml

思考:日后应用Spring配置框架时,需要进行配置文件路径的设置。

3.Spring的核心API

  • ApplicationContext

作用:Spring提供的ApplicationContext这个工厂,用于对象的创建

好处:解耦合

ApplicationContext接口类型

接口:屏蔽实现的类型

(思考:为什么用接口类型:设计工厂时,考虑到工厂可能应用在不同的开发场景下,不同开发场景下有各自的特点,定义为接口,屏蔽不同工厂之间的差异)

非Web环境:ClassPathXmlApplicationContext(Main junit单元测试)

web环境:XmlWebApplicationContext(web应用)

  • ApplicationContext重量级资源(对象占用比较多)

1.ApplicationContext工厂对象占用大量内存

2.不会频繁创建对象:一个应用创建一个工厂对象

思考:这种重量级只创建一个对象,可以被多线程资源,说明这种重量级资源时一定是线程安全的

4.程序开发

1.创建类型

2.配置文件的配置 applicationContext.xml

3.配置工厂类 获得对象

ApplicationContext

-ClassPathXmlApplicationContext

复制代码
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/applicationContext.xml"); /获得工厂
Person person =(Person)applicationContext.getBean("person");//强制类型转换 通过工厂 创建对象

5.细节分析

  • 名词解释

Spring工厂创建的对象,叫做bean或者组件(componet)

  • Spring工厂的相关方法
java 复制代码
 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/applicationContext.xml");
//        Person person= applicationContext.getBean("person",Person.class);
//        System.out.println(person);

        //用该方法获得对象 要求当前Spring的配置文件中,只能有一个<bean class是Person类型
//        Person person= applicationContext.getBean(Person.class);//不建议这种方式
//        System.out.println(person);


        //获取的是 Spring工厂配置文件中所有Bean标签的id值
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for(String beanDefinitionName:beanDefinitionNames){
            System.out.println(beanDefinitionName);
        }

        String[] beanNamesForType = applicationContext.getBeanNamesForType(Person.class);
        for (String beanName:beanNamesForType){
            System.out.println(beanName);
        }
  • 配置文件中的细节

1.只配置class属性

<bean class=""/>

a)上述这种配置 Spring有默认的id值

b)应用场景:如果这个bean只需使用一次 那么就可以省略id值

如果这个bean会使用多次,或者被bean引用则需要设置id值

2.name属性

作用:用于在Spring的配置文件中,为Bean对象定义别名

相同:

1.application.getBean("id|name")->object'

2.<bean id="" class=""

等效

<bean name="" class=""

区别:

1.别名可以定义多个,id属性只能有一个

2.application.containsBeanDefinition("")该方法智能判断id不能判断name

application.containsBean都可以判断​​​​

6.Spring工厂底层实现原理(简易版)

Spring框架

1.通过ClassPathXmlApplicationContext工厂读取配置文件的信息

ApplicationContext application=new ClassPathXmlApplicationContext("配置文件地址");

2.获取bean标签的相关信息 包括id以及class

并通过反射的方式创建对象

Class<?> clazz=Class.forName(class的值)

id的值=clazz.new instance();

3.通过反射的方式创建对象就等效于

Person person=new Person();

注意:

我们如果把Person类的构造方法声明为私有的,也是可以调用的(底层通过反射可以调用一个类型的私有属性和方法)

7.思考

问题:未来开发过程中,是不是所有对象,都会交给Spring工厂来创建呢?

理论上来说是的,但是有特例:实体对象(entity)是不会交给Spring创建,由持久层框架创建。由于实体对象的创建涉及数据库的查询、映射和缓存,因此 Spring 不会直接管理它们,而是交给持久层框架负责持久化操作。

相关推荐
shark_chili4 分钟前
Mac键盘快捷键终极指南:从基础配置到效率工具,打造专属开发环境
后端
Hy行者勇哥10 分钟前
物联网软件开发过程中,数据流图(DFD),用例图,类图,活动图,序列图,状态图,实体关系图(ERD),BPMN(业务流程建模)详解分析
java·物联网·struts
Miracle65815 分钟前
从 0 到 1 开发校园二手交易系统:飞算 JavaAI 全流程实战
java
杨杨杨大侠17 分钟前
04 - 步骤执行器设计 🔧
后端·workflow
岁月宁静17 分钟前
软件开发核心流程全景解析 —— 基于 AI 多模态项目实践
前端·人工智能·后端
A尘埃31 分钟前
Java+Python混合微服务OCR系统设计
java·python·微服务·混合
bobz96536 分钟前
ovn db schema 22.12 vs 24.03
后端
卓伊凡37 分钟前
复杂项目即时通讯从android 5升级android x后遗症之解决报错 #10 java.lang.NullPointerException-优雅草卓伊凡|
前端·后端
dl74339 分钟前
一文看懂spring扫描bean的过程
后端
柑木42 分钟前
密码学-基础理论-DiffieHellman密钥交换
后端·安全