• Idea 打包maven项目 以及spring boot 的自动配置


    1.打包maven项目

    1. 选中Java项目工程名称,在菜单中选择 File->project structure... (快捷键Ctrl+Alt+Shift+S)。

    2.在弹出的窗口中左侧选中"Artifacts",点击"+"选择jar,然后选择"from modules with dependencies"。

    3.在配置窗口中配置"Main Class"。选择“Main Class”后配置“Directory for META-INF/MAINFEST.MF”,本文中选择的项目根目录,配置完成后如下图所示,点击OK进入下一步。

    4.在弹出的窗体中选中"Build On make "(make 项目的时候会自动输出jar)

     5.以上的步骤就完成了编译时生成Jar包的配置,然后在菜单中选择Build->make project 。

    6.build success 后,去该项目的out文件夹内查找本项目的jar包

    OK,jar打好,下面才是重头戏:

    首先说下这个jar包的用处:自动获取当前项目的属性值(仅是测试,功能、业务性不强)

    接下来,如何实现呢? 这里要了解spring boot条件注解这个概念,有如下注解形式:

                                          

    @ConditionalOnBean 当容器里有指定的Bean的条件下                                                                                         
    @ConditionalOnClass   当类路径下有指定的class的条件下
    @ConditionalOnExpression 基于SpEL表达式作为判断条件
    @ConditionalOnJava 基于jvm版本作为判断条件
    @ConditionalOnJndi 在JNDI存在的条件下查找指定的位置
    @ConditionalOnMissingBean 当容器里没有指定Bean的情况下
    @ConditionalOnMissingClass 当类路径下没有指定的类的情况下
    @ConditionalOnNotWebApplication 当前项目不是web项目的情况下  
    @ConditionalOnProperty 指定的属性是否有指定的值
    @ConditionalOnResource 类路径下是否有指定的资源
    @ConditionalOnSingleCandidate 当指定的Bean在容器中只有一个,或者虽然有多个但是指定首选的Bean
    @ConditionalOnWebApplication 当前项目是web项目的条件下

    接下来,用标红的注解,做个实例吧

    首先是jar源的情况:基于spring boot框架,实现类型安全读取属性值的功能,比较简单,主要是整个流程能否顺利走通,最终看到想要的效果,这就要

    智者见智仁者见仁了,不废话,燥起来。

    基本的组织结构,拣重点  点一下

    HelloServiceAutoConfiguration

     1 package com.wm.auto;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
     5 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
     6 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
     7 import org.springframework.boot.context.properties.EnableConfigurationProperties;
     8 import org.springframework.context.annotation.Bean;
     9 import org.springframework.context.annotation.Configuration;
    10 
    11 
    12 @Configuration
    13 @EnableConfigurationProperties(HelloServiceProperties.class)
    14 @ConditionalOnClass(HelloService.class)
    15 @ConditionalOnProperty(prefix = "hello",value ="enabled",matchIfMissing = true)
    16 public class HelloServiceAutoConfiguration {
    17     @Autowired
    18     private HelloServiceProperties helloServiceProperties;
    19 
    20     @Bean
    21     @ConditionalOnMissingBean(HelloService.class)
    22     public HelloService helloService(){
    23         HelloService helloService=new HelloService();
    24         helloService.setMsg(helloServiceProperties.getMsg());
    25         return helloService;
    26     }
    27 }

    此处上面的判断条件,判断HelloService Bean是否存在,若不存在,就创建一个。

    对了,还有如何做到类型安全读取配置文件的属性值的

    HelloServiceProperties

     1 package com.wm.auto;
     2 
     3 import org.springframework.boot.context.properties.ConfigurationProperties;
     4 
     5 
     6 @ConfigurationProperties(prefix="hello")
     7 public class HelloServiceProperties {
     8     private  static final String MSG="world";
     9     private  String msg=MSG;
    10 
    11     public String getMsg() {
    12         return msg;
    13     }
    14 
    15     public void setMsg(String msg) {
    16         this.msg = msg;
    17     }
    18 
    19 }

    spring.factories   这个是个重点,是告诉引用此jar包的项目,声明了有哪些自动配置,若有多个配置,需用“,”隔开,此处的“”是为了换行后仍然能读到属性。

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=
    com.wm.auto.HelloServiceAutoConfiguration

    接下来就可以打包了,这个过程中,遇到了个问题:使用mvn install  打包到maven的本地仓库后,引用该jar的项目是由gradle构建的,用了若干方法始终无法被正常使用

    若某位大神 遇到过,并解决了,清指出问题的原因,不胜感激。

    最后就是引用jar包的项目介绍:

     1 package com.boot;
     2 
     3 import com.boot.properties.AuthorSetting;
     4 import com.wm.auto.HelloService;
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.boot.SpringApplication;
     7 import org.springframework.boot.autoconfigure.SpringBootApplication;
     8 import org.springframework.web.bind.annotation.RequestMapping;
     9 import org.springframework.web.bind.annotation.RestController;
    10 
    11 @RestController
    12 @SpringBootApplication
    13 public class Application {
    14 
    15     @Autowired
    16     public AuthorSetting authorSetting;
    17 
    18     @Autowired
    19     public HelloService helloService;
    20 
    21     @RequestMapping("/")
    22     public String index() {
    23         return authorSetting.getName() + authorSetting.getAge() + "Hello Spring Boot";
    24     }
    25 
    26     @RequestMapping("/auto-info")
    27     public String autoString() {
    28         return helloService.getMsg();
    29     }
    30 
    31     public static void main(String[] args) {
    32         SpringApplication.run(Application.class, args);
    33     }
    34 }

     至此 完成,看效果

  • 相关阅读:
    通过IDEA解决spring配置文件
    idea中xml打开方式变成file,改回来
    idea 搜索不到前端的ajax controller接口的原因
    IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度
    java 循环中使用list时,出现list中全部加入了对象导致没有实现分组的解决方案
    java 从字符串中 以单个或多个空格进行分隔 提取字符串
    idea ssm项目出现日志中文乱码,封装的json中的msg字段中文乱码(但是json封装的bean中的字段不乱码)等其他各种项目下的中文乱码解决方案
    javaweb 解决jsp中${}传递中文值到后端以及get请求中文乱码的问题
    idea 开发javaee 时,出现访问的文件和源文件不一样,没有正常更新的解决方案
    java 迭代器只遍历了一次的解决方案
  • 原文地址:https://www.cnblogs.com/meiCode/p/6549081.html
Copyright © 2020-2023  润新知