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

相关推荐
默 语4 小时前
Spring-AI vs LangChain4J:Java生态的AI框架选型指南
java·人工智能·spring·ai·langchain·langchain4j·spring-ai
紫璨月4 小时前
RequestContextHolder分析
后端
kk哥88994 小时前
springboot静态资源的核心映射规则
java·spring boot·后端
老毛肚4 小时前
Java两种代理模式详解
java·开发语言·代理模式
要站在顶端4 小时前
Jenkins PR编号提取&环境变量赋值问题总结
java·servlet·jenkins
PieroPC4 小时前
Nicegui 组件放在页面中间
前端·后端
愚公移码4 小时前
蓝凌EKP产品:Hibernate 中 SessionFactory、Session 与事务的关系
java·数据库·hibernate·蓝凌
踏浪无痕4 小时前
自定义 ClassLoader 动态加载:不重启就能加载新代码?
后端·面试·架构
lomocode4 小时前
改一个需求动 23 处代码?你可能踩进了这个坑
后端·设计模式
踏浪无痕4 小时前
别重蹈我们的覆辙:脚本引擎选错的两年代价
后端·面试·架构