【Spring】第一个 Spring 程序

一、Spring 简介

英文官网:Spring | Home

中文官网:Spring 中文网 官网

下载地址(5.3.9):JFrog

Spring 框架中的 jar 包

spring-core-5.3.9.jar:字节码(这个是支撑程序运行的jar包

spring-core-5.3.9-javadoc.jar:代码中的注释

spring-core-5.3.9-sources.jar:源码

JAR文件 描述
spring-aop-5.3.9.jar 这个jar 文件包含在应用中使用Spring 的AOP 特性时所需的类
spring-aspects-5.3.9.jar 提供对AspectJ的支持,以便可以方便的将面向切面的功能集成进IDE中
spring-beans-5.3.9.jar 这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion ofControl / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。
spring-context-5.3.9.jar 这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。
spring-context-indexer-5.3.9.jar 虽然类路径扫描非常快,但是Spring内部存在大量的类,添加此依赖,可以通过在编译时创建候选对象的静态列表来提高大型应用程序的启动性能。
spring-context-support-5.3.9.jar 用来提供Spring上下文的一些扩展模块,例如实现邮件服务、视图解析、缓存、定时任务调度等
spring-core-5.3.9.jar Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。
spring-expression-5.3.9.jar Spring表达式语言。
spring-instrument-5.3.9.jar Spring3.0对服务器的代理接口。
spring-jcl-5.3.9.jar Spring的日志模块。JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging"。
spring-jdbc-5.3.9.jar Spring对JDBC的支持。
spring-jms-5.3.9.jar 这个jar包提供了对JMS 1.0.2/1.1的支持类。JMS是Java消息服务。属于JavaEE规范之一。
spring-messaging-5.3.9.jar 为集成messaging api和消息协议提供支持
spring-orm-5.3.9.jar Spring集成ORM框架的支持,比如集成hibernate,mybatis等。
spring-oxm-5.3.9.jar 为主流O/X Mapping组件提供了统一层抽象和封装,OXM是Object Xml Mapping。对象和XML之间的相互转换。
spring-r2dbc-5.3.9.jar Reactive Relational Database Connectivity (关系型数据库的响应式连接) 的缩写。这个jar文件是Spring对r2dbc的支持。
spring-test-5.3.9.jar 对Junit等测试框架的简单封装。
spring-tx-5.3.9.jar 为JDBC、Hibernate、JDO、JPA、Beans等提供的一致的声明式和编程式事务管理支持。
spring-web-5.3.9.jar Spring集成MVC框架的支持,比如集成Struts等。
spring-webflux-5.3.9.jar WebFlux是 Spring5 添加的新模块,用于 web 的开发,功能和 SpringMVC 类似的,Webflux 使用当前一种比较流程响应式编程出现的框架。
spring-webmvc-5.3.9.jar SpringMVC框架的类库
spring-websocket-5.3.9.jar Spring集成WebSocket框架时使用

注意:

如果你只是想用 Spring 的 IoC 功能,仅需要引入:spring-context 即可,将这个jar包添加到 classpath 当中

如果采用 maven 只需要引入 context 的依赖即可

Spring 6

XML 复制代码
<!--Spring6 的正式版发布之前,这个仓库地址是需要的-->
<repositories>
  <repository>
    <id>repository.spring.milestone</id>
    <name>Spring Milestone Repository</name>
    <url>https://repo.spring.io/milestone</url>
  </repository>
</repositories>

<dependencies>
  <!--spring context依赖:使用的是6.0.0-M2里程碑版-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>6.0.0-M2</version>
  </dependency>
</dependencies>

Spring 5

XML 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.23</version>
</dependency>

二、第一个 Spring 程序

配置依赖

XML 复制代码
<!--
    Spring 基础的依赖
    若需要 JDBC、TX 等其他的依赖,需要再次添加
-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.23</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

实体类

java 复制代码
package org.qiu.spring.bean;

/**
 * @author 秋玄
 * @version 1.0
 * @email qiu_2022@aliyun.com
 * @project Spring
 * @package org.qiu.spring.bean
 * @date 2022-10-30-16:49
 * @since 1.0
 */
public class User {
}

编写配置文件

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- Spring配置文件 -->
    <!-- 文件名可自定义,最好存放在类路径,方便后期移植 -->

    <!-- 配置 bean,Spring 才可以管理这个对象 -->
    <!--
        bean:
            id: 这个 bean 的唯一表示,不能重复
            class: 必须填写类的全路径类名(带包名)
    -->
    <bean id="userBean" class="org.qiu.spring.bean.User"></bean>

</beans>

测试类

java 复制代码
@Test
public void testFirstSpringCode(){
    // 获取 Spring 容器对象
    // ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring配置文件的路径");

    /**
     * ApplicationContext 是一个接口
     * ApplicationContext 接口下有很多实现类,其中一个叫做: ClassPathXmlApplicationContext
     * ClassPathXmlApplicationContext 负责从类路径中加载 Spring 配置文件的对象
     *
     * new ClassPathXmlApplicationContext("spring.xml"); 的时候就会实例化对象,而不是在 getBean 的时候创建的对象
     */
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");

    // 根据 bean 的 id 获取对象
    Object user = applicationContext.getBean("userBean");
    System.out.println(user);
}

运行结果:org.qiu.spring.bean.User@5891e32e

三、第一个程序剖析

1、在 Spring 的配置文件中 id 不能重名

2、Spring 是通过调用类的无参数构造方法来创建对象的,所以要想让 Spring 给你创建对象,必须保证无参数构造方法是存在的

3、Spring 是如何创建对象的:

java 复制代码
// dom4j解析beans.xml文件,从中获取class的全限定类名
// 通过反射机制调用无参数构造方法创建对象
Class clazz = Class.forName("com.powernode.spring6.bean.User");
Object obj = clazz.newInstance();

4、创建好的对象存储到一个 Map 当中

5、Spring 配置文件的名字是随意的

6、Spring 的配置文件可以有多个,在 ClassPathXmlApplicationContext 构造方法的参数上传递文件路径即可

7、Spring 配置文件中配置的 bean 可以任意类,只要这个类不是抽象的,并且提供了无参数构造方法

8、getBean() 方法调用时,如果指定的 id 不存在时不会返回 null,而是会出现异常 NoSuchBeanDefinitionException

9、getBean() 方法返回的类型是 Object,如果访问子类的特有属性和方法时,还需要向下转型,有其它办法可以解决这个问题吗?

java 复制代码
// 指定创建对象的类型
User user = applicationContext.getBean("userBean", User.class);

10、ClassPathXmlApplicationContext 是从类路径中加载配置文件,如果没有在类路径当中,又应该如何加载配置文件呢?

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="vipBean2" class="com.powernode.spring6.bean.Vip"/>
</beans>
java 复制代码
ApplicationContext applicationContext2 = new FileSystemXmlApplicationContext("d:/spring6.xml");
Vip vip = applicationContext2.getBean("vipBean2", Vip.class);
System.out.println(vip);
  • 没有在类路径中的话,需要使用FileSystemXmlApplicationContext类进行加载配置文件

  • 这种方式较少用。一般都是将配置文件放到类路径当中,这样可移植性更强

11、ApplicationContext 的超级父接口 BeanFactory

java 复制代码
BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring.xml");
Object vipBean = beanFactory.getBean("vipBean");
System.out.println(vipBean);

BeanFactory 是 Spring 容器的超级接口

ApplicationContext 是 BeanFactory 的子接口

从 Spring5 之后,Spring 框架支持集成的日志框架是 Log4j2

如何启用日志框架:

引入 Log4j2 的依赖

XML 复制代码
<!--log4j2的依赖-->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.19.0</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j2-impl</artifactId>
  <version>2.19.0</version>
</dependency>

在类的根路径下提供 log4j2.xml 配置文件(文件名固定为:log4j2.xml,文件必须放到类根路径下)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <loggers>
        <!--
            level指定日志级别,从低到高的优先级:
                ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
        -->
        <root level="DEBUG">
            <appender-ref ref="spring6log"/>
        </root>
    </loggers>

    <appenders>
        <!--输出日志信息到控制台-->
        <console name="spring6log" target="SYSTEM_OUT">
            <!--控制日志输出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
        </console>
    </appenders>

</configuration>

使用日志框架

java 复制代码
Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
logger.info("我是一条日志消息");

一 叶 知 秋,奥 妙 玄 心

相关推荐
憨子周44 分钟前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
FIN技术铺2 小时前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
霖雨2 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
我不是星海3 小时前
1.集合体系补充(1)
java·数据结构
P.H. Infinity3 小时前
【RabbitMQ】07-业务幂等处理
java·rabbitmq·java-rabbitmq
爱吃土豆的程序员3 小时前
java XMLStreamConstants.CDATA 无法识别 <![CDATA[]]>
xml·java·cdata