详解spring中的Aware接口功能

 更新时间:2022年02月15日 09:26:26   作者:jiangfullll  
Spring的依赖注入的最大亮点是所有的Bean对Spring容器的存在是没有意识的,我们可以将Spring容器换成其他的容器,Spring容器中的Bean的耦合度因此也是极低的,本文重点给大家介绍spring中的Aware接口,感兴趣的朋友一起看看吧

在spring中有很多以XXXAware命名的接口,很多人也不清楚这些接口都是做什么用的,这篇文章将描述常用的一些接口。

一,ApplicationContextAware

获取spring容器,用来访问容器中定义的其他bean。实现接口方法public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {}

eg:

package org.company.xxx;
 
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
 * 获取spring容器,以访问容器中定义的其他bean
 */
public class SpringContextUtil implements ApplicationContextAware {
    // Spring应用上下文环境
    private static ApplicationContext applicationContext;
    /**
     * 实现ApplicationContextAware接口的回调方法,设置上下文环境
     */
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
     * 获取对象 这里重写了bean方法,起主要作用
     *
     * @param name
     * @return  Object 一个以所给名字注册的bean的实例
     * @throws BeansException
    public static Object getBean(String beanId) throws BeansException {
        return applicationContext.getBean(beanId);
}

二、ApplicationEventPublisherAware

这是一个事件通知发布接口,实现public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher)方法。实现ApplicationListener<ApplicationEvent>接口的类在onApplicationEvent(ApplicationEvent event)方法中可以监听到这个事件通知。

eg: 源码来源:http://m.blog.csdn.net/article/details?id=50970667

定义事件:

package com.zghw.spring.demo.demo.event;
 
import org.springframework.context.ApplicationEvent;
/**
 * 定义一个发送短信的事件
 * 实现了ApplicationEvent
 * @author zghw
 *
 */
public class SendMessageEvent extends ApplicationEvent {
    private static final long serialVersionUID = 1L;
    //消息对象
    private Message message;
     
    //source代表了发布该事件的发布源
    public SendMessageEvent(Object source,Message message) {
        super(source);
        this.message = message;
    }
    public Message getMessage() {
        return message;
    public void setMessage(Message message) {
}

  定义监听器观察者:

package com.zghw.spring.demo.demo.event;
 
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
 * 发送短信监听器,监听到事件就开始发送。
 * 实现ApplicationListener
 * @author zghw
 *
 */
@Component
public class SendMessageListenter implements ApplicationListener<SendMessageEvent>{
    /**
     * 监听事件SendMessage,当有事件发生则调用该方法
     */
    public void onApplicationEvent(SendMessageEvent event) {
        Message message = event.getMessage();
        String msg=message.getMessage();
        String phone = message.getPhone();
        try {
            System.out.println("开始向手机"+phone+"发送短信,短信内容为:"+msg);
            Thread.sleep(1000);
            System.out.println("发送短信成功!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  定义事件注册中心以及发布事件主题:

package com.zghw.spring.demo.demo.event;
 
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
/**
 * 实现ApplicationEventPublisherAware让容器ApplicationContext作为事件发布中心,
 * 因为ApplicationContext实现了ApplicationEventPublisher
 * @author zghw
 *
 */
@Service
public class UserService implements ApplicationEventPublisherAware{
    private ApplicationEventPublisher publisher;
     
    public void registerUser(String name,String phone) throws InterruptedException{
        System.out.println("注册用户中");
        Thread.sleep(300);
        System.out.println("注册完成!");
         
        Message message=new Message();
        message.setMessage("你好,"+name+" 你中了1000W");
        message.setPhone(phone);
        SendMessageEvent event=new SendMessageEvent(this,message);
        //发布中心发布事件
        publisher.publishEvent(event);
    }
    /**
     * 实现ApplicationEventPublisherAware的方法,spring在使用时UserServicebean对象时会自动帮我们注入
     * ApplicationEventPublisher的实现
     */
    public void setApplicationEventPublisher(
            ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
}

到此这篇关于spring中的Aware接口功能详解的文章就介绍到这了,更多相关spring中的Aware接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 实例详解Java实现图片与base64字符串之间的转换

    实例详解Java实现图片与base64字符串之间的转换

    这篇文章主要介绍了Java实现图片与base64字符串之间的转换实例代码,非常不错,具有参考借鉴价值,需要的朋友参考下
    2016-12-12
  • 详解SpringBoot如何自定义自己的Starter组件

    详解SpringBoot如何自定义自己的Starter组件

    这篇文章主要为大家详细介绍了在SpringBoot中如何自定义自己的Starter组件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • spring配置文件中util:properties和context:property-placeholder用法

    spring配置文件中util:properties和context:property-placeholder用法

    这篇文章主要介绍了spring配置文件中util:properties和context:property-placeholder用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringSecurity框架下实现CSRF跨站攻击防御的方法

    SpringSecurity框架下实现CSRF跨站攻击防御的方法

    CSRF是一种网络攻击方式,也可以说是一种安全漏洞,这种安全漏洞在web开发中广泛存在。这篇文章主要介绍了SpringSecurity框架下实现CSRF跨站攻击防御,需要的朋友可以参考下
    2019-12-12
  • Java 1.0和Java 1.1 的IO类的比较

    Java 1.0和Java 1.1 的IO类的比较

    Java库的IO分为输入/输出两部分。早期的Java 1.0版本的输入系统是InputStream及其子类,输出系统是OutputStream及其子类。后来的Java 1.1版本对IO系统进行了重新设计。本分对此做了分析和比较,有利于学习,最后给出了例子。
    2013-11-11
  • Spring Boot集群管理工具KafkaAdminClient使用方法解析

    Spring Boot集群管理工具KafkaAdminClient使用方法解析

    这篇文章主要介绍了Spring Boot集群管理工具KafkaAdminClient使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 详解java一维数组及练习题实例

    详解java一维数组及练习题实例

    在本篇文章里小编给大家整理了关于java一维数组及练习题的相关知识点和实例代码,有需要的朋友们跟着学习下。
    2019-07-07
  • Java中常见的语法糖分享

    Java中常见的语法糖分享

    Java语法糖是指Java编译器在编译Java源代码时所做的一些特殊处理,使得Java源代码在编译后生成的字节码更加简洁、易读、易维护,Java 中有许多常见的语法糖,本文给大家列举了一些常见的例子,需要的朋友可以参考下
    2023-10-10
  • 关于ArrayList初始创建设定长度问题

    关于ArrayList初始创建设定长度问题

    在使用ArrayList时,初始化长度并不等同于直接设定数组大小,如通过构造函数指定长度,仅仅是在内部开辟了相应的存储空间,并不会改变ArrayList的实际元素个数,即size属性仍然为0,因此,尝试直接访问未实际添加元素的位置会引发异常
    2024-11-11
  • Java HashMap源码及并发环境常见问题解决

    Java HashMap源码及并发环境常见问题解决

    这篇文章主要介绍了Java HashMap源码及并发环境常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论