Spring5全栈知识体系

Spring 5 中文解析核心篇-IoC容器之自定义Bean性质

2020-08-28  本文已影响0人  青年IT男

Spring框架提供一些接口,你可以使用这些接口去自定义bean的性质。这个章节包括下面内容:

  1. 生命周期回调

  2. ApplicationContextAwareBeanNameAwar

  3. 其他的Aware接口

1.6.1 生命周期回调

为了与容器的bean的生命周期的管理交互,你可以实现Spring提供的InitializingBeanDisposableBean接口。容器为前者调用afterPropertiesSet()并为后者调用destroy(),以使Bean在初始化和销毁Bean时执行某些操作。

在现代化的Spring应用中,JSR-250@PostConstruct@PreDestroy注解是一般被考虑的最好实践去接收生命周期回调。使用这些注解意味着你的这些bean不需要耦合Spring规范接口。更多详情,查看@PostConstruct@PreDestroy

如果你不想去使用JSR-250注解,但是你仍然想移除耦合,考虑init-method和destroy-methodbean的元数据定义。

内部地,Spring框架使用BeanPostProcessor实现去处理任何的回调接口,它能找到和调用适合的方法。如果你需要定制特性或者其他的生命周期行为Spring默认没有提供,你需要自己实现一个BeanPostProcessor。关于更多的信息,查看容器扩展点

除了初始化和销毁回调外,Spring管理的对象还可以实现Lifecycle接口以便这些对象可以在容器自身的生命周期的驱动下参与启动和关闭过程。

生命周期回调接口在这章节中描述。

1.6.2 ApplicationContextAwareBeanNameAware

ApplicationContext创建一个对象实例同时实现了org.springframework.context.ApplicationContextAware接口,这个实例提供一个对ApplicationContext的引用。下面的清单显示了ApplicationContextAware接口的定义:

public interface ApplicationContextAware {

    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}

因此,这些bean可以编程地操作ApplicationContext创建它们,通过ApplicationContext接口或者转换引用为已知的这个接口的子类(例如:ConfigurableApplicationContext,它暴露了附加的功能)。一种用途是通过编程方式检索其他bean。有时候这个能力非常有用。然而,一般的,你应该避免它,因为它耦合Spring的代码并且不遵循控制反转格式,将协调者作为bean的属性。ApplicationContext其他方法提供获取资源文件、发布应用事件和访问MessageSource。这些额外的特性在ApplicationContext的附加能力中描述

自动装配是获得对ApplicationContext的引用的另一种选择。传统的constructorbyType自动装配模式(在自动装配协作器中描述)能够为构造函数或者Setter方法参数提供一个ApplicationContext类型的依赖。为了获得更大的灵活性,包括自动装配字段和多个参数方法的能力,可以使用基于注解的自动装配特性。如果这样做,ApplicationContext自动装配到字段、构造参数或方法参数,如果字段、构造函数或方法带有@Autowired注解那么该参数期望ApplicationContext类型。更多的信息,查看使用@Autowired

ApplicationContext创建一个类并且实现org.springframework.beans.factory.BeanNameAware接口时,该类将获得对其关联对象定义中定义的名称的引用。下面清单显示BeanNameAware接口定义:

public interface BeanNameAware {

    void setBeanName(String name) throws BeansException;
}

这个回调在bean被填充之后被调用,但是在初始化回调之前例如InitializingBeanafterPropertiesSet或者自定义init-method

参考代码:com.liyong.ioccontainer.starter.XmlAwareIocContainer

1.6.3 其他Aware接口

除了ApplicationContextAwareBeanNameAware之外,Spring提供了广泛的Aware回调接口,这些接口使Bean向容器指示它们需要一些基础结构依赖性。作为基本规则,这个名字指示依赖类型。下面的表格总结最重要的Aware接口:

Name Injected Dependency Explained in…
ApplicationContextAware 注入 ApplicationContext. ApplicationContextAwareand BeanNameAware
ApplicationEventPublisherAware 注入ApplicationEventPublisher. Additional Capabilities of the ApplicationContext
BeanClassLoaderAware Class loader used to load the bean classes. Instantiating Beans
BeanFactoryAware 注入 BeanFactory. ApplicationContextAwareand BeanNameAware
BeanNameAware 注入BeanName ApplicationContextAwareand BeanNameAware
BootstrapContextAware 注入BootstrapContext JCA CCI
LoadTimeWeaverAware 注入LoadTimeWeaver. Load-time Weaving with AspectJ in the Spring Framework
MessageSourceAware 注入MessageSource Additional Capabilities of the ApplicationContext
NotificationPublisherAware 注入NotificationPublisher. Notifications
ResourceLoaderAware 注入ResourceLoader Resources
ServletConfigAware 注入ServletConfig. Spring MVC
ServletContextAware 注入ServletContext. Spring MVC

再次注意,使用这些接口关联到你的代码到Spring API并且不遵循控制反转的风格。我们推荐使用基础设施bean需要编程的去容器获取。

作者

个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。

博客地址:http://youngitman.tech

CSDN:https://blog.csdn.net/liyong1028826685

微信公众号:


qrcode_for_gh_2a18e179fcca_430-2.jpg

技术交流群:


草料活码430*430.png
上一篇下一篇

猜你喜欢

热点阅读