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

相关推荐
Hamm3 分钟前
MCP 很火,来看看我们直接给后台管理系统上一个 MCP?
后端·llm·mcp
bobz96510 分钟前
软件 ipsec 对接 h3c 防火墙 ipsec 对上了一半
后端
ramsey1723 分钟前
Jmeter-RSA加密、解密、加签、验签
java·开发语言·python
Asthenia041228 分钟前
Java线程:如何防止虚假唤醒?从简单到复杂的探索之旅
后端
Asthenia041235 分钟前
@Transactional 之TransactionAspectSupport与TransactionManager:如何在不抛出异常的情况下实现事务回滚
后端
marzdata_lily1 小时前
从零到上线!7天搭建高并发体育比分网站全记录(附Java+Vue开源代码)
前端·后端
程序视点1 小时前
重磅消息!Eclipse正式上线GitHub Copilot!
java·后端·github copilot
小君1 小时前
让 Cursor 更加聪明
前端·人工智能·后端
百事皆可乐1 小时前
分布式系统生成全局唯一ID解决方案
后端
宋发元1 小时前
基于全局分析SpringCloud各个组件所解决的问题?
后端·spring·spring cloud