SpringBoot-常用注解
组件添加
@Configuration、@Bean
1. 配置类
- 之所以会生效是因为: spring boot 项目默认会扫描主启动类同级的包
//告诉SpringBoot这是一个配置类 == 配置文件
//配置类本身也是组件
@Configuration(proxyBeanMethods = false)
public class MyConfig {//配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的//以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例@Bean public User user01(){User zhangsan = new User("zhangsan", 18);//user组件依赖了Pet组件zhangsan.setPet(tomcatPet());return zhangsan;}@Bean("tom")public Pet tomcatPet(){return new Pet("tomcat");}
}
2. proxyBeanMethods:代理bean的方法
- Full(proxyBeanMethods = true):
- 保证每个@Bean方法被调用多少次返回的组件都是单实例的
- 单例模式能有效避免Lite模式下的错误,会先检查容器中是否有该组件,性能没有Lite模式好
- 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
- Lite(proxyBeanMethods = false):
- 每个@Bean方法被调用多少次返回的组件都是新创建的,
- 配置类组件之间无依赖关系用Lite模式加速容器启动过程,不会检查容器,直接创建一个新的组件返回
- 运行时不用生成CGLIB子类,可以减少判断,提高运行性能,降低启动时间,可以作为普通类使用。但是不能声明@Bean之间的依赖
- Lite模式不完全等同于Spring中的原型模式,因为原型模式不会在IOC创建时就创建对象,而Lite模式则是在创建IOC容器时就会创建所有的对象实例。
3. Full模式与Lite模式
- spring5.2之后新增lite模式
- Full模式和Lite模式是针对spring配置而言的,和xml配置无关
- 何时为Lite模式:
- 类上有@Component注解
- 类上有@ComponentScan注解
- 类上有@Import注解
- 类上有@ImportResource注解
- 类上没有任何注解,但是类中存在@Bean方法
- 类上有@Configuration(proxyBeanMethods = false)
- 何时为Full模式:
- 标注有@Configuration或者@Configuration(proxyBeanMethods = true)
@Component、@Controller、@Service、@Repository
- Spring为Controller-Service-Dao的分层模型分别提供了@Controller、@Service、@Repository注解,除此之外的组件使用@Component注解
- @Controller、@Service、@Repository其本质就是@Component。
@Import
- 自动从类中的无参构造函数创建一个实例注册到 IOC 容器中
- 所创建的实例在 IOC 容器中默认的id名为类的全限定名(包名+类名)
//给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false)
public class MyConfig {}
@Conditional
1. 满足Conditional指定的条件,则进行组件注入
- @Conditional中派生了很多的子注解
- 可以添加在@Bean注解的方法上,也可以放在配置类上
- 在方法上满足所需条件时则执行方法中内容并注册到 IOC 容器中如果不满足条件则不注册
- 在配置类上满足需求时则执行配置类中所有的@Bean方法并注册到 IOC 容器中如果不满足条件则不注册
2. 该注解及其扩展来的注解的关键是实现Condition接口重写其matches方法
@ImportResource
- 指以.xml结尾的配置文件,通过@ImportResource导入
- SpringBoot进行解析xml配置文件,完成对应的组件注册
- 放在任一配置类上即可
@ImportResource("classpath:beans.xml")
public class MyConfig {}
配置绑定
@ConfigurationProperties
- 主要的目的是设置前缀prefix,自动匹配到配置文件中设置的数据,相当于初始化参数
- 声明在要绑定类的上方,类必须先在容器中注册,最简便的就是使用@component
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {private String brand;private Integer price;
}
#application.properties中
mycar.brand=YD
mycar.price=100000
@EnableConfigurationProperties
- 将设置的类注入到容器中,必须用在配置类
- 当第三方的jar使用了@ConfigurationProperties,但是没有注入到容器中,即使用此注解
@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {}
@Value
- @Value("${person.name:李四}")作用在类属性上,也需要bean注入到容器中
- 作用是绑定配置文件person.name的值,如果没有这个值,默认值是李四