我们实现一个功能内置一个实体类
//配置类
@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