91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring-boot-starter和自定義starter的區別是什么

發布時間:2021-06-26 09:26:28 來源:億速云 閱讀:452 作者:chen 欄目:大數據

這篇文章主要介紹“spring-boot-starter和自定義starter的區別是什么”,在日常操作中,相信很多人在spring-boot-starter和自定義starter的區別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”spring-boot-starter和自定義starter的區別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

      在前面我講用spring-boot-starter-mail發郵件的時候,我側重看的是spring boot發郵件的便利性,今天,我們聊下另外一個方面,spring-boot-starter自身的結構。

1、看看官方starter的jar里面都有啥

      之前使用starter的時候,都是用了就完事了,這次發郵件的時候,好奇心上來了,點開了spring-boot-starter-mail的jar包內容,發現竟然只有一個MANIFEST.MF文件,沒有class文件,沒有配置文件,非常的簡單。

spring-boot-starter和自定義starter的區別是什么

我們看下這個MANIFEST.MF里面都有些啥

Manifest-Version: 1.0
Implementation-Title: Spring Boot Mail Starter
Automatic-Module-Name: spring.boot.starter.mail
Implementation-Version: 2.1.8.RELEASE
Built-By: Spring
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0

這個也非常的普通,比平平無奇的古天樂還要平平無奇,這不科學啊。如果只憑這個文件就能發郵件,那我早就靠收藏寫真圖片娶到新垣結衣了。肯定代碼在別的地方,在找代碼前,我們先動手自己制作一個starter。

2、突然要開始自己寫個starter

自己寫個starter也很簡單,我們先從https://start.spring.io/下載一個基本的項目結構下來,然后需要修改幾個地方。

首先是pom文件要修改,我的pom文件是這樣的

<?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>
	<groupId>com.skyblue</groupId>
	<artifactId>mystarter-spring-boot-starter</artifactId>
	<version>1.0</version>
	<name>mystarter</name>
	<description>spring boot starter demo</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>2.1.9.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.6</version>
        <optional>true</optional>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

比起原始的pom.xml,改動了這么幾個地方。

<artifactId>mystarter-spring-boot-starter</artifactId>

spring 官方的推薦寫artifactId的方法是這樣

  • 官方命名格式為: spring-boot-starter-{name}

  • 非官方建議命名格式:{name}-spring-boot-starter

所以,官方用來發mail的starter是spring-boot-starter-mail,我這邊用的就是mystarter-spring-boot-starter。

原始pom.xml會有這一段,是需要去掉的,否則打包的時候自己寫的類加不進去,jar里面都是spring boot的類

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.9.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
</parent>

另外需要加至少兩個依賴進去

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>2.1.9.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
			<scope>compile</scope>
		</dependency>
	</dependencies>

其實把兩個依賴都放在<dependencies>節點里面也行,<dependencyManagement>和<dependencies>的區別請自行搜索。

pom.xml改好了后我們需要為自己的starter寫class啦,我們這邊為了演示,就只實現打印兩個值的功能,看代碼

public interface MyStarterService {
	String getMessage();
    Integer getCode();
}

public class MyStarterServiceImpl implements MyStarterService{
	@Autowired
	private MyStarterProperties myStarterProperties;
	public String getMessage() {
		return myStarterProperties.getMessage();
	}

	public Integer getCode() {
		return myStarterProperties.getCode();
	}
}

這個接口和實現類就是簡單的返回屬性值而已,屬性值的配置文件是這樣的

@ConfigurationProperties(prefix = "mystarter")
public class MyStarterProperties {
	String message;
	int code;
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public int getCode() {
		return code;
	}
	public void setCode(int code) {
		this.code = code;
	}
}

@ConfigurationProperties注解表示MyStarterProperties 里面的參數message和code都會從配置文件里面讀取,prefix = "mystarter"表示配置文件里面參數名稱是有前綴的,前綴就是mystarter。舉個具體的例子,比如我們之前發郵件的參數也是配置在application.properties,參數的內容是這樣的

spring.mail.host=smtp.163.com
spring.mail.port=25
spring.mail.username=youname@163.com
spring.mail.password=yourpassword

里面host,port,username,password就是參數的名稱,spring.mail就是前綴。

上面這些寫好了相當于業務功能部分,現在需要把業務功能申明到spring-boot-starter體系里面去,需要靠下面這個類

@Configuration
//告訴spring容器配置文件讀取用MyStarterProperties.class
@EnableConfigurationProperties({MyStarterProperties.class})
//導入業務組件MyStarterServiceImpl
@Import(MyStarterServiceImpl.class)
public class MyStarterAutoConfiguration {
}

我用的是最簡單的方式,其實spring boot還提供了@Conditional 系列注解實現更加精確的配置加載Bean的條件,這里就不詳述了。

最后,我們需要告訴spring boot在哪里去找到這個MyStarterAutoConfiguration ,在resources/META-INF下面建一個spring.factories文件

