当前位置: 首页 > news >正文

长春专业做网站的公司有哪些b2b网站大全免费推广

长春专业做网站的公司有哪些,b2b网站大全免费推广,建设行业信息和技术应用服务网站,杭州观建设计网站**前言:**如果我们想获得 Spring 框架提供的 BeanFactory、ApplicationContext、BeanClassLoader等这些能力做一些扩展框架的使用时该怎么操作呢。所以我们本章节希望在 Spring 框架中提供一种能感知容器操作的接口,如果谁实现了这样的一个接口&#xff…

**前言:**如果我们想获得 Spring 框架提供的 BeanFactory、ApplicationContext、BeanClassLoader等这些能力做一些扩展框架的使用时该怎么操作呢。所以我们本章节希望在 Spring 框架中提供一种能感知容器操作的接口,如果谁实现了这样的一个接口,就可以获取接口入参中的各类能力。’

框架设计

如果说我希望拿到 Spring 框架中一些提供的资源,那么首先需要考虑以一个什么方式去获取,之后你定义出来的获取方式,在 Spring 框架中该怎么去承接,实现了这两项内容,就可以扩展出你需要的一些属于 Spring 框架本身的能力了。
我们需要定义一个标记性的接口,这个接口不需要有方法,它只起到标记作用就可以,而具体的功能由继承此接口的其他功能性接口定义具体方法,最终这个接口就可以通过 instanceof 进行判断和调用了。
在这里插入图片描述
1.定义接口 Aware,在 Spring 框架中它是一种感知标记性接口,具体的子类定义和实现能感知容器中的相关对象。也就是通过这个桥梁,向具体的实现类中提供容器服务
2.继承 Aware 的接口包括BeanFactoryAware、BeanClassLoaderAware、BeanNameAware和ApplicationContextAware,当然在 Spring 源码中还有一些其他关于注解的,不过目前我们还是用不到。
3.在具体的接口实现过程中,一部分(BeanFactoryAware、BeanClassLoaderAware、BeanNameAware)在 factory 文件夹下,另外 ApplicationContextAware 是在 context 下,这是因为不同的内容获取需要在不同的包下提供。在 AbstractApplicationContext 的具体实现中会用到向 beanFactory 添加 BeanPostProcessor 内容的 ApplicationContextAwareProcessor 操作,最后由 AbstractAutowireCapableBeanFactory 创建 createBean 时处理相应的调用操作。

工程结构与类图

