在优锐课最新Java架构学习分享中,了解有关使用Aware接口访问Spring bean生命周期事件的更多信息,详细的思维导图让在迷茫中的人眼前一亮。码了很多专业的相关知识, 分享给大家参考学习。
Spring Aware界面允许你查看Spring Framework的内部工作原理。通过Spring Aware接口,你可以访问Spring上下文或Spring bean生命周期事件。
你的Spring Bean可能需要访问框架对象,例如ApplicationContext,BeanFactory和ResourceLoader。为了获得访问权限,bean可以实现Spring Framework的许多Aware接口之一。
当bean实现Aware接口时,Spring框架通过回调样式方法将特定的框架对象注入bean。 Spring注入的对象取决于bean实现的接口。例如,如果bean实现了ApplicationContextAware接口,Spring将向bean中注入ApplicationContext对象。
在这篇文章中,我们将了解Spring感知的接口,特别是ApplicationContextAware,BeanFactoryAware和BeanNameAware接口。
在bean生命周期中,Spring框架在填充bean属性之后并且在使用BeanPostProcessor进行预初始化之前调用感知接口方法。
ApplicationContextAware接口
在Spring Bean中,你可能需要访问ApplicationContext。 例如,如果你的bean需要查找其他一些bean。 同样,如果你的bean需要访问bean中的某些应用程序文件资源甚至发布一些应用程序事件,则需要访问ApplicationContext。
Spring提供了一个ApplicationContextAware接口,该接口允许bean访问ApplicationContext。 该接口提供了一个setApplicationContext方法。
void setApplicationContext(ApplicationContext applicationContext)
throws BeansException
以下代码显示了ApplicationContextAware的用法。
package guru.springframework.springawaredemo.awareimpls;
import guru.springframework.springawaredemo.domain.User;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class ApplicationContextAwareImpl implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
User user = (User) applicationContext.getBean("user");
System.out.println("User Id: " + user.getUserId() + " User Name :" + user.getName());
}
}
前面的代码是实现ApplicationContextAware的bean的代码。 该代码将覆盖setApplicationContext()方法,以使用注入的ApplicationContext使用id用户查找另一个bean。
BeanFactoryAware接口
Bean可能需要访问创建它的Bean工厂,例如要从Bean工厂调用任何服务。
如果需要获取对bean工厂的引用,请实现BeanFactoryAware接口。 此接口提供setBeanFactory()方法。
void setBeanFactory(BeanFactory beanFactory)
前面的setBeanFactory()是一个回调,它将拥有的工厂提供给Bean实例。
这是实现BeanFactoryAware接口的bean的示例。
package guru.springframework.springawaredemo.awareimpls;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
public class BeanFactoryAwareImpl implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println(beanFactory.getBean("user"));
}
}
BeanNameAware接口
BeanNameAware接口由需要访问在Spring容器中定义的名称的bean实现。 此接口提供setBeanName()方法。
void setBeanFactory(BeanFactory beanFactory)
前面的setBeanFactory()是一个提供bean名称的回调。
这是实现BeanNameAware接口的Bean的示例。
package guru.springframework.springawaredemo.awareimpls;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
public class BeanFactoryAwareImpl implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println(beanFactory.getBean("user"));
}
}
摘要
尽管我只介绍了三个,但还有其他一些可感知的界面。 Aware API文档提供了完整的详细信息。
我要特别提到的一个接口是ResourceLoaderAware接口。如果Bean需要加载类路径或文件系统中存在的资源,请实现此接口。在实现ResourceLoaderAware时,会向你的bean通知其在其中运行的ResourceLoader(通常是ApplicationContext)。这是通过ApplicationContextAware接口替代完全ApplicationContext依赖性的一种选择。
我并不特别喜欢有意识的界面。实现它们会将你的应用程序与Spring框架联系在一起,从而颠倒了整个控制反转概念。在理想的世界中,你的应用程序应该根本不知道由ApplicationContext管理或与任何框架对象捆绑在一起。
另外,请注意ApplicationContextAware是至少自2.0版以来已经存在的旧版本。 @Autowired ApplicationContext applicationContext和@Inject ApplicationContext applicationContext是较新的机制,但是它们的工作方式几乎相同。尽管更新的代码需要更少的代码输入,但我可能会选择使用ApplicationContextAware,因为它在语义上清楚了它的含义。
喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群 V–(ddmsiqi)来交流学习,里面都是同行,验证【CSDN2】有资源共享。
不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代