Spring注解驱动开发(一) 组件扫描,注册与过滤

配置类

使用配置类(java代码)替代了原有的 XML (XML文件)配置方式,简化书写

使用@Configuration注解,IOC容器类型选择为 AnnotationConfigApplicationContext,例如

AnnotationConfigApplicationContext ctx =  new AnnotationConfigApplicationContext(MyConfig.class);

包扫描

@ComponentScan(value={"com.xx"....},includeFilters=@Filter(Filter实现类),excludeFilters=....)
@ComponentScans({@ComponentScan....})
注意useDefaultFilters=false,使用自己的Filter的时候,需要把默认的过滤去掉

作用域

@Scope( value )
value可取下面的值

  • singleton: 单实例,默认
  • prototype: 多实例
  • request: 同请求一个实例
  • session: 同session 一个实例

懒加载

@Lazy 只针对单实例 Bean,因为原型模式不使用是不会去加载的。

条件导入

@Conditional(Conditional)
可以自己定义类实现 Conditional接口并实现 matches()方法。

public class LinuxCondition implements Condition{
  public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){
    //...
    return true;
  }
}

//其中的 ConditionContext 可以获取很多信息
context.getBeanFactory(); //BeanFactory
context.getClassLoader(); //ClassLoader
context.getEnvironment(); //Environment
context.getRegistry(); //BeanDefinitionRegistry

向IOC中导入组件的其他方法

给容器中注入组件就有几种方式

  1. 包扫描+组件注解(@Controller,@Servcie,@Component,@Repository)。这种方式不能导入第三方包的组件
  2. @Bean,可以导入第三方包的组件
  3. @Import,这个注解有几种使用方式
    - @Import(要导入的组件),id是全类名
    - @Import(ImportSelector),ImportSelector是一个接口,实现 String[] selectImports接口,返回值为全类名,id也为全类名
    - @Import(ImportBeanDefinitionRegister),实现ImportBeanDefinitionRegister中的RegiserBeanDefinitions(),手工注册
  4. FactoryBean,工厂Bean。将FactoryBean导入容器中后,通过FactoryBean的id获取具体的Bean,而实际的FactoryBean要通过 &+FactoryBeanId获取
posted @ 2021-05-27 09:50  Taofoo  阅读(119)  评论(0)    收藏  举报