Spring源码第一讲 容器接口

BeanFactory接口典型功能:

        getbean

ApplicationContext 接口,是 BeanFactory 的子接口。它扩展了 BeanFactory 接口的功能,如:

  • 国际化

  • 通配符方式获取一组 Resource 资源

  • 整合 Environment 环境(能通过它获取各种来源的配置信息)

  • 事件发布与监听,实现组件之间的解耦

1.BeanFactory是ApplicationContext的父接口,是Spring的核心容器,主要的ApplicationContext实现都组合了它的功能。表明只能getBean,实际上控制反转、基本的依赖注入甚至Bean的生命周期都由它的实现类提供。

2. BeanFactory - 表面上只有 getBean
但实际上控制反转、基本的依赖注入、直至 Bean 的生命周期的各种功能, 都由它的实现类提供

Field singletonObjects = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
        singletonObjects.setAccessible(true);
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        Map<String,Object> map= (Map<String, Object>) singletonObjects.get(beanFactory);
        map.entrySet().stream().filter(e->e.getKey().startsWith("component"))
                .forEach(e->{
                    System.out.println(e.getKey()+"="+e.getValue());
                });

 ApplicationContext 组合并扩展了 BeanFactory 的功能国际化、通配符方式获取一组 Resource 资源、整合 Environment 环境、事件发布与监听

1.国际化System.out.println(context.getMessage("hi", null, Locale.CHINA)); System.out.println(context.getMessage("hi", null, Locale.ENGLISH)); System.out.println(context.getMessage("hi", null, Locale.JAPANESE));


2.通配符方式获取一组 Resource 资源

Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
        for (Resource resource : resources) {
            System.out.println(resource);
        }
        System.out.println(context.getEnvironment().getProperty("java_home"));
        System.out.println(context.getEnvironment().getProperty("server.port"));

3.事件发布与监听

context.getBean(Component1.class).register();
package com.itheima.a01copy;

import com.itheima.a01.UserRegisteredEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;

@Component
public class Component1 {

    private static final Logger log = LoggerFactory.getLogger(Component1.class);

    @Autowired
    private ApplicationEventPublisher context;

    public void register() {
        log.debug("用户注册");
        context.publishEvent(new UserRegisteredEvent(this));
    }

}
@Component
public class Component2 {

    private static final Logger log = LoggerFactory.getLogger(Component2.class);

    @EventListener
    public void aaa(UserRegisteredEvent event) {
        log.debug("{}", event);
        log.debug("发送短信");
    }
}

@Autowired
private ApplicationEventPublisher context;表示事件发布

@EventListener表示监听

建议练习:完成用户注册与发送短信之间的解耦,用事件方式、和 AOP 方式分别实现

@Aspect
@Component
public class UserRegistrationAspect {

    private static final Logger log = LoggerFactory.getLogger(UserRegistrationAspect.class);

    @After("execution(* com.itheima.a01copy.Component1.register(..))")
    public void afterUserRegister() {
        // 执行发送短信的逻辑
        log.debug("发送短信");
        log.debug("发送邮件");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值