1.@Scope:设置组件的作用域
@Configuration
@Import({Colour.class, Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig {
/* ConfigurableBeanFactory#SCOPE_PROTOTYPE prototype 多实例
* IOC容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用对象创建对象
* ConfigurableBeanFactory#SCOPE_SINGLETON singleton 单实例(默认值)
* IOC容器启动会调用方法创建对象放到IOC容器中,以后每次获取就是直接从容器中(三级缓存)中拿
* org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request 同一个请求创建一个实例
* org.springframework.web.context.WebApplicationContext#SCOPE_SESSION session 同一个session创建一个实例
*
*/
@Scope("prototype")
@Bean
public Person person(){
System.out.println("person对象的创建过程..............");
return new Person("nieyp","24");
}
}
2.@Lazy:是否懒加载
@Configuration
public class MainConfig {
/*
* 懒加载:
* 单实例bean:默认在容器启动的时候创建对象
* 懒加载:针对单实例Bean,容器启动时不创建对象,第一次获取Bean的时候创建对象
*/
@Lazy
@Bean
public Person person(){
System.out.println("person对象的创建过程..............");
return new Person("nieyp","24");
}
}
3.@AutoWired
/**
* @Autowired:自动注入:
* 1)优先按照类型去容器中找对应的组件:
* 2)如果找到多个相同类型的组件,再将属性的名称作为组件Id去容器中查找
* 3)@Qualifier("bookDao"):使用指定的组件ID装配,而不是使用默认的组件Id
* 4)@Primary:让Spring进行自动装配的时候,默认使用首选的bean
* 5)@Autowired标注的地方:构造器,参数,方法,属性:都是从容器中获取参数组建的值
* 构造器:如果组件只有一个有参构造器,这个有参构造器的@Autowried可以省略,参数位置的组件
* 还是可以自动获取
* 标注在实体类方法位置:@Bean标注的方法创建对象的时候,方法参数的值(需要自动注入的值)可
* 以从容器中获取,不必写@Auotwired(如例1)
* 配置类位置:需要参数作为构造方法的参数是不需要@autowired(如例2)
*
* Spring还支持使用@Resuorce(JSR250)和@Inject(JSR330)[java规范的注解]
* @Resuorce:
* 可以和@Autowired一样实现自动装配的功能;默认是按照组件名称进行装配的
* 不支持@Primary功能,不支持@Autowired(required=false)
* @Inject:
* 需要导入java.inject的包,和Autowired的功能一样,没有required=false功能
*/
//例1
public class Person {
private String name;
private String age;
private City city;
public City getCity() {
return city;
}
@Autowired
//标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋值
//方法使用的参数,自定义类型的从IOC容器中获取(标注在有参构造上上同理(如果只有一个有参构造器,@AutoWired可以省略),也可以直接放在参数位置)
public void setCity(City city) {
this.city = city;
}
}
//例2(前提是car和student已经注册到了Ioc容器中)
@Bean
public Person1 person1(Car car, Student student){
return new Person1(car,student);
}
4.Bean的初始化和销毁
/*
* Bean的初始化和销毁方法
* 1)通过@Bean指定init-method和destroy-method
* 2)通过Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)
* 3)可以使用JSR250
* @PostConstruct:在Bean创建完成并且属性赋值完成;来执行初始化方法
* @PreDestroy:在容器销毁Bean之前通知我们进行清理工作
* 4)BeanPostProcessor:Bean的后置处理器在Bean初始化前后做一些处理工作
* postProcessBeforeInitialization:在初始化之前工作
* postProcessAfterInitialization:在初始化之后工作
*/
5.@Import
@Configuration
@Import({Colour.class, Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class MainConfig {
/*
*
* 给容器中注册组件
* 1)包扫描+组件标注注解
* 2)@Bean[导入的第三方包里面的组件]
* 3)@Import[快速给容器中导入组件]
* 1)@Import(要导入到容器中的组件);容器中会自动注册,id默认是全类名
* 2)ImportSelector:返回需要导入的组件的全类名数组;
* 3)ImportBeanDefinitionRegistrar:手动注册bean到容器中
* 4)使用Spring提供的FactoryBean(工厂Bean)
* 1)默认获取到的是工厂bean调用getObject创建的对象
* 2)要获取工厂Bean本身,我们需要给ID前面加一个&
*/
}
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
System.out.println(importingClassMetadata.getAnnotations());
System.out.println(importingClassMetadata.getAnnotations());
return new String[0];
}
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
registry.registerBeanDefinition("rainBow",rootBeanDefinition);
}
}
6.@ConfigurationPropertie+@Component
@ConfigurationProperties:通常是用来将properties和yml配置文件属性转换为bean对象使用,有一个prefix属性:需要指定配置文件中某些属性的前缀,会自动匹配到bean对象的某些属性上面.结合@Component将转换后的bean对象放入Ioc容器中
@Component
@ConfigurationProperties(prefix = "nieyp.blog")
public class ConfigBean {
private String cource;
private String name;
set/get+tostring
}
application.yml:
nieyp.blog.cource:springBoot
nieyp.blog.name:blog
@RestController
public class TestController {
@Autowired
ConfigBean configBean;
@GetMapping("/getMessage")
public void getMessage() {
System.out.println(configBean.toString());
}
}
7.@EnableConfigurationProperties
@EnableConfigurationProperties在文档中解释 :当@EnableConfigurationProperties注解应用到你的@Configuration时,任何被@ConfigurationProperties注解的beans将自动被Environment属性配置 .这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。(@EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入.)
//将@ConfigurationProperties标注的类注册到BeafFactory
@EnableConfigurationProperties
@Configuration
public class PersonConfiguraiton {
}
8.@Value
public class Student {
/**
* 使用@value赋值
* 1,基本数值
* 2,可以写SpEL:#{}
* 3,可以写${}:取出配置文件中的值(在运行环境变量中的值:配置文件中的值最终都会放到Enviromnent
* 中)
* 也可以结合PropertySource读取配置文件中的值
*
* 也可以让配置类实现EmbeddedValueResolverAware,定义一个属性将实现方法中的解析器赋值给该
属性,调用该属性的resolveStringValue("${xxxx}")
*/
@Value("123123")
private String name;
//@Value("#{20-3}")
@Value("123123")
private String age;
@Value("${person.nickName}")
private String nickName;
}
@PropertySource(value = {"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValue {
@Bean
public Student student(){
return new Student();
}
}
9.@Profile:指定组件在哪个环境的情况下才能被注册到容器中
- 加了环境标志的bean或者配置类,只有这个环境被激活的时候才能被注册到容器中,默认是default环境
- 没有标注任何环境的Bean在任何环境下都是加载的
@Configuration
public class MainConfigOfProfile {
@Profile("test")
@Bean
public DataSource dataSourceTest(){
return new DataSource("test");
}
@Profile("dev")
@Bean
public DataSource dataSourceDev(){
return new DataSource("dev");
}
@Profile("pro")
@Bean
public DataSource dataSourcePro(){
return new DataSource("pro");
}
}
切换不同化境:
1.使用命令行动态参数(VM arguments): -Dspring.profiles.active=xxxx
2.通过代码
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); applicationContext.getEnvironment().setActiveProfiles("xxxx"); applicationContext.register(xxxx.class); applicationContext.refresh();
10.@ComponentScan:在Springboot项目中可以重新指定要扫描的包以及排除的某些
//@SpringBootApplication(exclude = {Controller.class, Service.class})
//@ComponentScan(basePackages = {"com.xx.xx.*"}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {Controller.class}))
@SpringBootApplication
@ComponentScan(basePackages = {"com.hjj"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}