SpringBoot之【常用注解和热部署(二)】

前言

上一章我们对SpringBoot的基础知识做了些简单了解,今天就让我们对SpringBoot再加深点了解.

1.常用注解

  • @Configuration 作用于类上,相当于一个xml配置文件;
  • @Bean 作用于方法上,相当于xml配置中的;
  • @Import 注解 在创建配置文件之后可以引入其它的配置文件
  • @ComponentScan(“com.sxt”) 配置扫描
  • @Qualifier qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Bean注解的名称之一

可能光看文字大家还不能比较清楚的了解这些注解,那么我们就结合代码分析这个注解,这样大家印象会更深刻.

@Configuration
public class UserConfig {
	
	@Bean
	public User getUser() {
		return new User("张三",18,"男");
	}

}

我们先来看 @Configuration,@Bean 这两个注解,使用 @Configuration 后,这个类就类似一个xml(成了一个配置类),而这个 @Bean 就类似在IOC容器中创建了一个User对象,于是我们就可以通过 @Autowired 自动装配获取到IOC容器中的值.最后我们可以在测试类中测试是否可以从IOC容器中拿到值.
在这里插入图片描述
测试类中的代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
	@Autowired
	private User user;
	@Test
	public void contextLoads() {
		System.out.println(user);
	}
}

运行结果如下:
SpringBoot之【常用注解和热部署(二)】_第1张图片
可以看到我们已经获取到了IOC容器中的值了!

@Qualifier 个人理解这个注解其实就类似中的id,给这个对象加了一个唯一的名字.用法示例如下:

//错误演示
@Configuration
public class UserConfig {
	@Bean
	public User getUser() {
		return new User("张三",18,"男");
	}
	@Bean
	public User getUser2() {
		return new User("李四",18,"男");
	}
}

如上面的代码,如果我们此时想拿到李四这个用户信息我们该怎么办了? 注意 :此时IOC容器中有同名的两个对象,直接获取IOC不知道该注入哪一个值,然后会报错expected single matching bean but found 2: getUser,getUser2 (翻译过来就是:期望单个匹配的bean,但是发现了2:getUser,getUser2),于是我们此时就得使用 @Qualifier 这个注解将他们区分开了.

配置类中的代码如下:

//正确演示
@Configuration
public class UserConfig {
	@Bean
	@Qualifier(value="user1")
	public User getUser() {
		return new User("张三",18,"男");
	}
	@Bean
	@Qualifier(value="user2")
	public User getUser2() {
		return new User("李四",18,"男");
	}
}

测试类中的代码如下:
取哪个对象就写哪个对象对应的value值就行.
SpringBoot之【常用注解和热部署(二)】_第2张图片
运行结果如下:
SpringBoot之【常用注解和热部署(二)】_第3张图片
此时我们就可以"为所欲为",想取哪个对象的值就取哪个对象的值了。

@ComponentScan 这个注解用于扫描与启动类(我这个里是 Application 这个类)不在同一层级或者不是启动类所在层级的子层级的配置类.这是因为我们的启动类默认的扫描范围是同级或其同级的子级,所以此时就需要用到 @ComponentScan 了.
注意: 如果使用 @ComponentScan 默认的扫描路径将会被覆盖,而不是添加,要想再扫描同级及其子级,就需要自己在basePackages= {} 大括号中自己定义了(例如:@ComponentScan(basePackages= {“com.config”,“com.kang”})).
示例如下:
还是之前的代码,层级如下,我们可以看见此时的配置类 UserConfigApplication 启动类并不在一个层级.如过直接像之前一样取User的值,就会报出org.springframework.beans.factory.UnsatisfiedDependencyException这个错,就是注入的时候找不到这个对象报出的异常.

SpringBoot之【常用注解和热部署(二)】_第4张图片
此时在启动类上加上 @ComponentScan 这个注解加上包的完全限定名即可.
SpringBoot之【常用注解和热部署(二)】_第5张图片
@Import 用于映入别的配置文件,这个没什么难度我就简单演示下啦~
如下图,config包里的配置类并不在Application启动类的扫描范围内,如何让他可以被使用呢?
SpringBoot之【常用注解和热部署(二)】_第6张图片
可以通过创建同一级或子级的TotalConfig(自级创的)配置类上加**@import**引入这两个配置类即可~
SpringBoot之【常用注解和热部署(二)】_第7张图片

2.热部署(2.0)

定义: 热部署就是在不关闭服务器的情况下可以修改之前部署的代码并生效.简单来说就是可以在运行中加入代码,不需要重新手动部署.但是需要注意的是,如果修改的是配置文件或则添加了新的依赖(新的jar包)可能不会生效!

第一种方法在pom.xml中加入下面的依赖即可:

<!-- 热部署的依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<!-- optional=true, 依赖不会传递, 该项目依赖devtools; 之后依赖boot项目的项目如果想要使用devtools, 
				需要重新引入 -->
			<optional>true</optional>
		</dependency>

第二种方法在创建项目时勾选Spring Boot DevTools即可
SpringBoot之【常用注解和热部署(二)】_第8张图片
其实以上两种方法是一样的,都是在pom.xml中添加了一个依赖!

后语

本章就到这里结束了,希望每章都能给予大家一定帮助,给自己一点提升!

你可能感兴趣的:(SpringBoot)