从网站开发到游戏编程有哪些免费ppt模板下载网址

张小明 2026/1/13 0:56:25
从网站开发到游戏编程,有哪些免费ppt模板下载网址,宁波模板网站建站,建站报价表参考小傅哥的教程#xff1a;第09章#xff1a;Aware感知容器对象 | 小傅哥 bugstack 虫洞栈 本期的目标是实现Aware功能#xff0c;Aware是一个顶层接口#xff0c;其拥有众多子类#xff0c;如BeanClassLoaderAware、BeanNameAware、BeanFactoryAware、ApplicationCont…参考小傅哥的教程第09章Aware感知容器对象 | 小傅哥 bugstack 虫洞栈本期的目标是实现Aware功能Aware是一个顶层接口其拥有众多子类如BeanClassLoaderAware、BeanNameAware、BeanFactoryAware、ApplicationContextAware接口实现不同的Aware接口可以使Bean获得不一样的能力。举个例子假设我们的Bean实现了BeanFactoryAware接口那意味着我们的Bean拥有获取Spring中的BeanFactory类对象的权力。因此Aware接口是赋予Bean感知容器中的相关对象具体感知什么对象取决于实现了哪个Aware子类接口。实现Aware首先是顶层接口Aware其只是一个标记性接口/** * 标记类接口实现该接口可以被Spring容器感知 */ public interface Aware { }接下来是各个子接口这些子接口有一个共同特点都提供了相应的set方法。BeanFactoryAware/** * 实现此接口即能感知到所属的 BeanFactory */ public interface BeanFactoryAware extends Aware { void setBeanFactory(BeanFactory beanFactory) throws BeansException; }BeanClassLoaderAware/** * 实现此接口既能感知到所属的 ClassLoader */ public interface BeanClassLoaderAware extends Aware { void setBeanClassLoader(ClassLoader classLoader); }BeanNameAware/** * 实现此接口即能感知到所属的 BeanName */ public interface BeanNameAware extends Aware { void setBeanName(String name); }ApplicationContextAware/** * 实现此接口即能感知到所属的 ApplicationContext */ public interface ApplicationContextAware extends Aware { void setApplicationContext(ApplicationContext applicationContext) throws BeansException; }包装处理器根据之前的学习我们知道管理Bean的流程是先通过XML获取对应的配置文件然后在ApplicationContext中执行refresh操作得到beanFactory最后要回归到BeanFacotry中执行创建对象、依赖注入和各种前置、后置操作。在BeanFacotry中我们很容易能获取到相关的BeanNameBeanFactoryBeanClassLoader对象但是无法获取到ApplicationContext对象因为我们是先在ApplicationContext中执行了一些操作再转到BeanFactory中执行剩余的操作。为了解决在BeanFactory中无法获取ApplicationContext对象的问题我们考虑在ApplicationContext中执行操作时把ApplicationContext封装成一个BeanPostProcessor对象直接把封装后的对象加入到BeanFactory中即可。因此就有了下面这个类/** * 包装处理器 * 负责在 Bean 初始化之前把 Spring 的 ApplicationContext 注入到实现了 * ApplicationContextAware 接口的 Bean 中使这些 Bean 能够感知并访问容器本身。 */ public class ApplicationContextAwareProcessor implements BeanPostProcessor { // 要注入的 Spring 应用上下文 private final ApplicationContext applicationContext; public ApplicationContextAwareProcessor(ApplicationContext applicationContext) { this.applicationContext applicationContext; } /** * 在 Bean 初始化init-method、PostConstruct 等之前调用。 * 如果当前 Bean 实现了 ApplicationContextAware 接口就把容器注入进去。 */ Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // 如果bean 实现了 ApplicationContextAware 接口 if (bean instanceof ApplicationContextAware) { // 注入 ApplicationContext让 Bean 可以访问容器资源 ((ApplicationContextAware) bean).setApplicationContext(applicationContext); } return bean; } /** * 在 Bean 初始化之后调用这里不做任何处理直接返回原 Bean。 */ Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }最后由AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization方法调用即可。注册BeanPostProcessorOverride public void refresh() throws BeansException { // 1. 子类负责创建/刷新 BeanFactory 并加载 BeanDefinition模板方法 refreshBeanFactory(); // 2. 拿到已经完成定义的 BeanFactory模板方法 ConfigurableListableBeanFactory beanFactory getBeanFactory(); // 3. 添加 ApplicationContextAwareProcessor让继承自 ApplicationContextAware 的 Bean 对象都能感知所属的 ApplicationContext // 由于创建Bean的时候无法获取到对应的ApplicationContext, 因此这里先把ApplicationContext做一个包装, 直接在这里获取 // 其余的Aware接口, 包括BeanFactory BeanName 都可以在创建Bean那块获取 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); // 4. 先执行 BeanFactoryPostProcessor允许动态修改/补充 BeanDefinition invokeBeanFactoryPostProcessors(beanFactory); // 5. 再把所有 BeanPostProcessor 提前实例化并注册到工厂后续创建的 Bean 才能被拦截 registerBeanPostProcessors(beanFactory); // 6. 一次性提前实例化所有单例 Beanlazy-initfalse 的 beanFactory.preInstantiateSingletons(); }注意这一块就是前文提到的有一些操作先在ApplicationContext中执行在这个环境下执行的时候我直接把当前ApplicationContext对象封装为BeanPostProcessor交给BeanFactory。感知调用操作private Object initializeBean(String beanName, Object bean, BeanDefinition beanDefinition) { // 先检查Aware接口 // invokeAwareMethods if (bean instanceof Aware) { if (bean instanceof BeanFactoryAware) { ((BeanFactoryAware) bean).setBeanFactory(this); } if (bean instanceof BeanClassLoaderAware){ ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader()); } if (bean instanceof BeanNameAware) { ((BeanNameAware) bean).setBeanName(beanName); } } // 1. 执行 BeanPostProcessor Before 处理 Object wrappedBean applyBeanPostProcessorsBeforeInitialization(bean, beanName); // 执行 Bean 对象的初始化方法 try { invokeInitMethods(beanName, wrappedBean, beanDefinition); } catch (Exception e) { throw new BeansException(Invocation of init method of bean[ beanName ] failed, e); } // 2. 执行 BeanPostProcessor After 处理 wrappedBean applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); return wrappedBean; }这一块在初始化阶段会检查当前Bean是否实现了相应的Aware接口如果有就把相关的对象给到Bean这个在后面的例子中会更好理解。而对于ApplicationContext对象则会在执行BeanPostProcessor的前置操作时执行因为ApplicationContext的封装对象重写了这个方法/** * 在 Bean 初始化init-method、PostConstruct 等之前调用。 * 如果当前 Bean 实现了 ApplicationContextAware 接口就把容器注入进去。 */ Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // 如果bean 实现了 ApplicationContextAware 接口 if (bean instanceof ApplicationContextAware) { // 注入 ApplicationContext让 Bean 可以访问容器资源 ((ApplicationContextAware) bean).setApplicationContext(applicationContext); } return bean; }测试定义UserService类public class UserService implements BeanNameAware, BeanClassLoaderAware, ApplicationContextAware, BeanFactoryAware { private ApplicationContext applicationContext; private BeanFactory beanFactory; private String uId; private String company; private String location; private UserDao userDao; Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory beanFactory; } Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext applicationContext; } Override public void setBeanName(String name) { System.out.println(Bean Name is name); } Override public void setBeanClassLoader(ClassLoader classLoader) { System.out.println(ClassLoader classLoader); } public String queryUserInfo() { return userDao.queryUserName(uId) , company , location; } // 其余 get set 方法 }这里的处理方式是首先实现了各个Aware接口同时在Bean中加入了相关字段用来存储获取到的对象。之后重写接口中的相关set方法获取对象将对象地址给到Bean中的相关字段。这也就赋予了Bean获取Spring中相关容器的能力。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

