美文网首页
Day01:Spring容器

Day01:Spring容器

作者: 宇宙超人喵学长 | 来源:发表于2017-07-21 15:39 被阅读0次

    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启动组件扫描:<context:component-scan base-package="soundsystem" />

    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文件,并以 <beans> 为根
    • <bean id='名字' class='类的全名' />
    • <constructor-arg ref="引用的bean的id"> 或者 c-命名空间模式 xmlns:c="http://www.springframework.org/schema/c" bean id="cdPlayer" class="" c:cd-ref="引用id" />
    • 使用 <constructor-arg> 元素进行构造器参数的注入 || 使用c:_title或者c:_0进行参数的注入

    1.5 属性设置

    对强依赖使用构造器注入
    对可选性依赖使用属性注入
    spring的p-命名空间替代<property>元素: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
      <bean class="xx.config /> //使用xml配置 <bean id="player" class="com.player" c:cd-ref="comDisc" /> //使用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容器

          本文链接:https://www.haomeiwen.com/subject/wzqekxtx.html