【海康威视面试题】自己写一个jar包供第三方引入

来自一道海康威视的面试题

初次听到这个题目,完全搞不清考察的知识点

嗐~ 我太菜了;

一通搜索后总结下这个题目;

这个知识点涉及的是spring的自动装配;spring的考察点我只看了面向切面(AOP)和依赖注入(IOC)[其实这两部分了解的也不够深入嗐~]

废话不多说,走着~

自己定义的starter需要有自己的独特功能

大致步骤

  • 引入依赖。引入自动装配类spring-boot-autoconfigure依赖
  • 编写自动装配类。满足某配置条件情况下,实例化该自动装配类提供的service;
  • 编写spring-factories配置文件。在该文件中指定自动装配类;

一、引入依赖

pom.xml

 <!--  在编译时在META-INF 下生成spring-configuration-metadata.json文件;该文件主要为idea使用,即可以通过在application.properties文件中通过ctrl+点击进入配置属性所在的类中-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

<!--        提供自动装配功能-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>

二、配置文件读取类

DemoProperties.java

/**
 * @author
 * @Description:
 *                  读取配置文件:自动配置
 * @date 2022/2/24 10:54
 */
@Component
@ConfigurationProperties(prefix = "demo")
public class DemoProperties {
    private String sayWhat;
    private String toWho;

    public String getSayWhat() {
        return sayWhat;
    }

    public void setSayWhat(String sayWhat) {
        this.sayWhat = sayWhat;
    }

    public String getToWho() {
        return toWho;
    }

    public void setToWho(String toWho) {
        this.toWho = toWho;
    }
}

配置了@ConfigurationProperties(prefix = “demo”)就可以在引入了这个jar包 的服务的配置文件中使用demo.sayWhat=""

三、服务类

自动装配类会判断classpath下是否存在该服务类;

- 存在就加载我们的自动装配类
- 不存在,就去实例化服务类的bean实例

DemoService.java

/**
 * @author qianwenqian
 * @Description:    随便定义一个Service
 * @date 2022/2/24 13:16
 */
public class DemoService {
    private String sayWhat;
    private String toWho;

    public DemoService(String sayWhat, String toWho) {
        this.sayWhat = sayWhat;
        this.toWho = toWho;
    }

    public String toSay(){
        return this.sayWhat+"!  "+this.toWho;
    }
}

四、自动装配类

@ConditionalOnProperty : 属性条件注解

它是springboot自动装配的重要工具,添加此注解表示一个类是否要被Spring上下文加载,如果满足条件则加载,若不满足条件则不加载;

配置文件:demo.isOpen = true,demo.isOpen的值等于havingValue的值,加载DemoConfig配置类;

DemoConfig.java

@Configuration
/**
 * 配置前缀、配置名字、是否存在值
 */
@ConditionalOnProperty(
        prefix = "demo",
        name = "isOpen",
        havingValue = "true"
)
public class DemoConfig {

    @Autowired
    private DemoProperties demoProperties;

    //得到配置的值
    @Bean(name = "demo")
    public DemoService demoService(){
        return new DemoService(demoProperties.getSayWhat(),demoProperties.getToWho());
    }
}

五、编写spring.factories

在项目的resources下定义一个META-INF 文件夹,并新建spring.factories文件,指定autoconfigure加载的自动装配类是哪个

# 指定autoconfigure加载的自动装配类是哪个
org.springframework.boot.autoconfigure.EnableAutoConfiguration = com.demo.starter.config.DemoConfig

六、修改pom文件打包内容

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.1.RELEASE</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

其中,<skip>true</skip>如果不增加这个,会导致maven clean install后,在其他项目中引用我们定义的这个pom时出现找不到 class文件报错信息

参考

这里说下两种打包方式

  1. maven-compiler-plugin这种方式打出的包是一个普通的jar,并不能执行;但是能被引用其中的bean,不含有boot-inf,没有依赖被打进去
  2. spring-boot-maven-plugin这种方式打出的包可执行,打好的包放在服务器上可运行;含有boot-inf,有完整的依赖包
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值