-
@configuration 配置类==配置文件 高速spring这是一个配置文件
-
@bean 给容器中注册一个bean;类型为返回值的类型,id默认是用方法名字作为id
-
@componentScan 来指定包扫描同样的可以和xml中一样增加过滤规则
@ComponentScan(value = "com.cxf",excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class}) }) @ComponentScan(value="com.cxf",includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes ={Service.class}) })
-
ioc组件中的实例默认都是单实例的,我们可以通过@Scope来改变,prototype多实例的,singleton即单例,默认单实例,容器启动时就会直接创建,如果是多实例,在使用时才会去创建对象
-
单实例bean默认是容器启动的时候就创建对象,懒加载,及容器启动的时候不会创建对象,使用时才会创建使用 @lazy
-
按照条件给容器中注册bean @conitional({conditon}) 按照一定的条件进行判断,满足条件给容器中注册bean
- 可以加在方法上也可以加在类上
- 加在方法上
public class linuxCondition implements Condition {
//参数含义分别为判断条件能使用的上下文 及 注释信息
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//TODO:获取bean工厂
ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
//TODO:获取类加载器
ClassLoader classLoader = conditionContext.getClassLoader();
//TODO:获取bean的定义信息
BeanDefinitionRegistry registry = conditionContext.getRegistry();
//TODO:获取环境变量
Environment environment = conditionContext.getEnvironment();
return environment.getProperty("os.name").contains("linux");
}
}
@Bean("linux")
@Conditional({linuxCondition.class})
public person test2(){
return new person("linux",10);
}
-
给容器中注册组件
-
包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
-
@bean 导入的第三方包里面的组件
-
@import[快速的给容器中导入组件] 导入组件id默认是组件的全限定类名
1.@Import({com.cxf.test.bean.color.class}) 容器中就会直接注册这个组件; 2.ImportSelector:返回需要导入的组件的全类名数组 @Import({MyImportSelector.class})//配置类要加的注解 public class MyImportSelector implements ImportSelector { //返回值,就是导入到容器中的组件的全类名数组 //AnnotationMetadata 当前标注@import注解的类的所有注解的信息 public String[] selectImports(AnnotationMetadata annotationMetadata) { //方法不要返回null值 String[] arr={"com.cxf.test.bean.feifei"}; return arr; } } 3.ImportBeanDefinitionRegistrar @Import({MyImportSelector.class})//配置类要加的注解 public class MyImportSelector implements ImportBeanDefinitionRegistrar { public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean windows = registry.containsBeanDefinition("windows"); boolean config = registry.containsBeanDefinition("config"); if(windows&& config){ //指定bean的定义信息\ //创建beandefinition RootBeanDefinition beanDefinition=new RootBeanDefinition(); //设置全路径类名 beanDefinition.setBeanClass(com.cxf.test.bean.dog.class); //设置scope beanDefinition.setScope("singleton"); //注册beandefinition registry.registerBeanDefinition("chenfeifei",beanDefinition); } } }
-
-
使用springbean进行组件注册(工厂bean)
@Import({MyFactoryBean.class})//容器中的id为工厂的全类名,但是实际类型还是生产的类型 public class MyFactoryBean implements FactoryBean<feifeizhu> { public feifeizhu getObject() throws Exception { return new feifeizhu(); } public Class<?> getObjectType() { return feifeizhu.class; } /** * TODO:是单例? * true:这个bean是单实例,在容器中保存一份 * false:这个bean是多实例,每次获取都会创建一个 * @return */ public boolean isSingleton() { return true; } }
Object bean = context.getBean("&com.cxf.test.condition.MyFactoryBean"); System.out.println(bean.getClass()); 1.默认获取到的是工厂bean调用getobject()创建的对象 2.要获取工厂bean本身,我们需要给id前边加一个&如上边代码示例