spring context

注册组件

xml方式

resources下:标签–> ClassPathXmlApplicationContext(“beans.xml”);

注解方式

@Configuration: 放在配置类上。配置类
@Bean: 获取对象的方法,默认id为方法名。可通过注解value指定id。

@ComponentScan:放在配置类上 (value=”top.fan4.dy”,excludeFilter按照不同方式排除,include)==>@ComponentScans。也可自定义过滤规则

@Scope:调整作用域
singleton 默认单例 IOC启动时即创建。饿汉模式 @Lazy 懒加载
prototype 多实例 获取时即重新创建
request(web)
session(web)

@Condational 满足条件时注册bean。可放在类或者方法上
condationClass implements Condation。
@Condational(condationClass.class)

组件注册方式:

  1. 包扫描【@ComponentScan配置类上】 + 组件注解标注(标注了@Controller(controller层),@Service(serice层),@Repository(dao层),@Component)可被扫描加入容器

  2. @Bean 【方法上】 (第三方组件,注册在方法上返回创建对应对象的类即可)

  3. @Import 【配置类上】 (快速给容器导入组件) {Class.class}id为全类名。
    ImportSelector: class MyImportSelector implements ImportSelector{全类名}
    @Import({MyImportSelector.class})
    @ImportBeanDefination 手动注册

    FactoryBean
    class MyBeanFactory implements FactoryBean{}
    @Bean
    public MyBeanFactory MyBeanFactory(){return new MyBeanFactory()}
    xxxx.getBean(“MyBeanFactory”) getBean(“&MyBeanFactory”) ==> 得到实际的bean|MyBeanFactory

生命周期

  1. @Bean() 设置初始化(init)方法和销毁(destory)方法。在创建对象完成和容器关闭时。多实例时不管理bean和销毁。
  2. bean implements InitializingBean,DisposableBean
  3. jsr250 @PostConstruct(方法上使用,对象创建和赋值之后调用) 和 @PreDestory(方法上使用,容器移除对象之前)
  4. BeanPostProcessor【interface】
    BeanPostProcessor
    包装返回obj
    生命周期:初始化->对象创建完成->赋值->初始化方法->BeanPostProcessor->postProcessAfterInitialation

属性赋值

pre: 配置文件的导入:(导入外部文件到运行环境变量)
  1. xml:{context:property-placeholder location=”classpath:person.properties”}
  2. 注解:@PropertySource(value{“classpath:/person.properties”,”files:/etc/conf.properties”},encoding=”utf8”?) 使用位置:配置类上

@Value

  • 普通值
  • #{}:SpEL(spring表达式)。
  • ${}:配置文件(环境变量中的值) 需要@PropertySource先导入

自动装配

利用spring依赖注入完成对IOC中各个组件的依赖关系赋值。

  1. @Autowired(required) 属性从容器中寻找值注入。使用位置:构造器/构造函数上,方法(注入参数)上,参数位置,属性上
    // 优先按照类型去容器中寻找,容器中存在多个按照属性的变量名注入。(Person p;Person p1;)
    // @Primary: 容器创建的方法上使用,注入时使用的默认容器
    // @Qualifier:容器存在多个值时可通过此注解指定使用容器中的某个id容器。
    // 优先级: @Qualifier > @Primary > 默认类型
    @Bean标注的方法中的参数默认从容器中获取。

  2. @Resource(name)和@Inject()[分别来自jsr250,jsr330]
    @Resource:默认按照属性变量名,可通过name属性指定
    @Inject:需要导入javax.Inject,除不支持@Autowired的required属性外,其它相同。

  3. XXAware

  4. @Profile:根据环境激活组件功能。(开发环境/测试环境/生产环境。使用位置:配置类或者@Bean上

    demo:
    @Profile(“dev”) / @Profile(“default”)
    @Bean
    profile激活:

    1. 动态参数:-Dspring.profilesactivate=test
    1. applicationContext.getEnvironment().setActivateProfiles("dev","test");
      applicationContext.register(Configclass.class);
      applicationContext.refresh(); 


resolver
aware