• Spring in Action学习笔记(1)


    Spring基础

    IoC 控制反转, 也称为DI-依赖注入

    一、装配bean

    推荐顺序:自动装配 -> JavaConfig装配 -> XML装配

    1. 自动装配

    1. @Component 注解:表明该类会作为组件类,并告知Spring要为这个类创建bean。该bean的ID为第一个字母小写的类名;
      @ComponentScan 注解:告诉Config配置类启用组件扫描,默认扫描的基础包为该配置类相同的包以及下面的子包。
      @Autowired 注解:将bean注入对象中
      @Test 注解:测试用,单元测试junit需要使用junit-4.x.jar + hamcrest-core-1.x.jar

    2. @Component("yourName") 注解:为bean指定一个ID。@Named("yourName")作用相同。

      以下方式可以手动指定组件扫描的基础包:

      • @ComponentScan("yourBasePackage")
      • @ComponentScan(basepackages = "yourBasePackage")
      • @ComponentScan(basepackages = {"yourBasePackage1", "yourBasePackage2"})

      以上例子使用String来表示基础包,类型不安全(not type-safe)。

      直接指定包中的类或接口:(标记空接口)

      • @ComponentScan(basePackageClasses = {class1.class, class2.class})

      @Autowired 还可作用于函数的参数。@Inject 作用基本相同

    2. JavaConfig装配

    此种方法不需要@Component和@ComponentScan

    @Configuration 注解表明某类是一个配置类

    @Bean 注解告诉Spring,该方法会返回一个对象,该对象要注册为Spring上下文中的bean。默认该bean的ID与方法名一致。

    @Bean(name = "yourBeanName") 可以指定bean的ID。

    3. XML装配

    • [ ] TODO

    二、高级装配

    Profile注解

    @Profile("dev"/"prod"/"qa") 注解配置类或bean,表明是开发环境、生产环境、QA环境时才创建对应的bean。

    通过设置spring.profiles.active属性或spring.profiles.default属性来激活对应的profile

    • 作为DispatcherServlet的初始化参数
    • 作为Web应用的上下文参数
    • 作为JNDI条目
    • 作为环境变量
    • 作为JVM的系统属性
    • 在集成测试类上,使用@ActiveProfiles注解设置

    条件化的bean

    @Conditional(thisIsACondition.class) 注解,thisIsACondition类实现Condition接口,

    public interface Condition{
        boolean matches(ConditionContext ctxt, AnnotatedTypeMetadata metadata);
    }
    

    matches返回true时,对应被注解的bean会被创建

    自动装配歧义

    当@Component注解的多个class都实现了某个interface时,被@Autowired注解的函数使用该接口作为参数时,出现歧义:

    @Primary 注解首选的bean

    @Qualifier("wantedBean") 注解与@Autowired或@Inject组合使用,所设置的参数是想注入的bean的限定符(若没有指定其它限定符,bean的限定符默认与ID一致)

    @Qualifier("xxx") 注解与@Component或@Bean组合使用,手动设置bean的限定符

    当想使用多个限定符来精确缩小可选bean时,由于不能在一个条目上使用多个@Qualifier,可以自定义一个@xxx注解,在定义时加上@Qualifier注解,这个自定义注解就成为了限定符注解

    @Target({ElementType.CONSTRUCTOR, ElementType.FIELD
             ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Qualifier
    public @interface xxx(){}
    

    bean的作用域

    • 单例(Singleton):在整个应用中,只创建bean的一个实例,默认。
    • 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
    • 会话(Session):在Web应用中,为每个会话创建一个bean实例.
    • 请求(Request):在Web应用中,为每个请求创建一个bean实例.

    @Scope与@Component或@Bean组合使用:

    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

    @Scope("prototype")

    运行时注入

    @PropertySource("classpath:/a/b/c/app.properties") 注解配置类,声明属性源。通过Environment来检索属性。

    Environment env;
    env.getProperty("some.property");
    

    getProperty(): 获取属性值

    getRequiredProperty(): 这个属性必须要定义,否则抛出IllegalStateException异常

    containsProperty(): 检查一下某个属性是否存在

    getPropertyAsClass(): 将属性解析为类

    String[] getActiveProfiles(): 返回激活profile名称的数组;

    String[] getDefaultProfiles(): 返回默认profile名称的数组;

    boolean acceptsProfiles(String... profiles): 如果environment支持给定profile的话,就返回true。

    • 属性占位符:"${...}"

      • 可用在XML文件中

      • 自动装配时,使用@Value("${some.property}")注解,并需要配置一个PropertySourcesPlaceholderConfigurer bean

    • Spring表达式语言(SpEL): "#{...}"

      例如: "#{T(System).currentTimeMillis()}": T()表达式会将java.lang.System视为Java中对应的类型

      @Value("#{some.property}")

      @Value("#{systemProperties['some.property']}")

      • [ ] TODO
  • 相关阅读:
    web项目中加斜杠与不加斜杠
    事务是什么,以及事务四个特性
    Java中 a+=b和a=a+b有什么区别?
    JAVA基础15
    JAVA基础13
    JAVA基础12
    JAVA基础11
    JAVA基础10
    DELPHI下的SOCK编程
    设置VSS2005使支持通过Internet访问(转)
  • 原文地址:https://www.cnblogs.com/caophoenix/p/11240488.html
Copyright © 2020-2023  润新知