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 不会直接管理它们,而是交给持久层框架负责持久化操作。

相关推荐
事已至此先睡覺吧13 小时前
第三篇:Java 流程控制详解:条件判断、循环与跳转语句
java·开发语言
毕业设计70313 小时前
(免费领源码) SpringBoot 游戏交易平台17600-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·spring boot·mysql·决策树·mybatis·idea·推荐算法
一 乐13 小时前
自习室座位预约管理系统|基于springboot + vue自习室座位预约管理系统(源码+数据库+文档)
java·vue.js·spring boot
行百里er13 小时前
轻量级 Spring 监测工具——Spring Insight 发布了
spring boot·后端·监控
此时不提桶,更待何时14 小时前
02-02-B-AQS与JUC锁面试与生产事故实战
java
音符犹如代码14 小时前
Kafka 接入 AI 的三条路线:MCP 提案、会话记忆与实时上下文
java·大数据·ai·kafka
vx_BS8133014 小时前
【项目编号:project51629】Spring Boot 乡村自来水缴费系统:把抄表、水费生成与在线缴费做成一条数字化闭环
java·spring boot·eclipse·tomcat·maven
程序员阿黄14 小时前
基于 Django 与 Vue 3 的智能实验室预约系统设计与实现
后端·python·mysql·django·vue·毕设
qq_2695067514 小时前
第29课-Servlet基础
java
光影少年14 小时前
Koa 为什么使用洋葱模型
后端·node.js·koa