@Autowired
@Autowired注解可以说是Springboot中最最常用的注解了。
传统的开发过程中,如果我们想给一个类添加成员变量时,需要通过手动创建实例的方式。
比如以往这个类里面的属性都需要我们自己写,比如创建一个Employee类的时候,我们以添加House对象为例,你要么自己在构造器里new好这个House类,要么你通过构造器来进行创建,或者你提供get、set方法,自己从外面调用set方法等等。
public class Employee {
private String name;
private House house;
public Employee() {
}
public Employee(String name,House house) {
this.name = name;
this.house = house;
}
}
而@Autowired方法就简化了这一过程,@Autowired注解可以将一个类的实例自动注入到当前类的成员变量中。
从而实现对象的依赖关系自动注入。
使用 @Autowired 注解,我们不再需要手动创建依赖对象的实例,也不需要手动设置依赖关系,而是由 Spring 框架自动完成这些操作。这使得代码更加简洁、可维护性更高。
@Autowired等下面的一系列注解都与Spring、Springboot的设计理念有关,我们约定通过注解(底层通过反射)来实现一系列的功能,约定大于配置的方式,来简化开发。
@Bean注解只能写在什么位置?
@Bean注解只能写在配置类里面,也就是说,Bean的注入只能写在配置类里面
- 带@Configuration注解的类就是配置类
- @SpringBootApplication启动类本身也是一个配置类
@Bean注解能干啥
- 产生对象,放入Spring容器中
@Bean注解就是告诉Spring容器,产生一个Bean对象,交给Spring容器管理,产生这个Bean对象的方法Spring只会调用一次,随后Spring会将这个对象放在IOC容器。 - 实现自动注入解决依赖关系
在这个过程中,Spring会自动处理该bean的依赖关系,并将需要注入的对象作为参数传递给该@Bean方法,实现自动注入。
需要注意的是被注入的对象必须是在Spring中容器中声明过的对象,即被Spring容器管理,@Bean注解才能帮忙自动处理依赖关系,自动注入需要的对象
例子如下
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
// 实例化RedisTemplate对象
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置RedisTemplate对象的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// 设置RedisTemplate对象的连接工厂
redisTemplate.setConnectionFactory(factory);
// 返回RedisTemplate对象
return redisTemplate;
}
}
对例子的解释,由于我的IOC容器中有RedisConnectionFactory 这个类,所以我可以直接写,而不需要把注解@Autowired写在传入redisTemplate方法的参数前面,因为我们使用了@Bean注解,就会自动解决当前这个Bean的依赖关系。(再次强调,自动解决依赖问题这个对象是必须在IOC容器中才可以我这里的RedisConnectionFactory 是之前已经在IOC容器中了,否则你需要将对象先加入到IOC容器中才可以进行 不懂的话,下面有这个解释 )
如何将对象注入到IOC容器中
使用配置类的方式
@Configuration
public class MyConfig {
@Bean//这样就把目标类加入到了Spring的IOC容器中
public TargetClass target() {
return new TargetClass();
}
}
Component注解的方式
除了@Component注解
@Service
@Controller
@Dao
都是可以的,他们都是把类作为Bean放到SpringIOC容器中进行管理,只不过是放在不同的层上
@Component
public class MyComponent {
@Autowired
private TargetClass target;
// ...
}
@Mapper、@Component和@MapperScan以及@ComponentScan的爱恨情仇
@MapperScan就是把每个包都加上这个@Mapper注解,@ComponentScan同理,用法如下。
//给注解传入包名
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
其优点在于可以不需要重复的在每一个Mapper类上都写@Mapper或者@Component了。
但是要注意,有的版本的IDEA可能会报错,这并不是代码有问题,而是IDEA自身的问题。
下面我们假设一种情况OrderMapper已经在cn.itcast.order.mapper包下。
有时依然会报错
Could not autowire. No beans of ‘OrderMapper’ type found. 即使你在这个OrderMapper类所在的包已经写入到了@MapperScan(“cn.itcast.order.mapper”)注解中,这个问题可以忽视,因为是IDEA本身的bug,之后随着IDEA的迭代应该会修复掉这个BUG,或者清理一下项目缓存也会有效果。
@Value注解
@Value注解用于获取配置文件中的信息
格式如下
package cn.itcast.user.web;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${pattern.dateformat}")
private String dateformat;
/**
* 路径: /user/110
*
* @param id 用户id
* @return 用户
*/
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
我们在yml配置文件里写了pattern中的dateformat属性,那么就可以通过这种方式获取到你配置文件中的值。
pattern:
dateformat: yyyy-MM-dd HH:mm:ss
@ConfigurationProperties
@ConfigurationProperties是Spring Boot框架中的注解,用于将配置文件中的属性值映射到一个Java Bean中。在Spring Boot中,我们可以通过在一个带有@ConfigurationProperties注解的Java Bean类中定义各种属性,然后将这些属性值从外部配置文件(如application.properties或application.yml)中读取并赋值给这个Java Bean对象。这样,在应用程序启动时,Spring Boot会自动将这些属性值注入到相关的Bean中,从而方便我们对应用程序进行配置。
当配置文件被修改时,带有@ConfigurationProperties注解的Java Bean的属性值会立即更新。 这是因为Spring Boot在应用启动时会自动将配置文件中的属性值读取到Java Bean对象中,并将其缓存起来。如果在应用程序运行期间修改了配置文件,则Spring Boot会自动检测到并重新加载配置文件,并将更新后的属性值写回Java Bean对象中。这样就能够实现热更新,让应用程序在不重启的情况下动态更新配置信息。
@Order注解
在Spring Boot中,@Order(-1)
是一个注解用于控制组件的加载顺序。通过给组件添加@Order
注解,可以指定它们在容器中的加载顺序。
具体地说,@Order(-1)
表示将注解标记的组件优先于其他具有默认顺序或较高值的组件进行加载。
注意以下几点:
@Order
注解中的值越小,优先级越高。默认情况下,没有使用@Order
注解的组件的优先级为0。- 如果多个组件具有相同的
@Order
值,它们的加载顺序是不确定的。 @Order
注解可应用于类级别(加载整个组件)或方法级别(加载特定方法)。
使用@Order(-1)
可以确保被标记的组件在启动过程中首先加载,这在一些特定场景下可能很有用,例如需要在其他组件之前执行某些初始化操作。
通常@Order(-1)
会被写在拦截器上,用于先开启拦截器再启动service和order等组件
@Configuration注解
在@Configuration注解中,可以使用@Bean来创建Bean并将其注册到Spring容器中。
@Configuration是Spring Framework中的一个注解,用于表示当前类是一个配置类,其中包含了一些用于配置应用程序上下文的Bean定义。通过在@Configuration注解类中使用@Bean注解,可以定义一个方法,该方法返回一个对象实例,Spring会将该实例作为一个Bean注册到容器中。
补充: Spring容器会在启动时扫描@Configuration注解的类,并执行其中的@Bean方法,将返回的对象注册为Bean。无需我们去手动调用
示例代码如下所示:
@Configuration
public class MyConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
在上述示例中,@Configuration注解表示MyConfiguration是一个配置类。而@Bean注解用于修饰myBean()方法,指示Spring将该方法返回的MyBean对象注册到容器中。之后,就可以在其他地方通过@Autowired等注解来自动注入这个Bean。
需要注意的是,@Configuration注解通常与@ComponentScan或@Component注解一起使用,以确保Spring能够扫描到并加载该配置类及其中的Bean定义。
总之,在@Configuration注解中使用@Bean可以方便地创建和注册Bean到Spring容器中,为应用程序提供所需的依赖项和组件。