Springboot容器接口

Springboot容器接口

目标:

  1. BeanFactory能做那些事
  2. ApplicationContext有哪些扩展功能
  3. 事件解耦

1. beanFactory能干什么
  • 作为spring容器的顶级接口
  • 含有抽象getBean方法
  • DefaultListableBeanFactory为其实现类,并为DefaultSingletonBeanRegistry的子类含有singletonObjects存放bean

在这里插入图片描述

 public static void main(String[] args)  {
        /*可配置的ApplicationContext*/
        ConfigurableApplicationContext context
                = SpringApplication.run(Day01Application.class, args);
     /*反射获取bean*/
Field field = DefaultSingletonBeanRegistry.class.getDeclaredField("singletonObjects");
        field.setAccessible(true);
        ConfigurableListableBeanFactory factory = context.getBeanFactory();
        Map<String,Object> map = (Map<String, Object>) field.get(factory);
        *//*entrySet将map的元素放入set中*//*
        map.entrySet().stream()
                .filter(e->e.getKey().startsWith("component"))
                .forEach(e-> System.out.println(e.getKey()+":"+e.getValue()));
    }

2. ApplicationContext扩展功能

实现的接口:

2.1 MessageSource处理国际化问题
  1. 创建资源目录及文件

  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.2 ResourcePatternResolver处理资源匹配
  1. 获取jar包里的spring.factories文件
 Resource[] resources = context.getResources("classpath*:META-INF/spring.factories");
      for (Resource resource : resources) {
          System.out.println(resource);
      }

2.3 EnvironmentCapable 获取系统和yml、properties中的变量
ConfigurableEnvironment environment = context.getEnvironment();
   String java_home = environment.getProperty("JAVA_HOME");
   System.out.println(java_home);

3. ApplicationEventPublisher 发布和监听
  1. 定制事件

public class UserRegisteredEvent extends ApplicationEvent {
    public UserRegisteredEvent(Object source) {
        super(source);
    }
}
  1. 发布事件
@Component
@Slf4j
public class Component1 {

    /*消息发布*/
    public  void register( @Autowired ApplicationEventPublisher context){
        log.warn("用户注册!!!");
        context.publishEvent(new UserRegisteredEvent(context));
    }
}

  1. 监听和接收事件
@Component
@Slf4j
public class Component2 {
    @EventListener
    /*事件监听*/
    public void SendMessage(UserRegisteredEvent event) {
        log.warn("{}", event);
        log.warn("发送短信");
    }

}

…感觉有点鸡肋


4. 练习 AOP实现3的功能
@Aspect
@Component
@Slf4j
public class SendMessage {
    @Pointcut("@annotation(com.example.day01.aop.Sendxx)")
    public void send(){}
    @Around("send()")
    public Object sendEmail(ProceedingJoinPoint point) throws Throwable {
        Object proceed = point.proceed(point.getArgs());
        log.warn("发送短信!!!");
        return proceed;
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Sendxx {
}

@Component
@Slf4j
public class UserRegister {
    @Sendxx
    public void register(){
        log.warn("用户注册!!");
    }
}
context.getBean(UserRegister.class).register();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值