前提:源码导入正常,创建模块出现问题(配置文件名、依赖引入)。
注意版本: spring5.3.x (踩过坑,不同版本问题不一致。。。)
新建完成,使用编写build.gradle引入依赖后 reimport gradle project部分代码爆红(找不到依赖)。
出现场景如下:
新建模块如下结构:
1)源码下载
2)源码导入
(此处不多说,下载、导入、改镜像等网上可以查找到很多spring源码模块教程)。
从新建调试模块开始
项目根目录右键 -> new -> module -> gradle
目录结构如下:
Application.java
package xyz.niyin.application;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import xyz.niyin.bean.HelloWorld;
final class Application {
private Application(){}
public static void main(String[] args) {
//1. 创建 Spring 的 IOC 容器
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//2. 从 IOC 容器中获取 bean 的实例
HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
// 根据类型来获取 bean 的实例: 要求在 IOC 容器中只有一个与之类型匹配的 bean, 若有多个则会抛出异常.
// 一般情况下, 该方法可用, 因为一般情况下, 在一个 IOC 容器中一个类型对应的 bean 也只有一个.
// HelloWorld helloWorld1 = ctx.getBean(HelloWorld.class);
//3. 使用 bean
helloWorld.hello();
}
}
HelloWorld.java
package xyz.niyin.bean;
public class HelloWorld {
private String user;
public HelloWorld() {
System.out.println("HelloWorld's constructor...");
}
public void setUser(String user) {
System.out.println("setUser:" + user);
this.user = user;
}
public HelloWorld(String user) {
this.user = user;
}
public void hello(){
System.out.println("Hello: " + this.user);
}
}
applicationContext.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 https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置一个 bean -->
<bean id="helloWorld" class="xyz.niyin.bean.HelloWorld">
<!-- 为属性赋值 -->
<property name="user" value="Jerry"></property>
</bean>
</beans>
build.gradle (新建原始状态,注意配置文件名。。坑。。坑。。坑。。,后面有说)
plugins {
id 'java'
}
group 'org.springframework'
version '5.3.21-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
根据网上很多教程( build.gradle 引入依赖):(注意配置实则不是以下这样,坑。。坑。。坑。。。后面有解释)
// add dependencies
dependencies {
compile(project(":spring-beans"))
compile(project(":spring-context"))
testCompile group: 'junit', name: 'junit', version: '4.12'
}
当实启动类Application、实体类Helloworld、xml文件,build.gradle依赖成功引入。
好了,当你觉得大功告成, reimport gradle project等待构建成功。
此时,熟悉的红字报错出现了(坑出现了,当我找了很多很多网上的述说都已经结束了)。
经过一次次的尝试,把问题解决了,做一下记录,避免再次踩坑。
注意: 针对spring5.3.x源码版本。(踩过坑,拿别的版本方案放到5.3,希望其他版本的不要照搬,可做参考)
1)注意点1
新建项目时配置文件默认为build.gradle(其他版应该不会报错)。
在5.3.x版本,项目编译能通过,但是,当使用依赖项时爆红。
原因:.gradle前缀需要与模块名一致,如下模块名为spring-ny,配置文件名需为spring-ny.gradle(而不是默认的build.gradle),此处需要修改。
2)注意点2
当你修改完编译,依然还有问题等着(●’◡’●)。。。。
根据网上很多教程的方法引入依赖如下:
当你查看了很多篇文章,很多个教程,都是如此,没毛病,都是这样,应该没问题,肯定是别的问题,疯狂找,重新创建项目等一顿操作,还是错错错。。。。(注意配置不是以下这样)
// add dependencies
dependencies {
compile(project(":spring-beans"))
compile(project(":spring-context"))
testCompile group: 'junit', name: 'junit', version: '4.12'
}
还好,问题找到了:
原来新版本关键字做了替换
使用implementation、api, 代替compile ,
testImplementation 代替testCompile
androidTestImplementation 代替 androidTestCompile
所以,配置文件不是前面这么写,而是使用api、testImplementation等新替代的词(又是踩了还多次坑各种尝试查找才发现问题)。
正确配置如下:即原来的compile需要使用api替代。
plugins {
id 'java'
}
group 'org.springframework'
version '5.3.21-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
api(project(":spring-context"))
api(group: 'junit', name: 'junit', version: '4.12')
}
好了,折腾了好久,到此处终于在spring源码中创建了一个自己的模块。
再提醒一次,此处针对spring5.3.x源码版本,具体版本请勿照搬,且此处只记录了一种解决方案,并不代表最优方案。