(1)配置项方法
src->main->resources->application.yml文件内容
spring:
application:
name: mytest
mandatory-file-encoding: GBK
http:
encoding:
enabled: ture
charset: GBK
server:
Port: 9090
myConfig:
myObject:
myName: zhangsan
myAge: 20
调用自己写的配置项myConfig方法
import org.springframework.beans.factory.annotation.Value;
@RestController
@RequestMapping(value = "/api", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class MyController {
@Value("${myConfig.myObject.myName}")
private String myName;
@Value("${myConfig.myObject.myAge}")
private int myAge;
System.out.println(this.myName);
System.out.println(this.myAge);
(2)远程git仓库
(3)写一个类
3.1 src->java->创建包com.shengsiyuan.boot.config ->创建类->MyConfigBean.java
package com.shengsiyuan.boot.config;
import org.springframework.beans.factory.annotation.Value;
public class MyConfigBean {
@Value("${myConfig.myObject.myName}")
private String myName;
@Value("${myConfig.myObject.myAge}")
private String myAge;
public String getMyName() {
return myName;
}
public void setMyName(String myName) {
this.myName = myName;
}
public String getMyAge() {
return myAge;
}
public void setMyAge(String myAge) {
this.myAge = myAge;
}
}
3.2 src->java->创建包com.shengsiyuan.boot.config ->创建类->MyConfig.java
package com.shengsiyuan.boot.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig{
@Bean
public MyConfigBean myConfigBean(){
return new MyConfigBean();
}
}
在Controller.java中调用
@Autowired
private MyConfigBean myConfigBean;
System.out.println("---------------------------");
System.out.println(this.myConfigBean.getMyName());
System.out.println(this.myConfigBean.getMyAge());
System.out.println("---------------------------");
之后打包
E:\spring_lecture>gradle bootJar
打包文件在build->libs->spring_lecture-1.0.jar中
java -jar spring_lecture-1.0.jar
unzip spring_lecture-1.0.jar -d ./spring_lecture
build.gradle文件中
buildscript {
ext{
springBootVersion='2.2.5.RELEASE'
}
repositories {
maven { url 'https://plugins.gradle.org/m2/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
mavenCentral()
}
dependencies {
classpath(
"org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}",
"io.spring.gradle:dependency-management-plugin:1.0.9.RELEASE"
)
}
}
apply {
plugin("java")
plugin("maven")
plugin("idea")
plugin("org.springframework.boot")
plugin("io.spring.dependency-management")
}
group 'com.shengsiyuan'
version '1.0'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
maven { url 'https://plugins.gradle.org/m2/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
mavenCentral()
}
dependencies {
compile(
"org.springframework.boot:spring-boot-starter-web",
"org.springframework.boot:spring-boot-loader" //打包加载相关类有关,要加载进来
)
}
@Override注解
SE5新增加 @ Override注解,它并不是关键字,但是可以把它当作关键字使用。当你想要覆写(重写)
某个方法时,可以选择添加这个注解,在你不留心重载而并非覆写了该方法时,编译器就会生成一条错误信息。
重载:重载的时候,方法名要一样,但是参数类型或个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
覆写(重写):若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
举例(引自海涛zht666):在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性。
@Override
public void onCreate(Bundle savedInstanceState)
{…….}
这种写法是正确的,如果你写成:
@Override
public void oncreate(Bundle savedInstanceState)
{…….}
编译器会报如下错误:The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以确保你正确重写onCreate方法(因为oncreate应该为onCreate)。
而如果你不加@Override,则编译器将不会检测出错误,而是会认为你为子类定义了一个新方法:oncreate
源码解析
External Libraries->Gradle:org.springframework.boot:spring-boot-loader:2.2.5.RELEASE
->Spring-boot-loader-2.2.5.RELEASE.jar->JarLauncher文件内容如下
------------------------------------------------------------------------------------
/*
* Copyright 2012-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.loader;
import org.springframework.boot.loader.archive.Archive;
/**这是一个启动器,用来启动Jar文件,依赖的Jar位于/BOOT-INF/lib目录下,
* 工程应用类是被包含在/BOOT-INF/classes目录下
* {@link Launcher} for JAR based archives. This launcher assumes that dependency jars are
* included inside a {@code /BOOT-INF/lib} directory and that application classes are
* included inside a {@code /BOOT-INF/classes} directory.
*
* @author Phillip Webb
* @author Andy Wilkinson
* @since 1.0.0
*/
//JarLauncher 继承了一个可执行的归档的启动器
public class JarLauncher extends ExecutableArchiveLauncher {
//定义了两个final的字符串常量,字符串值代表两个目录
static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";
static final String BOOT_INF_LIB = "BOOT-INF/lib/";
public JarLauncher() {
}
protected JarLauncher(Archive archive) {
super(archive);
}
@Override
protected boolean isNestedArchive(Archive.Entry entry) {
if (entry.isDirectory()) { //如果是一个路径,尝试加载BOOT_INF_CLASSES
return entry.getName().equals(BOOT_INF_CLASSES);
}
return entry.getName().startsWith(BOOT_INF_LIB);
}
// main方法,抛出一个异常,真正的启动代码是new JarLauncher().launch
//包含jar 包和war包
public static void main(String[] args) throws Exception {
new JarLauncher().launch(args);
}
}
Launcher.java中
public abstract class Launcher{
protected void launch(String[] args) throws Exception{
//抽象方法getClassPathArchives返回归档文件,用于构建类路径
ClassLoader classLoader = createClassLoader(getClassPathArchives());//类加载器
}
}}
来源:CSDN
作者:张金玉
链接:https://blog.csdn.net/xsjzdrxsjzdr/article/details/104608876