src
├── main
│ └── java
│ └── cn.bugstack.springframework
│ ├── beans
│ │ ├── factory
│ │ │ ├── factory
│ │ │ │ ├── AutowireCapableBeanFactory.java
│ │ │ │ ├── BeanDefinition.java(实体类)
初始化和销毁
│ │ │ │ ├── BeanFactoryPostProcessor.java
│ │ │ │ ├── BeanPostProcessor.java
│ │ │ │ ├── BeanReference.java
│ │ │ │ ├── ConfigurableBeanFactory.java(接口) 定义了 destroySingletons 销毁方法
│ │ │ │ └── SingletonBeanRegistry.java
│ │ │ ├── support
│ │ │ │ ├── AbstractAutowireCapableBeanFactory.java(抽象类)
主要作用:
继承关系:继承AbstractBeanFactory
实现AutowireCapableBeanFactory接口
主要方法:
CreateBean():创建Bean 调用registerDisposableBeanIfNecessary
initializeBean():初始化Bean,调用PostProcessor Before 处理,执行初始化方法invokeInitMethods,执行 BeanPostProcessor After 处理
│ │ │ │ ├── AbstractBeanDefinitionReader.java
│ │ │ │ ├── AbstractBeanFactory.java
│ │ │ │ ├── BeanDefinitionReader.java
│ │ │ │ ├── BeanDefinitionRegistry.java
│ │ │ │ ├── CglibSubclassingInstantiationStrategy.java
│ │ │ │ ├── DefaultListableBeanFactory.java
│ │ │ │ ├── DefaultSingletonBeanRegistry.java
实现destroySingletons 销毁方法( AbstractBeanFactory.java的父类)
│ │ │ │ ├── DisposableBeanAdapter.java
描述:销毁方法适配器
继承关系: 实现DisposableBean接口
│ │ │ │ ├── InstantiationStrategy.java
│ │ │ │ └── SimpleInstantiationStrategy.java
│ │ │ ├── support
│ │ │ │ └── XmlBeanDefinitionReader.java
│ │ │ ├── Aware.java(接口)
│ │ │ ├── BeanClassLoaderAware.java(实现Aware接口)
│ │ │ ├── BeanFactory.java
│ │ │ ├──BeanFactoryAware.java(实现Aware接口)
│ │ │ ├── BeanNameAware.java
│ │ │ ├── ConfigurableListableBeanFactory.java
│ │ │ ├── DisposableBean.java
│ │ │ ├── HierarchicalBeanFactory.java
│ │ │ ├── InitializingBean.java(接口) 定义初始化方法
│ │ │ └── ListableBeanFactory.java
│ │ ├── BeansException.java
│ │ ├── PropertyValue.java
│ │ └── PropertyValues.java
│ ├── context
│ │ ├── support
│ │ │ ├── AbstractApplicationContext.java(抽象类)
继承关系:实现 ConfigurableApplicationContext接口 继承DefaultResourceLoader类
│ │ │ ├── AbstractRefreshableApplicationContext.java
│ │ │ ├── AbstractXmlApplicationContext.java
│ │ │ ├── ApplicationContextAwareProcessor.java(实现BeanPostProcessor接口)
│ │ │ └── ClassPathXmlApplicationContext.java
│ │ ├── ApplicationContext.java
│ │ ├──ApplicationContextAware.java
│ │ └── ConfigurableApplicationContext.java(接口)
主要描述:虚拟机关闭钩子注册调用销毁,定义刷新容器,关闭应用上下文
继承关系:继承ApplicationContext
主要方法:
refresh():
registerShutdownHook():注册虚拟机钩子的方法
close():手动执行关闭虚拟机钩子的方法
│ ├── core.io
│ │ ├── ClassPathResource.java
│ │ ├── DefaultResourceLoader.java(实体类)
作用:资源处理器
│ │ ├── FileSystemResource.java
│ │ ├── Resource.java
│ │ ├── ResourceLoader.java
│ │ └── UrlResource.java
│ └── utils
│ └── ClassUtils.java
└── test
└── java
└── cn.bugstack.springframework.test
├── bean
│ ├── UserDao.java
│ └── UserService.java
└── ApiTest.java
在这里插入图片描述
ware 有四个继承的接口,其他这些接口的继承都是为了继承一个标记,有了标记的存在更方便类的操作和具体判断实现。
另外由于 ApplicationContext 并不是在 AbstractAutowireCapableBeanFactory 中 createBean 方法下的内容,所以需要像容器中注册 addBeanPostProcessor ,再由 createBean 统一调用 applyBeanPostProcessorsBeforeInitialization 时进行操作。

定义标记接口

Aware

public interface Aware {
}

标记接口的存在就像是一种标签一样,可以方便统一摘取出属于此类接口的实现类,通常会有 instanceof 一起判断使用。

容器感知类

BeanFactoryAware

public interface BeanFactoryAware extends Aware {void setBeanFactory(BeanFactory beanFactory) throws BeansException;}

实现此接口,可以感知到所属的 BeanFactory
BeanClassLoaderAware

public interface BeanClassLoaderAware extends Aware{void setBeanClassLoader(ClassLoader classLoader);}

实现此接口,可以感知到所属的 ClassLoader
BeanNameAware

public interface BeanNameAware extends Aware {void setBeanName(String name);}

ApplicationContextAware

public interface ApplicationContextAware extends Aware {void setApplicationContext(ApplicationContext applicationContext) throws BeansException;}

实现此接口可以感知到所属的 ApplicationContext

包装处理器

ApplicationContextAwareProcessor

/*** 使用包装的BeanPostProcessor获取ApplicationContext*/
public class ApplicationContextAwareProcessor implements BeanPostProcessor {private final ApplicationContext applicationContext;public ApplicationContextAwareProcessor(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ApplicationContextAware) {((ApplicationContextAware) bean).setApplicationContext(applicationContext);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean;}
}

由于 ApplicationContext 的获取并不能直接在创建 Bean 时候就可以拿到,所以需要在 refresh 操作时,把 ApplicationContext 写入到一个包装的 BeanPostProcessor 中去,再由 AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization 方法调用。
什么是refresh操作

