Starter的准备工作
因为需要一个starter和一个autoconfigure,其中starter引用着autoconfigure
用Spring Init新建一个项目
pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.atguigu</groupId>
<artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>atguigu-hello-spring-boot-starter-autoconfigure</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
目录结构
代码如下
package com.atguigu.hello.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("atguigu.hello")
public class HelloProperties {
private String prefix;
private String suffix;
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
package com.atguigu.hello.auto;
import com.atguigu.hello.bean.HelloProperties;
import com.atguigu.hello.service.HelloService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
//默认放在容器中,并绑定配置文件
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
@ConditionalOnMissingBean(HelloService.class)
@Bean
public HelloService helloService(){
HelloService helloService = new HelloService();
return helloService;
}
}
package com.atguigu.hello.service;
import com.atguigu.hello.bean.HelloProperties;
import org.springframework.beans.factory.annotation.Autowired;
/**
* 默认不要放在容器中
*/
public class HelloService {
@Autowired
HelloProperties helloProperties;
public String sayHello(String userName){
return helloProperties.getPrefix() + ": " + userName + ">>" + helloProperties.getSuffix();
}
}
在resources下建一个META-INF/spring.factories
指定加载的autoconfig,因为spring启动默认会加载该目录下的properties文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.atguigu.hello.auto.HelloServiceAutoConfiguration
maven -> clean 和 install 一下
以maven新建一个项目
引入刚才autoconfig的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>atguigu-hello-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
目录结构
maven -> clean 和 install 一下
用spring init新建一个测试用的project
添加web依赖
引入自定义starter
pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>atguigu-hello-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
application.properties新建配置属性
#atguigu.hello.prefix=卡卡罗特
#atguigu.hello.suffix=超级赛亚人
#
atguigu.hello.prefix=我日
atguigu.hello.suffix=妈的
#atguigu.hello.prefix=whatthefuck
#atguigu.hello.suffix=shit
#server.servlet.encoding.charset=UTF-8
#server.servlet.encoding.force=true
#server.servlet.encoding.enabled=true
banner.charset=UTF-8
#server.tomcat.uri-encoding=UTF-8
#server.servlet.encoding.charset=UTF-8
#server.servlet.encoding.enabled=true
#server.servlet.encoding.force=true
#spring.messages.encoding=UTF-8
代码
package com.atguigu.controller;
import com.atguigu.hello.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@Value("${atguigu.hello.prefix}")
String prefix;
@GetMapping(value = "/hello")
public String sayHello(){
System.out.println(prefix + " prefix");
return helloService.sayHello("贝吉塔");
}
}
下面这个不写也可以,这个是覆盖了starter里边的HelloService,自定义的HelloService
package com.atguigu.config;
import com.atguigu.hello.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public HelloService helloService(){
HelloService helloService = new HelloService();
return helloService;
}
}
@SpringBootApplication
public class Boot09HelloTestApplication {
public static void main(String[] args) {
SpringApplication.run(Boot09HelloTestApplication.class, args);
}
}
启动项目测试访问
遇到的问题
当我在application.properties设置中文时老是出现乱码
把这个勾上,但是光勾这个不太好使
还需要在applicaiton.properties中添加配置
banner.charset=UTF-8
#server.tomcat.uri-encoding=UTF-8
#server.servlet.encoding.charset=UTF-8
#server.servlet.encoding.enabled=true
#server.servlet.encoding.force=true
#spring.messages.encoding=UTF-8