Springboot的自动装配2<自定义实现Starter> version2

我们实现一个功能内置一个实体类   

在这里插入图片描述

//配置类
@Configuration
//3. 当前的配置类中有 这个类
public class MyAutoConfiguration {
    static {
        /*静态代码块 在被加载的时候 可以标识被加载了*/
        System.out.println("MyAutoConfiguration init");
    }

    @Bean
    /*方法的返回值添加到容器中*/
    public SimpleBean simpleBean() {
        return new SimpleBean();
    }
}

------------>>>  我们这次实现的目的是为了自动装配他
@EnableAutoConfiguration // 开启 @ConfigurationProperties

@ConfigurationProperties(prefix = "simplebean")//前缀是simplebean

public class SimpleBean {
private int id;
private String name;

    public SimpleBean() {
        System.out.println("@@@@@@@@@@@+id~~~~"
                +id+"~~~~@@@@@@@@@@@+id"+name);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "SimpleBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.lagou.config.MyAutoConfiguration

在这里插入图片描述
在这里插入图片描述

  将以上信息通过maven  install 打进我们的maven 库中
之后我吧我们的jar 在这个项目的pom 中引用

在这里插入图片描述

写一个测试类~

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我此时就可以让MyAutoConfiguration  配置类生效 然后就可以
 @Bean  注入 simplebean
我可以吧simplebean   此时 我就可以自动注入到ioc 中 

呢么下来  我该怎么做到热插拔技术 就是说 我想让他生效 他就生效
不想让他生效不让他生效~ 


可以使用@ConditionalOnBean(xxx.class) 就是说容器中有xxx.class  我此时的这个配置类就不生效

在这里插入图片描述

// 在这个包下 创建好标记类  1  这个类什么都不做 只是一个标记类

public class ConfigMarker {
}

自定义注解~~~
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(ConfigMarker.class)
public @interface EnableRegisterServer {
}
//1.ConfigMarker
//2.EnableRegisterServer
//3.@ConditionalOnBean(ConfigMarker.class)
// 4. 启动类  带个@EnableRegisterServer ---->> @Import--->ConfigMarker  ---> 开启自动装配
// 5. 启动类  带个 关闭自动装配


这里更改一下 意思是容器中有ConfigMarker  这个类的话
此时的这个配置类 才可以生效 
容器中没有ConfigMarker  这个类的话
此时的这个配置类 不生效

在这里插入图片描述

//1.ConfigMarker
//2.EnableRegisterServer
//3.@ConditionalOnBean(ConfigMarker.class)
// 4. 启动类  带个@EnableRegisterServer ---->> @Import--->ConfigMarker  ---> ConditionalOnBean--->MyAutoConfiguration 配置类生效
// 5. 启动类  不带 @EnableRegisterServer -----》配置类不生效
// 大致逻辑是这样的~

重新maven install


在这里插入图片描述

这样的话  @EnableRegisterServer  这样的话才会生效~ 否则的话不会生效~
补充一点点 springboot打包
我们在springboot项目中使用maven install的 时候需要引入这个插件
但是这个插件起了个什么作用呢
pom文件中添加了“org.springframework.boot:spring-boot-maven-plugin”插件。在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。

在这里插入图片描述

https://wenku.baidu.com/view/b44ada2ff48a6529647d27284b73f242336c3187.html

可以看看这个博客
java 当中没有提供任何标准方式来加载嵌套jar文件,[嵌套jar就是
 jar中jar springboot中引入了很多的jar ]
 
如果没有加载jar文件当中的jar 也就是没有办法加载依赖 或者说环境


所以说添加  插件打包的时候(maven install) 就会把我们依赖的jar  放在   BOOT-inf-lib 目录下
并且会生成这个 MANIFEST.MF  文件

在这里插入图片描述
在这里插入图片描述

文件中的
 main-class可以帮我们 加载jar包中的jar文件 以及jar中的class ,因为他指定了一个classloader
因为他自定义一个classLoader ,自定义一个类加载器 帮我们去加载jar文件中的jar
当我们执行java-jar 执行Jar包的时候 就会运行这个jarLantch---->>加载BOOT-INF 中的/class 以及Lib来加载环境
 否则他是不会加载这些东西的
 因为当他运行java-jar 的时候, 不会运行jar中jar的

加载完毕之后  然后再通过 start-class 反射执行启动类
Springboot的自动配置 无非就是帮我们配置了第三方框架集成的bean 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值