启动类相关
@SpringBootApplication
@SpringBootApplication 标注在类上,说明这是一个SpringBoot应用,且该类是启动类,是程序的入口
@SpringBootApplication
public class DiyApplication {
public static void main(String[] args) {
//Spring 应用启动起来 且返回值为 ioc容器
SpringApplication.run(DiyApplication.class, args);
// ConfigurableApplicationContext ioc = SpringApplication.run(DiyApplication.class, args);
}
}
@ComponentScan
@ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等。
常用属性如下
- basePackages:指定扫描路径,如果为空则以@ComponentScan注解的类所在的包为基本的扫描路径。只设置该属性时,属性名可以省略
- basePackageClasses:指定具体扫描的类
- includeFilters:指定满足Filter条件的类
- excludeFilters:指定排除Filter条件的类
@ComponentScan(basePackages = "com.sugar.pro.config")
//省略写法
@ComponentScan("com.sugar.pro.config")
配置相关
@Configuration
@Configuration注解用于定义配置类,该类中通常包含着用于配置Spring Bean的方法,相当于以前spring中的配置文件如:beans.xml
文件
配合@Bean
@Configuration
和@Bean
注解常一起使用用于创建自定义的Spring Bean(给容器注册组件),等同于@Component、@Controller、@Service等
,同时这种方式默认也是单实例
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
//以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
}
接下来,我们可以使用@Autowired
注解来注入这个Bean的实例对象到其他类中。例如:
@Service
public class MyController {
@Autowired
private MyService myService;
// 使用myService进行其他操作
}
扩展
@Configuration注解有个属性proxyBeanMethods
,它的作用是在配置类中定义的Bean之间是否使用代理模式。
- 当
proxyBeanMethods = false
时,Spring容器在初始化配置类中的Bean时,不会使用代理模式来创建Bean之间的依赖关系。这意味着如果一个Bean需要依赖另一个Bean,那么它将被直接注入,而不是通过代理对象进行注入。这种情况下,如果一个Bean修改了它所依赖的另一个Bean的属性或方法,那么这种修改会影响到所依赖的Bean的实例本身,可能导致不可预测的行为。 - 当
proxyBeanMethods = true
时,Spring容器会使用代理模式来创建Bean之间的依赖关系。这意味着如果一个Bean需要依赖另一个Bean,那么它将被注入一个代理对象,而不是直接注入依赖的Bean本身。这种情况下,修改所依赖的Bean的属性或方法不会影响所依赖的Bean的实例本身,从而避免了不可预测的行为。
在调用上的体现则是:
- Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
- Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
总结:
@Configuration(proxyBeanMethods = false)
表示在配置类中定义的Bean之间不使用代理模式,而是直接注入依赖的Bean本身。可能导致循环依赖。 组件依赖必须使用Full模式默认。其他默认是否Lite模式该特性是springboot2, @since 5.2版本之后才有的特性,proxyBeanMethods的默认值为true
@ConfigurationProperties
它是Spring Boot中用于绑定配置文件属性到Java对象的注解。
使用@ConfigurationProperties注解可以将配置文件中的属性
与类中的字段
进行绑定,从而将配置属性值注入到类中,这样就可以方便地通过修改配置文件来动态地修改程序的行为。
使用@ConfigurationProperties注解时,需要在注解中指定要绑定的配置属性前缀,例如:
@Component
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
private String name;
// ...getter and setter methods
}
配置文件:
hello.name = cogar
// 使用 注入的方式
@Autowired
HelloProperties helloProperties;
@RequestMapping("/hello")
public HelloProperties helloDemo(){
System.out.println("logggggg");
return helloProperties;
}
注意:直接通过关键字new创建的对象是无法将绑定的值是注入到对应属性上。或者说只有在Spring容器中的组件才能使用注入等强大的功能
注意
使用@ConfigurationProperties注解时,需要确保将其标记的类在Spring上下文中进行扫描。否则会报错。
通常可以使用以下两种方式
- @EnableConfigurationProperties注解+ @ConfigurationProperties
- @Component注解+@ConfigurationProperties
@EnableConfigurationProperties(HelloProperties.class)
public class MyConfigAuto{
}
// 在对应的配置类上 使用该注解并设置对应class
@ConfigurationProperties(prefix = "hello")
public class MyConfig{
}
// 方式一
@Component
@ConfigurationProperties(prefix = "hello")
public class MyConfig{
}
// 方式二
组件类
@Autowired
作用:它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。在开发中用得最多的是在类成员变量上
关于类成员变量的自动装配,@Resource
同样可以完成。
@Service
public class TestA {
@Autowired
private Person person;
}
- @Resource默认通过byName的方式实现,如果找不到对应的名称,则通过byType实现。
- 而@Autowired则是通过byType的方式实现,并且必须要求这个对象存在。
@Component...等
它作用是将一个普通的Java类转化为Spring的组件。通过@Component注解标记的类会被Spring框架扫描并创建实例,以便在需要的地方进行依赖注入。
类似的注解还有一些,不过它们对于所属业务层有明确定义。
- @Repository:用于标注持久层组件,也就是用于进行数据库相关操作的层
- @Service:用于标注服务层组件,主要涉及一些复杂的逻辑。
- @Controller:用于标注控制层组件,对应SpringMVC控制层,
- @RestController:也是用于标注控制层,它是@Controller和@ResponseBody的组合。
数据解析相关
@RequestMapping
是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
类似的注解还有
- @GetMapping = @RequestMapping(method = RequestMethod.GET)
- @PostMapping = @RequestMapping(method = RequestMethod.POST)
- @DeleteMapping = @RequestMapping(method = HttpMethod.DELETE)
- @PutMapping = @RequestMapping(method = HttpMethod.PUT)
@RequestParam
用于获取请求中的参数值。认情况下,@RequestParam会根据参数的名称来匹配请求中的参数名。例如,如果方法参数为String name,则会尝试从请求中找到名为 "name" 的参数值。
@RequestParam:它用于从请求的URL参数中获取数据。但是它不能用于获取文件上传参数、大量参数或跨域请求中的参数。
- @RequestParam只能处理字符串类型的参数
-
该注解有三个属性:
- value:value用来指定要传入值的名称
- required:required用来指示参数是否必须含有;
- defaultValue:指定参数的默认值。如果这个参数不存在,或者如果它的值为空,或者如果它的值不是有效的类型,将会使用这个默认值。
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id,
@RequestParam(value = "status", required = false, defaultValue = "active") String status) {
return userService.getUserById(id, status);
}
注意:如果前端传来的参数为Content-type: application/json,则使用@RequestParam无法获取,会报如下错误。 required string parameter ‘XXX‘is not present
@PathVariable
它用于从请求的URL路径中获取数据。它用于处理URL路径中的参数。
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") Integer id, @RequestParam("name") String name) {
// 处理获取用户信息请求
return "user " + id + " name " + name;
}
在这个例子中,@PathVariable("id")
用于从URL路径/users/{id}
中的{id}
部分获取值。
@RequestBody
它用于从请求的请求体中获取数据。
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userService.createUser(user);
}
上述例子中@RequestBody
用于从请求体中获取User
对象。
@ResponseBody
作用:返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。通常用来返回JSON数据或者是XML数据。