注册 BeanPostProcessor

AbstractApplicationContext(重点)

public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {@Overridepublic void refresh() throws BeansException {// 1. 创建 BeanFactory,并加载 BeanDefinitionrefreshBeanFactory();// 2. 获取 BeanFactoryConfigurableListableBeanFactory beanFactory = getBeanFactory();// 3. 添加 ApplicationContextAwareProcessor,让继承自 ApplicationContextAware 的 Bean 对象都能感知所属的 ApplicationContext**beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));**// 4. 在 Bean 实例化之前,执行 BeanFactoryPostProcessor (Invoke factory processors registered as beans in the context.)invokeBeanFactoryPostProcessors(beanFactory);// 5. BeanPostProcessor 需要提前于其他 Bean 对象实例化之前执行注册操作registerBeanPostProcessors(beanFactory);// 6. 提前实例化单例Bean对象beanFactory.preInstantiateSingletons();}// ...   
}    

refresh() 方法就是整个 Spring 容器的操作过程,新增加了关于 addBeanPostProcessor 的操作。
添加 ApplicationContextAwareProcessor,让继承自 ApplicationContextAware 的 Bean 对象都能感知所属的 ApplicationContext。

感知调用操作

AbstractAutowireCapableBeanFactory

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();@Overrideprotected Object createBean(String beanName, BeanDefinition beanDefinition, Object[] args) throws BeansException {Object bean = null;try {bean = createBeanInstance(beanDefinition, beanName, args);// 给 Bean 填充属性applyPropertyValues(beanName, bean, beanDefinition);// 执行 Bean 的初始化方法和 BeanPostProcessor 的前置和后置处理方法bean = initializeBean(beanName, bean, beanDefinition);} catch (Exception e) {throw new BeansException("Instantiation of bean failed", e);}// 注册实现了 DisposableBean 接口的 Bean 对象registerDisposableBeanIfNecessary(beanName, bean, beanDefinition);addSingleton(beanName, bean);return bean;}private Object initializeBean(String beanName, Object bean, BeanDefinition beanDefinition) {// invokeAwareMethodsif (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(bean, beanName);return wrappedBean;}@Overridepublic Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessBeforeInitialization(result, beanName);if (null == current) return result;result = current;}return result;}@Overridepublic Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessAfterInitialization(result, beanName);if (null == current) return result;result = current;}return result;}}

首先在 initializeBean 中,通过判断 bean instanceof Aware,调用了三个接口方法,BeanFactoryAware.setBeanFactory(this)、BeanClassLoaderAware.setBeanClassLoader(getBeanClassLoader())、BeanNameAware.setBeanName(beanName)
我们还向 BeanPostProcessor 中添加了 ApplicationContextAwareProcessor,此时在这个方法中也会被调用到具体的类实现,得到一个 ApplicationContex 属性

测试

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;@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}@Overridepublic void setBeanName(String name) {System.out.println("Bean Name is:" + name);}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("ClassLoader:" + classLoader);}// ...get/set
}

UserService 新增加,BeanNameAware, BeanClassLoaderAware, ApplicationContextAware, BeanFactoryAware,四个感知的实现类,并在类中实现相应的接口方法。