定制网站制作服务商wordpress安装中文

[toc] 只要 RN 项目里一旦涉及到图片编辑、画布、地图、白板、卡片拖拽这些复杂交互,手势问题几乎是必踩坑。 常见的吐槽包括: 手势一多就开始互相打架JS 线程一忙,动画直接掉帧Reanimated 写到后面自己都不敢改 这篇文章不讲零散 API&#x…

张小明 2026/1/3 10:56:47 网站建设

广东广州网站建设购物网站建设需要公司营业执照吗

Shell 安全:保障脚本与系统安全的全面指南(上) 在计算机系统的世界里,安全问题始终是重中之重。系统安全就像一把双刃剑,许多公司投入大量资金购买系统管理工具,但往往对管理员的培训不足。系统资源短缺的问题最初通常由程序员发现。例如,曾有一家公司规定程序员不能访…

张小明 2026/1/3 10:47:10 网站建设

做网站送的小程序有什么用连接品硕网线做怎么弹网站

企业级Vue工作流引擎:零基础搭建钉钉风格审批系统 【免费下载链接】Workflow 仿钉钉审批流程设置 项目地址: https://gitcode.com/gh_mirrors/work/Workflow 还在为复杂的审批流程配置而烦恼吗?这款基于Vue.js开发的钉钉风格工作流引擎&#xff0…

张小明 2026/1/3 13:19:11 网站建设

微商城网站建设教程建设摩托车官网新款

FaceFusion与Stable Diffusion结合使用的新玩法在AI生成内容(AIGC)迅速普及的今天,越来越多用户不再满足于“随机生成一张好看的脸”——他们想要的是自己的脸出现在理想场景中:穿汉服站在敦煌壁画前、以赛博朋克风格亮相未来都市…

张小明 2026/1/3 10:32:41 网站建设

网站建设与设计毕业设计推广手段

Zen Browser网页翻译功能深度体验:26种语言一键切换的隐私保护利器 【免费下载链接】desktop 🌀 Experience tranquillity while browsing the web without people tracking you! 项目地址: https://gitcode.com/GitHub_Trending/desktop70/desktop …

张小明 2026/1/3 16:29:59 网站建设