@Configuration:告诉Spring这是一个配置类,配置类===配置文件
@Bean:给容器注入一个bean,类型为返回值类型,id默认是用方法名作为id
@Configuration
//@ComponentScan value:指定要扫描的包
//excludeFilters=Filter[]:指定扫描的时候按照什么规则排除哪些组件
//includeFilters=Filter[]:指定扫描的时候只需要包含哪些组件,需要使这个起作用,还需要配置useDefaultFilters=false,禁用掉默认规则(扫描所有)
/*@ComponentScan(value="com.atguigu.controller",includeFilters={@Filter(type=FilterType.ANNOTATION,classes=Controller.class)},useDefaultFilters=false)*/
@ComponentScan(value="com.atguigu.controller",excludeFilters={@Filter(type=FilterType.ANNOTATION,classes=Controller.class)})
public class MainConfig{
@Scope("prototype")
@Bean
public Person person(){
return new Person("lisi",20);
}
}
包扫描:只要标注了@Controller、@Service、@Repository、@Component这四个注解的任意一个,就都会被扫描到并加入容器
@ComponentScan value:指定要扫描的包
excludeFilters=Filter[]:指定扫描的时候按照什么规则排除哪些组件
includeFilters=Filter[]:指定扫描的时候只需要包含哪些组件,需要使这个起作用,还需要配置useDefaultFilters=false,禁用掉默认规则(扫描所有)
扫描规则:
FilterType.ANNOTATION:按照注解
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.ASSIGNABLE_TYPE:按照给定的类型
FilterType.REGEX:使用正则表达式
FilterType.CUSTOM:使用自定义规则,实现TypeFilter接口;
metadataReader:读取到的当前正在扫描的类的信息
metadataReaderFactory:可以获取到其他任何类的信息
@Scope:默认是单实例的
prototype:多实例的:ioc容器启动时候不会调用方法创建对象放在容器中。每次获取对象的时候才会调用方法创建对象放到容器中
singleton:单实例的,默认值;ioc容器启动会调用方法创建对象放到ioc容器中,以后每次获取就是直接从容器中拿
request:同一个请求创建一个实例
session:同意给session创建一个实例
@Lazy 懒加载:
单实例bean:默认在容器启动的时候创建对象
懒加载:容器启动不创建对象,第一次使用(获取)Bean创建对象,并初始化;只执行一次
@Conditional:按照一定的条件进行判断,满足条件给容器中注册bean
实现Condition接口,实现matches()方法返回一个boolean值,满足条件就给容器注册bean
matches()中有两个参数:
ConditionContext:判断条件能使用的上下文(环境)
AnnotatedTypeMetadata:当前标注了Condition注解的注释信息
//满足当前条件,这个类配置的所有bean注册才能生效
@Conditional({条件})
@Configuration
@Import(Color.class) //导入组件,单个;@Import({Color.class,Red.class,MyImportSelector.class})多个
public class MainCondition{
@Bean
public Car car(){
return new Car("red");
}
}
@Import:
给容器中注册组件
1).包扫描+组件标注注解(@Controller、@Service、@Repository、@Component)【局限于自己写的类】
2).@Bean[导入第三方包里面的组件,可以给它加上@Bean注解注入到容器中]
3).@Import[快速的给容器中导入一个组件,id默认是组件的全类名]
1.@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
2.ImportSelector:是一个接口,返回需要导入的组件的全类名的数组
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector{
//返回值,就是要导入到容器中的组件全类名
//AnnotationMetadata:当前标注@Import注解的类的所有注解信息
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata){
//方法不用返回null值,可以返回空数组[],null值会报错空指针异常
//return null;
return new String[]{};
}
}
3.ImportBeanDefinitionRegistrar:手动注册bean到容器中
4).使用Spring提供的FactoryBean(工厂Bean)
//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color>{
//返回一个Color对象,这个对象会添加到容器中
@Override
public Object getObject() throws Exception {
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
//是否单例?true是单实例,在容器中只会保存一份;false多实例,每次获取都会创建一个新实例(调用getObject()获取)
@Override
public boolean isSingleton() {
return false;
}
}
Object obj = applicationContext.getBean("&colorFactoryBean");//加了&符合,获取的是工厂bean本身,如果没有&符号,获取的是getObject返回的bean
来源:CSDN
作者:明明在学JAVA
链接:https://blog.csdn.net/mrcool2012/article/details/104626160