spring-boot-starter和自定義starter的區別是什么

內容也很簡單,就一句而已

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.skyblue.mystarter.MyStarterAutoConfiguration

這樣,其實一個自定義的starter就完成了,用mvn install就可以直接生成一個starter了。

3、回頭看spring-boot-starter-mail真正的實現代碼

在給starter取名字的時候說了,官方命名格式是有固定格式的。其實官方的便利可不在名字上,而是代碼都包含在spring boot的jar里面,我們引入spring boot的依賴時,會自動加載spring-boot-autoconfigure.xxx.jar,打開這個jar,就可以看到mail的真正代碼了

spring-boot-starter和自定義starter的區別是什么

有沒有一種很熟悉的感覺,MailProperties和上面的MyStarterProperties,MailSenderAutoConfiguration和上面的MyStarterAutoConfiguration,顯然都是一樣按照spring boot starter的規則寫的,只是這個官方starter的代碼不放在starter的jar包,而是包裝到了spring-boot-autoconfigure的jar里面,我們看下MailSenderAutoConfiguration的源代碼,可以看到它就用到了@Configuration、@EnableConfigurationProperties、@Import,還用到了我們沒用到的@Conditional注解

@Configuration
@ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
@ConditionalOnMissingBean(MailSender.class)
@Conditional(MailSenderCondition.class)
@EnableConfigurationProperties(MailProperties.class)
@Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
public class MailSenderAutoConfiguration {

	/**
	 * Condition to trigger the creation of a {@link MailSender}. This kicks in if either
	 * the host or jndi name property is set.
	 */
	static class MailSenderCondition extends AnyNestedCondition {

		MailSenderCondition() {
			super(ConfigurationPhase.PARSE_CONFIGURATION);
		}

		@ConditionalOnProperty(prefix = "spring.mail", name = "host")
		static class HostProperty {

		}

		@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
		static class JndiNameProperty {

		}

	}

}

還有一個spring.factories文件,也可以在spring-boot-autoconfigure.jar里面找到

spring-boot-starter和自定義starter的區別是什么

在里面,我們可以看到完整的spring boot官方starter的AutoConfiguration類列表

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration,\
......

我這邊就不全列出來了,大家根據這個去找需要的官方starter就比較方便了。

4、猛回頭我們調用下我們的自定義starter

我們另外用https://start.spring.io/再創建一個項目,然后在pom.xml里面加載starter的依賴

<dependency>
			<groupId>com.skyblue</groupId>
			<artifactId>mystart</artifactId>
			<version>1.0</version>
			<type>jar</type>
			<scope>system</scope>
			<systemPath>D:\\workspace\\mystart\\target\\mystarter-spring-boot-starter-1.0.jar</systemPath>
		</dependency>

我為了圖方便,就直接用pom.xml調用了本地打包的starter包,如果有maven的私服,就可以正常引入。配置application.properties文件

mystarter.message=hello world!
mystarter.code=42

寫一個調用starter的類

@Service
public class TestService {

    @Resource
    private MyStarterService myStarterService;

    public void message() {
        System.out.println("code:" + myStarterService.getCode());
        System.out.println("message:" + myStarterService.getMessage());
    }
}

啟動spring boot 查看結果

@SpringBootApplication
public class StartdemoApplication {

	public static void main(String[] args) {
		ApplicationContext context = SpringApplication.run(StartdemoApplication.class, args);
		((TestService)context.getBean("testService")).message();
	}

}

console可以看到打印出來的message和code

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.9.RELEASE)

2019-10-10 22:13:49.521  INFO 21952 --- [           main] c.w.startdemo.StartdemoApplication       : Starting StartdemoApplication on skyblue with PID 21952 (D:\workspace\startdemo\target\classes started by wphmo in D:\workspace\startdemo)
2019-10-10 22:13:49.527  INFO 21952 --- [           main] c.w.startdemo.StartdemoApplication       : No active profile set, falling back to default profiles: default
2019-10-10 22:13:50.405  INFO 21952 --- [           main] c.w.startdemo.StartdemoApplication       : Started StartdemoApplication in 1.353 seconds (JVM running for 1.983)
code:42
message:hello world!

這樣,一個完整的自定義starter就運行成功了。

到此,關于“spring-boot-starter和自定義starter的區別是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

罗源县| 故城县| 兴和县| 黄平县| 梧州市| 长顺县| 镇雄县| 陆丰市| 阳新县| 芜湖市| 嘉善县| 琼中| 吐鲁番市| 五河县| 桓仁| 丰县| 台前县| 措美县| 育儿| 大名县| 铜鼓县| 汝城县| 三穗县| 东乌| 六枝特区| 阿勒泰市| 张北县| 彰武县| 安新县| 鄂温| 华宁县| 庆元县| 弋阳县| 延边| 原阳县| 辉县市| 科尔| 周口市| 漾濞| 大英县| 永嘉县|