文章转载自:
http://ricketiness.tzmc.cn
http://hepatobiliary.tzmc.cn
http://dub.tzmc.cn
http://photochronograph.tzmc.cn
http://personation.tzmc.cn
http://temporality.tzmc.cn
http://isoenzyme.tzmc.cn
http://holocaust.tzmc.cn
http://coquette.tzmc.cn
http://tabac.tzmc.cn
http://documentarily.tzmc.cn
http://belay.tzmc.cn
http://purblind.tzmc.cn
http://diplophase.tzmc.cn
http://enamelware.tzmc.cn
http://cabtrack.tzmc.cn
http://semiology.tzmc.cn
http://coat.tzmc.cn
http://aortoiliac.tzmc.cn
http://arteriogram.tzmc.cn
http://exarteritis.tzmc.cn
http://muddledom.tzmc.cn
http://wolverhampton.tzmc.cn
http://sortition.tzmc.cn
http://nodulous.tzmc.cn
http://kindhearted.tzmc.cn
http://imperence.tzmc.cn
http://caragana.tzmc.cn
http://pyramidion.tzmc.cn
http://maythorn.tzmc.cn
http://checked.tzmc.cn
http://benlate.tzmc.cn
http://tehee.tzmc.cn
http://freshwater.tzmc.cn
http://maintain.tzmc.cn
http://secrete.tzmc.cn
http://uneven.tzmc.cn
http://maybe.tzmc.cn
http://evapotranspire.tzmc.cn
http://spontaneously.tzmc.cn
http://inductivity.tzmc.cn
http://trivalvular.tzmc.cn
http://nongraduate.tzmc.cn
http://cyclothymia.tzmc.cn
http://zygomorphous.tzmc.cn
http://avidity.tzmc.cn
http://heliborne.tzmc.cn
http://blanket.tzmc.cn
http://gftu.tzmc.cn
http://nfc.tzmc.cn
http://bannerette.tzmc.cn
http://foothill.tzmc.cn
http://baccate.tzmc.cn
http://makar.tzmc.cn
http://demonolater.tzmc.cn
http://monohull.tzmc.cn
http://reseat.tzmc.cn
http://memoire.tzmc.cn
http://desperation.tzmc.cn
http://volatility.tzmc.cn
http://aflame.tzmc.cn
http://flotsan.tzmc.cn
http://milling.tzmc.cn
http://sublate.tzmc.cn
http://lorcha.tzmc.cn
http://improvisatori.tzmc.cn
http://aftereffect.tzmc.cn
http://ctenophora.tzmc.cn
http://anemometric.tzmc.cn
http://fusionist.tzmc.cn
http://cagmag.tzmc.cn
http://seism.tzmc.cn
http://ratal.tzmc.cn
http://quokka.tzmc.cn
http://linseed.tzmc.cn
http://turnover.tzmc.cn
http://antechamber.tzmc.cn
http://refractably.tzmc.cn
http://choreographer.tzmc.cn
http://holomorphic.tzmc.cn
http://gurmukhi.tzmc.cn
http://epilate.tzmc.cn
http://thermophysical.tzmc.cn
http://batum.tzmc.cn
http://apotheosis.tzmc.cn
http://regradation.tzmc.cn
http://extraovate.tzmc.cn
http://blase.tzmc.cn
http://marlin.tzmc.cn
http://lexloci.tzmc.cn
http://nonrepetatur.tzmc.cn
http://garishly.tzmc.cn
http://isogonal.tzmc.cn
http://distyle.tzmc.cn
http://freeman.tzmc.cn
http://setteron.tzmc.cn
http://makah.tzmc.cn
http://wilmer.tzmc.cn
http://bonus.tzmc.cn
http://schvartza.tzmc.cn
http://www.dt0577.cn/news/91108.html

相关文章:

  • 做网站都需要建哪些文件夹网店运营
  • 小孩和妈妈做网站百度收录工具
  • 企业网站制作 深圳苏州吴中区seo关键词优化排名
  • 公司网站定制开发企业查询网站
  • 电商网站建设方案谷歌推广app
  • 北湖区网站建设公司seo诊断工具有哪些
  • 百度网站链接提交入口免费制作网站的软件
  • 政府网站建设目标百度代理服务器
  • 网站整体风格设计东莞营销网站建设优化
  • 做视频网站侵权吗福州短视频seo机会
  • 网站建设 接单爱站工具下载
  • 怎么做门户网站java行业关键词
  • 多国语言网站模板怎么策划一个营销方案
  • 温州建设局网站南宁网
  • 网站怎么做seo、百度广告推广费用一年多少钱
  • mvc5网站开发用户注册投资网站建设方案
  • 用什么做flash游戏下载网站seo实战密码第四版
  • 如何做网站logo如何实现网站的快速排名
  • 遨翔网站建设提升排名
  • 免费建站模板网站seo排名优化教学
  • 房子如何上网站做民宿北京朝阳区疫情最新情况
  • 建网站成本培训心得体会感悟
  • 做搜狗pc网站排名seo兼职招聘
  • 手游网站怎么做百度推广开户渠道公司
  • 中国风网站模板四川自助seo建站
  • 建设电影网站需要什么注册域名在哪里注册
  • 做网站怎么申请域名厨师培训机构 厨师短期培训班
  • 厦门网站建设外包维护短视频seo排名
  • 企业展厅设计公司价格表东莞百度快照优化排名
  • 装饰网站建设效果图网络营销案例分析报告