-
@Author Mr.nobody
-
@Date 2021/2/27
-
@Version 1.0
*/
@ConfigurationProperties(prefix = “nobody.json”)
public class MyJsonProperties {
// Starter使用者没在配置文件中配置prefixName属性的值时的默认值
public static final String DEFAULT_PREFIX_NAME = “@”;
// Starter使用者没在配置文件中配置suffixName属性的值时的默认值
public static final String DEFAULT_SUFFIX_NAME = “@”;
private String prefixName = DEFAULT_PREFIX_NAME;
private String suffixName = DEFAULT_SUFFIX_NAME;
public String getPrefixName() {
return prefixName;
}
public void setPrefixName(String prefixName) {
this.prefixName = prefixName;
}
public String getSuffixName() {
return suffixName;
}
public void setSuffixName(String suffixName) {
this.suffixName = suffixName;
}
}
自动装配类,使用 @Configuration 和 @Bean 来进行自动装配,注入 Spring 容器中。
package com.nobody.myjson.config;
import com.nobody.myjson.service.MyJsonService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
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;
/**
-
@Description 自动装配类
-
@Author Mr.nobody
-
@Date 2021/2/27
-
@Version 1.0
*/
@Configuration // 标识此类是配置类
@ConditionalOnClass(MyJsonService.class) // 表示只有指定的class在classpath上时才能被注册
@EnableConfigurationProperties(MyJsonProperties.class) // 激活@ConfigurationProperties
public class MyJsonConfiguration {
private MyJsonProperties myJsonProperties;
// 自动注入配置类
public MyJsonConfiguration(MyJsonProperties myJsonProperties) {
this.myJsonProperties = myJsonProperties;
}
// 创建MyJsonService对象,注入到Spring容器中
@Bean
@ConditionalOnMissingBean(MyJsonService.class) // 当容器没有此bean时,才注册
public MyJsonService myJsonService() {
MyJsonService myJsonService = new MyJsonService();
myJsonService.setPrefixName(myJsonProperties.getPrefixName());
myJsonService.setSuffixName(myJsonProperties.getSuffixName());
return myJsonService;
}
}
在 src/main/resources/META-INF
目录下新建 spring.factories
文件,输入以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.nobody.myjson.config.MyJsonConfiguration
SpringBoot 项目启动时,类加载器会从 META-INF / spring.factories
加载给定类型的工厂实现的完全限定类名。也就是说类加载器得到工程中所有 jar 包中的 META-INF/spring.factories 文件资源,从而得到了一些包括自动配置相关的类的集合,然后将它们实例化,放入 Spring 容器中。
最终项目结构如下:
在开发工具 IDEA 通过 Maven 的 install
命令进行构建打包。或者在项目的目录下,打开命令行窗口,使用mvn install
命令进行构建打包。打包后,会在工程的 target 目录下生成一个 jar 包,并且在 maven 本地仓库也会生成相应的 jar 包。
经过上面几个步骤,我们自定义的 Starter 就开发好了,以下是在其他工程进行引入使用。在需要引用此 Starter 的工程的 pom.xml 文件中引入此依赖。
com.nobody
myjson-spring-boot-starter
0.0.1-SNAPSHOT
刷新依赖,就能在项目的依赖库中看到此依赖了。
展开,还能查看此 Starter 可以配置的属性项有哪些,如下:
然后在需要用到的类中进行注入使用即可。
package com.nobody.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.nobody.domain.Person;
import com.nobody.service.MyJsonService;
@RestController
@RequestMapping(“demo”)
public class DemoController {
// 注入我们Starter中的服务类
@Autowired
private MyJsonService myJsonService;
@GetMapping()
public String test() {
Person p = new Person(“Mr.nobody”, 18, “拉斯维加斯”);
// 调用服务方法
return myJsonService.objectToMyJson§;
}
}
启动项目,在浏览器中访问此接口,得到如下结果:
如果我们在 application.yml 文件中添加以下配置信息,然后再访问接口的结果如下,也验证了我们可以自定义 Starter 中默认的配置项。
nobody:
json:
prefixName: HH
suffixName: KK
当我们引入此 Starter 时,SpringBoot 会自动装配,将实例化的 bean 放入 Spring 容器。但我们是否可控制 bean 要不要实例化并放入容器呢?答案是可以做到的。
我们只需要在自动装配类或者类内的方法,通过 @ConditionalOnXXX
注解就能控制。例如如下所示,使用 Starter 使用者在他的项目的配置文件中填写 nobody.json.enable
的值为 false
,则就不会自动生成 MyJsonService 实例了。默认不填或者 nobody.json.enable
的值为 true
时,能自动生成 bean 放入容器。这样用户就能自己控制 bean 的实例化了。
// 创建MyJsonService对象,注入到Spring容器中
@Bean
@ConditionalOnProperty(name = “nobody.json.enable”, matchIfMissing = true)
@ConditionalOnMissingBean(MyJsonService.class) // 当容器没有此bean时,才注册
public MyJsonService myJsonService() {
MyJsonService myJsonService = new MyJsonService();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
面试准备+复习分享:
为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦
1711861921812)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-DAva4BSm-1711861921812)]
面试准备+复习分享:
为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦
[外链图片转存中…(img-F4RHMfCE-1711861921813)]