springboot 自动装配:
方案一:@ComponentScan 组件扫描
@ComponentScan({"com.example","com.itheima"}) @SpringBootApplication public class SpringbootWebConfig2Application{}
方案二:@Import 导入。使用 @Import 导入的类会被 Spring 加载到 IOC 容器中,导入形式主要有以下几种:
------------------------------------------------------ HeaderConfig.java @Configuration public class HeaderConfig { @Bean public HeaderParser headerParser(){ return new HeaderParser(); } @Bean public HeaderGenerator headerGenerator(){ return new HeaderGenerator(); } } ------------------------------------------------------ TokenParser.java @Component public class TokenParser { public void parse(){ System.out.println("TokenParser ... parse ..."); } } ------------------------------------------------------ MyImportSelector.java public class MyImportSelector implements ImportSelector { public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.example.HeaderConfig"}; } } ------------------------------------------------------ 1、导入 普通类 在启动类中加了@Import 注解之后,TokenParser类中加不加@Component 注解都可以将这个类直接交给IOC容器管理 ------------------------------------------------------ @Import({TokenParser.class}) @SpringBootApplication public class SpringbootWebConfig2Application{} ------------------------------------------------------ 2、导入 配置类 配置类导入进来之后,配置类中所有的bean对象都会加载到IOC容器当中, 如HeaderConfig类中声明的 bean 的 HeaderParser 和 HeaderGenerator 也会交给IOC管理 ------------------------------------------------------ @Import({HeaderConfig.java}) @SpringBootApplication public class SpringbootWebConfig2Application{} ------------------------------------------------------ 3、导入 ImportSelector 接口的实现类 ImportSelector是Spring框架中的一个接口,它用于实现在@Configuration配置类中选择性地导入需要注册到IoC容器中的bean。 在一些复杂的用例中,我们可能需要根据某些条件来动态地决定使用哪些Bean。此时,就可以使用ImportSelector接口来注册所需的Bean定义, 并将其返回给IoC容器进行统一管理。具体而言,使用@Import注解加上实现ImportSelector接口的类,就可以实现动态注册Bean的目的。 HeaderConfig类中声明的 bean 的 HeaderParser 和 HeaderGenerator 也会交给IOC管理 ------------------------------------------------------ @Import({MyImportSelector.java}) @SpringBootApplication public class SpringbootWebConfig2Application{} ------------------------------------------------------ 4、EnableXxxx注解,封装@Import 注解,然后@Import 后面再来指定要导入哪些 bean 或者哪些配置类 ------------------------------------------------------ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Import(MyImportSelector.class) public @interface EnableHeaderConfig { } ------------------------------------------------------ @Import中导入了 ImportSelector 接口的实现类 MyImportSelector.class, 而在 MyImportSelector.class 中就指定了要导入哪些配置类和bean 第三方依赖当中提供了这个注解之后,如果要开启第三方依赖的自动配置功能,我们就不用去记要导入哪些bean和哪些配置类了, 直接加 @EnableHeaderConfig 就可以了 Springboot在启动的时候会自动加载 META-INF/spring.factories 和 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件当中所配置的信息, 当信息加载出来之后,会封装到 List<String> configurations 当中, 而List集合中的内容又会封装到 String[] selectImports 当中,而String数组中封装的数据,最终就是加载到IOC容器当中的 bean 或 配置类
自动配置原理:
@SpringBootApplication 中封装了 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 而@EnableAutoConfiguration 中,封装了 @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) AutoConfigurationImportSelector.class 是 ImportSelector 接口的实现类, 这个实现类中实现了ImportSelector 接口中的一个方法 String[] selectImports(...) 此方法的返回值是String类型的数组,数组中封装的是要导入到SpringIOC容器的类的全类名, 此方法中加载了两个文件 1、META-INF/spring.factories 这时springboot早期自动配置加载的文件 /*而在2.7.X版本中提供了一份全新的配置文件 AutoConfiguration.imports, 上面的 spring.factories 会在3.X.X中会被彻底移除*/ 2、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 所以我们现在要导入的配置类就直接定义在此文件中,此文件中定义的就是配置类的全类名, 在这些配置类当中,就可以通过 @Bean 注解来声明一个一个的bean对象, 最终springboot项目在启动时就会加载 AutoConfiguration.imports 配置文件中所配置的配置类, 然后将配置类的信息封装到String[] selectImports(...)返回的String数组中, 最终通过@Import 注解将这些配置类全部加载到springIOC容器当中。
maven 私服:
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题
依赖查找顺序:本地方库 -> 私服 -> 中央仓库
私服里有: central 仓库、release 仓库、snapshot 仓库
central 仓库存放的是从中央仓库下载下来的资源,
而 release 仓库 和 snapshot 仓库 则都是项目组内部共享的资源
项目版本:
- RELEASE (发行版本):功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服的 RELEASE 仓库中
- SNAPSHOT (快照版本): 功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的 SNAPSHOT 仓库中
<artifactId>tlias-utils</artifactId> <version>1.0-SNASHOT</version> 此为快照版本,如果<version>1.0-RELEASE</version>,就上传至发行版本仓库, 即使不加-RELEASE,默认也是上传至发行版本仓库
资源上传与下载:
1、设置私服的访问名/密码(settings.xml 中 servers 中配置) ------------------------------------- <server> <id>maven-releases</id> <username>admin</username> <password>admin</password> </server> <server> <id>maven-snapshots</id> <username>admin</username> <password>admin</password> </server> ------------------------------------- 2、IDEA的maven工程的pom文件中配置上传(发布)地址 ------------------------------------- <distributionManagenment> //RELEASE版本 <repository> <id>maven-releases</id> <url>http://192.168.150.101:8081/repository/maven-releases/</url> </repository> //SNAPSHOT版本 <snapshotRepository> <id>maven-snapshots</id> <url>http://192.168.150.101:8081/repository/maven-releases/</url> </snapshotRepository> </distributionManagenment> ------------------------------------- 3、设置私服依赖下载的仓库组地址(settings.xml 中 mirrors、profiles 中配置) ------------------------------------- <mirror> <id>maven-public</id> <mirrorOf>*</mirrorOf> <url>http://192.168.150.101:8081/repository/maven-public/</url> </mirror> ------------------------------------- <profile> <id>allow-snapshots</id> <activation> <activeByDefault>true</activeByDefault> </activation> <repositories> <repository> <id>maven-public</id> <url>http://192.168.150.101:8081/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> ------------------------------------- 4、如果需要上传自己的项目到私服上,需要在项目的pom.xml文件中,增加如下配置,来配置项目发布的地址(也就是私服的地址) ------------------------------------- <distributionManagement> <!-- release版本的发布地址 --> <repository> <id>maven-releases</id> <url>http://192.168.150.101:8081/repository/maven-releases/</url> </repository> <!-- snapshot版本的发布地址 --> <snapshotRepository> <id>maven-snapshots</id> <url>http://192.168.150.101:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement> ------------------------------------- 5、发布项目,直接运行 deploy 生命周期即可 (发布时,建议跳过单元测试)