spring boot底层注解
Configuration和Bean
Configuration
用于标注类,表示当前类为配置类,常与Bean
配合使用,配置类本身也是组件,会被扫描到容器里。
Bean
用于标注方法,表示该方法用于向容器中添加组件,以方法名作为组件id,返回的对象就是组件实例,他们的基本用法如下
@Configuration// 表示当前类为配置类
public class MyConfig {
@Bean// 用于向容器中添加组件,以方法名作为组件id,返回的对象就是组件实例
public MyUtils myUtils(){
return new MyUtils("aaa");
}
}
Configuration
有一个很重要的属性叫proxyBeanMethods
,该属性表示是否代理Bean方法(即@Bean
所注解的方法),默认为ture
,此时我们通过配置类再去调用Bean方法时,不会再去new一个对象,而是返回容器中的Bean对象,这种模式称为配置的Full模式。
与之相对的,当proxyBeanMethods = false
时,称为Lite模式,此时我们只要调用Bean方法,就会返回一个新对象。
Full模式用于解决组件依赖的问题,当不存在组件依赖时,可以使用Lite模式。组件依赖案例如下:
@Configuration(proxyBeanMethods = true)// 表示当前类为配置类,会自动将该
public class MyConfig {
@Bean// 用于向容器中添加组件,以方法名作为组件id,返回的对象就是组件实例
public MyUtils myUtils(){
return new MyUtils("aaa", user());
}
@Bean// 用于向容器中添加组件,以方法名作为组件id,返回的对象就是组件实例
public User user(){
return new User("001");
}
}
public class MyUtils {
private String name;
private User user;
public MyUtils(String name, User user) {
this.name = name;
this.user = user;
}
}
当MyUtils
需要依赖另一个组件User
时,使用Full模式可以保证MyUtils
依赖的User
与容器中的相同。
Import
Import
用于标注类,且该类必须是组件,可以批量导入组件,导入组件的id为全类名,用法如下:
@Import({MyUtils.class, User.class})// 注解的类只要是组件就行,不需要是配置类
@Configuration
public class MyConfig {}
Conditional
条件装配,它是一个根注解,当满足某种条件时导入组件,他的子注解用于标注类或Bean方法。例如ConditionalOnBean
,表示当容器中存在某个Bean时,会导入组件。
例如:
@Bean
@ConditionalOnMissingBean(name = "myUtils")// 当容器中不存在名为myUtils的组件时,导入myUtils组件
public MyUtils myUtils(){
return new MyUtils("aaa", user());
}
ImportResource
和Import
注解类似,标注在组件类上,通过xml的方式批量导入组件,例如:
@RestController
@ImportResource("classpath:beans.xml")
public class HelloController {
@RequestMapping("/")
public String hello() {
return "hello, springboot";
}
}
ConfigurationProperties
配置绑定,标注在组件类上,用于将配置与类进行绑定,注意:配置的属性需要有set方法,例如
@ConfigurationProperties(prefix = "user")
@Component
public class User {
private String id;
public void setId(String id) {
this.id = id;
}
}
若我们不想给User
类添加Component
注解,可以在其他组件类上加一个@EnableConfigurationProperties(User.class)
,该注解可以让User
作为组件,例如:
@Configuration(proxyBeanMethods = true)// 表示当前类为配置类,配置类也是组件
@EnableConfigurationProperties(User.class)
public class MyConfig {}