Spring常用的几个注解@Configuration、@Bean、@ComponentScan

@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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值