Spring5.3.X源码搭建

483 阅读3分钟

Spring5.3.X源码环境搭建

一、准备阶段

Spring5.3.X

JDK11:www.oracle.com/java/techno…

Gradel:7.5.1:gradle.org/releases/

IDEA

克隆代码

Gitee:gitee.com/mirrors/spr…

GitHub:github.com/spring-proj…

具体方法不再赘述

二、修改配置

2.1、修改Gradle配置

  • 修改 源码根目录下settings.gradle 文件,添加上阿里云的 maven 仓库
maven { url "https://maven.aliyun.com/repository/public" }

image-20240201091441411.png

  • 修改 源码根目录下的build.gradle文件,添加上阿里云的 maven 仓库
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}

image-20240201091508636.png

2.2、修改idea Gradle配置

image-20240201091649685.png ​ 导入spring5源码的时候,会自动下载gradle的版本,建议大家直接让idea去拉取gradle的版本(我们配置了阿里云镜像,大概十几分钟),gradle的版本和spring5的版本不匹配,会有各种各样的问题,建议大家这么操作。

2.2.1 本地下载

​ 这一步一定要注意一点,你的gradle版本不要自己去搜索最新版本的安装,一定要按照你clone下来的代码中官方所用的版本来,具体到这里,在clone下来的代码对应分支的gradle包下,有一个gradle-wrapper.properties文件中的如下参数指定:

image-20240201091943334.png

2.3、导入依赖

​ 此时可以导入Gradle的依赖

image-20240201092342248.png

2.3.1、异常情况

  • 出现'io.spring.gradle-enterprise-conventions' version '0.0.2' 相关异常的话,可以直接在根目录的build.gradle注释掉它:

image-20240201092439869.png

  • Kotlin: warnings found and -Weeror specified

    缺少cglib、objenesis包,解决步骤如下:双击加载cglibRepackJar和objenesisRepackJar;

image-20240201092600012.png

若上述操作后,依旧报错,可使用如下强制措施,关闭Kotlin的-Weeror校验,删除-Weeror。

format,png.png !!!!!如果依旧报错,注释掉Spring-beans.gradle配置文件的 options.compilerArgs += "-Werror"

image-20240201092919932.png

三、测试阶段

1、使用gradle创建一个新模块

jdk一定要和项目的jdk相同!!!

image-20240201093043736.png

2、在Resource目录下创建beans.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 class="com.miller.test.bean.Person" id="person">
		<property name="name" value="张三"/>
	</bean>


	<bean class="com.miller.test.bean.Cat" id="cat" >
<!--		<constructor-arg-->
		<property name="name" value="张三的猫"/>
 	</bean>
<!--	xml  转为 BeanDefinition 这个java对象-->

<!--	<import resource=""-->
</beans>

3、新建一个person类

package com.miller.test.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;
import org.springframework.stereotype.Component;


/**
 * Aware接口;帮我们装配Spring底层的一些组件
 * 1、Bean的功能增强全部都是有 BeanPostProcessor+InitializingBean  (合起来完成的)
 * 2、骚操作就是 BeanPostProcessor+InitializingBean
 *
 * 你猜Autowired是怎么完成的
 *
 */
@Component
public class Person implements ApplicationContextAware, MessageSourceAware {

//	@Autowired
	ApplicationContext context;  //可以要到ioc容器
	MessageSource messageSource;




	public Person(){
		System.out.println("person创建....");
	}
//
//	public ApplicationContext getContext() {
//		return context;
//	}


	private String name;

//	@Autowired  依赖的组件是多实例就不能Autowired
	private Cat cat;



	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}



	@Autowired  //去发现一下.....
	public void setCat(Cat cat) {
		this.cat = cat;
	}



	//
	@Lookup  //去容器中找。@Bean的这种方式注册的Person @Lookup不生效
	public Cat getCat() {
		return cat;
	}

	@Override
	public String toString() {
		return "Person{" +
				"name='" + name + '\'' +
				'}';
	}

	public ApplicationContext getContext() {
		return context;
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		//利用回调机制,把ioc容器传入
		this.context = applicationContext;

	}

	@Override
	public void setMessageSource(MessageSource messageSource) {
		this.messageSource = messageSource;
	}
}

4、创建一个main方法

package com.miller.test;

import com.miller.test.bean.Person;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;


public class MainTest {

	public static void main(String[] args) throws IOException {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
		Person bean = context.getBean(Person.class);
		System.out.println(bean);

	}
}

四、大功告成

​ 执行main方法,等待一段时间,第一次编译比较慢。。。。。

​ 如果出现以下输出,说明搭建成功,剩下的就是一入源码深似海,从此Spring不再是路人。。。

image-20240201093638648.png