Day01:Spring容器

1、基本装配

1.0 属性注入和构造器注入的差异

  • 属性注入直白易懂,缺点是对于属性可选的时候,很多个构造函数会显得类很臃肿。
  • 构造注入是一种高内聚的体现,特别是针对有些属性需要在对象在创建时候赋值,且后续不允许修改(不提供setter方法)。

1.1

@Component注解:表明该类会作为组件类,spring为其创建bean,参数为id(也可使用@Named注解为bean设置ID)
@ComponentScan:默认不启用组件扫描,需要显示配置,默认扫描与配置类相同的包,参数为包的名称,

  • 可以设置基础包:@ComponentScan(basePackage={"soundsystem", "video"})
  • 可以指定包中含的类或接口:@ComponentScan(basePackageClassess={CDPlayer.class, DVDPlayer.class})

若使用xml启动组件扫描:

1.2

@Bean(destoryMethod="shutdown")
@Autowired:spring特有,可用@Inject替换,自动装配,可用在构造器或属性的Setter方法上,参数required=true时,没有匹配到bean会抛异常,

1.3 JavaConfig - 通过Java装配bean

  • 给类添加 @Configuration 注解
  • @Bean注解方法,创建所需实例,id与方法名一致,属性name可指定
  • 装配有依赖的bean:
    return new CDPlayer(sgtPeppers()); //sgtPeppers方法也被注解bean,需要在同一个配置类中
    public CDPlayer cdPlyaer(CompactDisc compactDisc) //自动装配CompactDisc到方法中,降低关联

1.4 XML装配bean

  • 创建xml文件,并以 为根
  • 或者 c-命名空间模式 xmlns:c="http://www.springframework.org/schema/c" bean id="cdPlayer" class="" c:cd-ref="引用id" />
  • 使用 元素进行构造器参数的注入 || 使用c:_title或者c:_0进行参数的注入

1.5 属性设置

对强依赖使用构造器注入
对可选性依赖使用属性注入
spring的p-命名空间替代元素:xmlns:p="https://www.springframework.org/schema/p" p:compactDisc-ref="compactDisc //装配compactDisc属性

c-命名空间和p-命名空间:-ref后缀是装配bean,没有装配的就是字面量,不能使用p-空间装配集合,

1.6 组合配置

拆分config

  • @Import导入config
  • 创建更高级别的config,然后组合 @Import({a.class, b.class})
  • javaconfig加载xml
    @ImportResource("classpath:xx-config.xml")
  • xml中引用javaconfig
    //使用java描述

2、高级装配

2.1 profile(环境)

  • profile决定哪个bean创建和不创建,没指定profile则始终都被创建
  • 给bean或方法配置@Profile("***")注解 || 在xml的头添加profile="***"
  • 需要配置激活哪个profile(dispatcherservlet的初始化参数、web应用的上下文参数、JNDI条目、环境变量、JVM系统属性、集成测试时用@ActiveProfiles注解)
  • 配置:spring.profiles.active || spring.profiles.active

3、条件化bean

@Conditional(MagicExistsCondition.class) //条件创建bean public class MagicExistsCondition implements Condition { public boolean matches { return true/false; } }

ConditionContext接口:

  • 检查bean的定义(getRegistry())
  • 检查bean是否存在(getBeanFactory())
  • 检查环境变量(getEnvironment())
  • 检查资源(getResourceLoader())
  • 检查类是否存在(getClassLoader())

AnnotatedTypeMetadate接口:检查带有@Bean注解的方法上还有什么其他的注解(isAnnotated())

3.1.1 自动装配有歧义时

  • 标示首选bean:@Component @Primary || @Bean @Primary || xml中primary="true"
  • 限定自动装配:@Qualifier("限定符_bean_id");
  • 可以给bean设置限定符:@Qualifier("***")

3.2 bean的作用域

在bean的类上使用@Scope注解,参数为ConfigurableBeanFactory.SCOPE_XXXXX

默认所有的bean:单例(singleton)模式

  • 单例singleton:整个应用一个bean实例
  • 原型prototype:每次注入或者通过spring上下文获取的时候都创建新实例
  • 会话session:每个会话
  • 请求request:每个请求

你可能感兴趣的:(Day01:Spring容器)