1.组件注册
1.1 使用的注解
- @Configuration:普通配置类,替代以前的配置文件,配置类本身也是容器的组件|
- @SpringBootConfiguration:Springboot配置类,与@Configuration功能一样|
- @Bean:替代以前的Bean标签,如果没有在Bean标签内定义名字,则默认组件的名字为方法名,可以直接修改注解的名字|
- @Scope:多实例获取
- @Import:导入第三方组件
1.2 步骤
1、@Configuration 编写一个配置类
2、在配置类中,自定义方法给容器中注册组件。配合@Bean
3、或使用@Import 导入第三方的组件
1.3 实战
第一步:创建一个组件,比如我创建的是一个Cat实体类
public class Cat {private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
第二步:创建一个配置类,并且注册相应的组件,我创建的类名为ApplConfig
@Import(DruidRuntimeException.class) //第三方类,也可以通过Import导入,给容器中放指定类型的组件,组件的名字默认是全类名
@SpringBootConfiguration // 定义配置文件
public class AppConfig {@Scope@Bean("user01")public User user(){var user=new User();user.setName("张三");user.setId(1L);return user;}//2.给第三方类注册组件@Beanpublic FastsqlException fastsqlException(){return new FastsqlException();}}
第三步: 查看是否注册成功,在主程序中,查看容器中是否有这些组件
@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {public static void main(String[] args) {// java10:局部变量类型的自动推断var ioc = SpringApplication.run(Boot2DemoApplication.class, args);for (String s : ioc.getBeanNamesForType(User.class)) {System.out.println(s);}// 查看第三方库是否注册成功for (String s : ioc.getBeanNamesForType(FastsqlException.class)) {System.out.println(s);}for (String s :ioc.getBeanNamesForType(DruidRuntimeException.class)) {System.out.println(s);}}}
2. 条件注解
2.1 使用的注解
@ConditionalOnXxx
- @ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
- @ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
- @ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
- @ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
- @ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值
2.2 实战
场景:
● 如果存在FastsqlException这个类,给容器中放一个Cat组件,名cat01,
● 否则,就给容器中放一个Dog组件,名dog01
● 如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan
● 否则,就放一个User,名叫lisi
代码:
@ConditionalOnClass(value = "com.alibaba.druid.FastsqlException") //放在类级别,如果注解判断生效,则整个配置类才会生效
@SpringBootConfiguration
public class AppConfig2 {@ConditionalOnClass(FastsqlException.class) // 如果类路径中存在这个类,则触发指定行为@Beanpublic Cat cat01(){return new Cat();}@ConditionalOnMissingClass(value="com.alibaba.druid.FastsqlException")// 如果类路径中不存在这个类,则触发指定行为@Beanpublic Dog dog01(){return new Dog();}@ConditionalOnBean(value = Dog.class) // 在有这个组件类的情况指定行为@Beanpublic User zhangsan(){return new User();}@ConditionalOnMissingBean(value = Dog.class)// 在没有这个组件类的情况指定行为@Beanpublic User lisi(){return new User();}
}
验证是否按照指定条件注册的组件:在主程序中运行下面代码
@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {public static void main(String[] args) {// java10:局部变量类型的自动推断var ioc = SpringApplication.run(Boot2DemoApplication.class, args);// 查看一下容器中cat类的组件有哪些for (String s : ioc.getBeanNamesForType(Cat.class)) {System.out.println(s);}for (String s : ioc.getBeanNamesForType(Dog.class)) {System.out.println(s);}for (String s : ioc.getBeanNamesForType(User.class)) {System.out.println(s);}}
}
3.属性绑定
3.1 使用的注解
- @ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定
- @EnableConfigurationProperties:快速注册注解:
3.2 步骤
将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定
- 1、给容器中注册组件(@Component、@Bean)
- 2、使用@ConfigurationProperties 声明组件和配置文件的哪些配置项进行绑定
- 或者使用@EnableConfigurationProperties注解
场景:SpringBoot默认只扫描自己主程序所在的包。如果导入第三方包,即使组件上标注了@Component、@ConfigurationProperties 注解,也没用。因为组件都扫描不进来,此时使用这个注解就可以快速进行属性绑定并把组件注册进容器
3.2 实战
使用@ConfigurationProperties注解
第一步:注册组件
创建一个pig
组件
@ConfigurationProperties(prefix ="pig")
@Component
public class Pig {private Long id;private String name;private Integer age;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Pig{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}
第二步:在配置文件properties
中写好对应的配置
pig.id=1
pig.name=佩奇
pig.age=5
第三步:测试一下属性是否绑定成功
@SpringBootApplication// 告诉系统这是一个Springboot的应用
public class Boot2DemoApplication {public static void main(String[] args) {// java10:局部变量类型的自动推断var ioc = SpringApplication.run(Boot2DemoApplication.class, args);Pig pig=ioc.getBean(Pig.class);System.out.println("pig"+pig);}}
方式二
也可以将组件类名上方的@component取消掉,直接在配置类中注册组件也是可以的
@SpringBootConfiguration
public class AppConfig2 {@Beanpublic Pig pig(){return new Pig();}
}
方法三
也可以将prefix
也放到配置文件中
@SpringBootConfiguration
public class AppConfig2 {@Bean@ConfigurationProperties(prefix ="pig")public Pig pig(){return new Pig();}
}
使用@EnableConfigurationProperties注解
第一步:先在bean
中创建一个sheep
组件,并且加上@ConfigurationProperties
注解,绑定属性
@ConfigurationProperties(prefix = “sheep”)
public class Sheep {
private Long id;
private String name;
private Integer age;
public Long getId() {return id;
}public void setId(Long id) {this.id = id;
}public String getName() {return name;
}public void setName(String name) {this.name = name;
}public Integer getAge() {return age;
}public void setAge(Integer age) {this.age = age;
}@Override
public String toString() {return "Sheep{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';
}
}
第二步:在配置文件`properties`中写好对应的配置
~~~ java
pig.id=1
pig.name=哈利
pig.age=5
第三步:在配置类中配置
/*
@EnableConfigurationProperties有两个功能
1.开启sheep的属性绑定
2.默认会直接把这个组件放到容器中
*/
@EnableConfigurationProperties(Sheep.class)
@SpringBootApplication
public class AppConfig3 {}
使用@EnableConfigurationProperties会把属性与组件绑定,并且还会自动将组件放到容器中./一般用于第三方写好的组件进行属性绑定,springboot默认只扫描主程序所在的包.