一、简化部署<!–pom.xml文件加入如下配置–>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>在Maven工具栏中选中clean、package后执行把项目打成jar包。完成后会生成一个xxx.jar的包直接在目标服务器执行即可.可以在命令行中运行 java -jar xxx.jar二、自动配置原理2.1、依赖管理父项目做依赖管理//依赖管理
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.6</version>
</parent>
//他的父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.6</version>
</parent>
//几乎声明了所有开发中常用的依赖的版本号,自动版本仲裁机制2.2、导入starter场景启动器见到很多 spring-boot-starter-* : *就表示某种场景 只要引入starter,这个场景的所有常规需要的依赖我们都自动引入(通过依赖传递)SpringBoot所有支持的场景: https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。无需关注版本号,自动版本仲裁:引入依赖默认都可以不写版本 引入非版本仲裁的jar,要写版本号。修改默认版本号:查看spring-boot-dependencies里面规定当前依赖的版本 用的 key。在当前项目里面重写配置版本2.3、自动配置自动配好Tomcat 引入Tomcat依赖。 配置Tomcat(后续)自动配好SpringMVC 引入SpringMVC依赖自动配好SpringMVC常用组件(功能) 前端控制器、视图解析器、上传解析器等…自动配好Web常见功能 如:字符编码问题默认包扫描 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来,无需包扫描配置 想要改变扫描路径,@SpringBootApplication(scanBasePackages="com.suyang") 或者@ComponentScan 指定扫描路径各种配置拥有默认值 默认配置最终都是映射到某个类上,如:MultipartProperties 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象按需加载所有自动配置项 非常多的starter 引入了哪些场景这个场景的自动配置才会开启 SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面2.4、(容器)添加组件3.4.1、spring中常见的注解@Component、@Controller、@Service、@Repository3.4.2、@Configuration+@Bean@Configuration本身也是组件配置类 组件之间无依赖关系用Lite模式加速容器启动过程,减少判断配置类 组件之间有依赖关系,方法会被调用得到之前的单实例对象,用Full模式@Bean给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例//Configuration使用示例
/**
* 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
* 2、配置类本身也是组件
* 3、proxyBeanMethods:代理bean的方法
* Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
* Lite(proxyBeanMethods = false) 【每个@Bean方法被调用多少次返回的组件都是新创建的】
* 组件之间有依赖必须使用Full模式默认。其他默认是Lite模式
*
*/
//告诉SpringBoot这是一个配置类
//等于之前spring使用xml配置文件applicationContext.xml
//proxyBeanMethods默认值为true
@Configuration(proxyBeanMethods = false)
public class MyConfig {
@Bean
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("tom") //自定义组件id,默认是方法名为组件id
public Pet tomcatPet(){
return new Pet("tomcat");
}
}//测试@Configuration配置类中创建组件
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//3、从容器中获取组件
Pet tom01 = run.getBean("tom", Pet.class);
Pet tom02 = run.getBean("tom", Pet.class);
//4、结果为true,证明@Bean标注在方法上给容器注册组件,是单实例的
System.out.println("组件:"+(tom01 == tom02));
/*5.1、配置类中@Configuration(proxyBeanMethods = true)
com.suyang.config.MyConfig$EnhancerBySpringCGLIB$8ba772fe@5b6e8f77
调用@Bean标注的方法,SpringBoot总会检查这个组件是否在容器中有
适用于组件依赖
*/
/*5.2、配置类中@Configuration(proxyBeanMethods = false)
com.suyang.config.MyConfig@5e76a2bb
调用@Bean标注的方法,不会检查容器中是否存在,都是新创建的
*/
MyConfig myConfig = run.getBean(MyConfig.class);
System.out.println(myConfig);
User user03 = myConfig.user();
Pet pet = run.getBean("pet", Pet.class);
System.out.println(pet==user03.getPet());3.4.5、@Import@Import的三种用法主要包括:@Import({ 要导入的容器中的组件 } ):直接填class数组方式ImportSelector【重点】(后续)ImportBeanDefinitionRegistrar:手动注册bean到容器//@Import({ 类名.class , 类名.class… })
//给容器中自动创建出这个类型的组件、默认组件的名字就是全类名(com.suyang.dao.User)
@Import(User.class)
@Configuration(proxyBeanMethods = false)
public class MyImport {
}3.4.6、@Conditional条件装配:满足Conditional指定的条件,则进行组件注入@Configuration+@Bean+@Conditional 一起使用@Configuration声明是一个配置类,相当于spring配置文件@Bean相当在spring配置文件中定义一个<bean>标签@Conditional满足什么条件时生效(在类或方法上注解)
本文出自快速备案,转载时请注明出处及相应链接。