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

公司网站建设长春软件开发app制作公司

公司网站建设长春,软件开发app制作公司,餐饮公司 网站建设,宁波比较好的外贸公司这一篇让我想起来学习 Spring 的时&#xff0c;被 XML 支配的恐惧。明明是写Java&#xff0c;为啥要搞个XML呢&#xff1f;大佬们永远不知道&#xff0c;我认为最难的是 XML 头&#xff0c;但凡 Spring 用 JSON来做配置文件&#xff0c;Java 界都有可能再诞生一个扛把子。 <…

这一篇让我想起来学习 Spring 的时,被 XML 支配的恐惧。明明是写Java,为啥要搞个XML呢?大佬们永远不知道,我认为最难的是 XML 头,但凡 Spring 用 JSON来做配置文件,Java 界都有可能再诞生一个扛把子。

<?xml version="1.0" encoding="UTF-8"?>

那今天我就要来盘一下,突破自己的心里障碍。把 Spring XML 的底裤都给扒掉,最后会发现,原来每个人的身上都有毛毛。

设计一下子

首先想想应该怎么设计这个模块?BeanDefinitionRegistry 这个伙计是大门的保安,把守着资源加载的大门。他的口头禅就是:穿内裤者 或 不打领带者不得入内。

image.png

作为一个专业的前端后端运维测试攻城狮,高内聚低耦合必须手到擒来,面向接口编程更是基本操作。BeanDefinitionReader 接口就是我们的协议,只要符合这个接口协议都能进入我们的大门。

image.png

这可是比武招亲严格多了,你再有本事,不按照规矩来,那也是白搭。

image.png

BeanDefinitionReader 接口一放出去,有两个年轻人,三十多岁,一个叫 XmlBeanDefinitionReader,一个叫 ResouceLoader,他们说要试试。这两个年轻人不知道天高地厚,以为我的类图只有这么点。实际上我只是按照传统功夫的点到为止截图而已。

image.png

不仅如此,我还有流程图。

image.png

上次我太将武德了,右眼睛被人蹭了一下。今天我 18 岁老码农是乱打的,类图,流程图,还有一个不知道什么图,训练有素。现在我就是这么不讲武德,来骗,来偷袭年轻人。你们年轻人自己耗子尾汁。

实现一下子

首先,我们来看看门面担当BeanDefinitionReader

public interface BeanDefinitionReader {  void loadBeanDefinitions(String location) throws IOException;  
}

这家伙就一个方法,简单得很!但是别小看它,这可是整个系统的总指挥!

然后是我们的主角 XmlBeanDefinitionReader

public class XmlBeanDefinitionReader implements BeanDefinitionReader {  private final BeanDefinitionRegistry beanDefinitionRegistry;  public XmlBeanDefinitionReader(BeanDefinitionRegistry beanDefinitionRegistry) {  this.beanDefinitionRegistry = beanDefinitionRegistry;  }  @Override  public void loadBeanDefinitions(String location) throws IOException {  ResourceLoader resourceLoader = new DefaultResourceLoader();  loadBeanDefinitions(resourceLoader.getResource(location));  }  private void loadBeanDefinitions(Resource resource) throws IOException {  InputStream inputSteam = resource.getInputSteam();  doLoadBeanDefinitions(inputSteam);  }  private void loadBeanDefinitions(Resource... resources) throws IOException {  for (Resource resource : resources) {  loadBeanDefinitions(resource);  }  }  private void doLoadBeanDefinitions(InputStream inputStream) {  Document document = XmlUtil.readXML(inputStream);  Element root = document.getDocumentElement();  NodeList childNodes = root.getChildNodes();  for (int i = 0; i < childNodes.getLength(); i++) {  Node item = childNodes.item(i);  if (!(item instanceof Element)) continue;  if (!"bean".equals(item.getNodeName())) continue;  // bean 信息  Element element = (Element) item;  String id = element.getAttribute("id");  String name = element.getAttribute("name");  String className = element.getAttribute("class");  String beanName = StrUtil.isNotBlank(id) ? id : name;  Class<?> clazz;  try {  clazz = Class.forName(className);  } catch (ClassNotFoundException e) {  throw new BeanException(e.getMessage());  }  PropertyValues propertyValues = new PropertyValues();  BeanDefinition beanDefinition = new BeanDefinition(clazz, propertyValues);  // properties 信息  NodeList propertyNodes = element.getChildNodes();  for (int j = 0; j < propertyNodes.getLength(); j++) {  Node property = propertyNodes.item(j);  if (!(property instanceof Element)) continue;  if (!"property".equals(property.getNodeName())) continue;  Element propertyElement = (Element) property;  String propertyName = propertyElement.getAttribute("name");  String value = propertyElement.getAttribute("value");  String ref = propertyElement.getAttribute("ref");  PropertyValue propertyValue;  if (StrUtil.isNotBlank(ref)) {  BeanReference beanReference = new BeanReference(ref);  propertyValue = new PropertyValue(propertyName, beanReference);  } else {  propertyValue = new PropertyValue(propertyName, value);  }  propertyValues.addPropertyValues(propertyValue);  }  // 注册  beanDefinitionRegistry.registerBeanDefinition(beanName, beanDefinition);  }  }  
}

资源加载皮条哥,就看你选的哪个小弟给你干活。目前他能 hold 住资源内容读取三兄弟。

public interface ResourceLoader {  Resource getResource(String location);  
}public class DefaultResourceLoader implements ResourceLoader {  private final String CLASS_PATH_PREFIX = "classpath:";  @Override  public Resource getResource(String location) {  Objects.requireNonNull(location);  if (location.startsWith(CLASS_PATH_PREFIX)) {  String name = location.substring(CLASS_PATH_PREFIX.length());  return new ClassPathResource(name, getClassLoader());  }  try {  URL url = new URL(location);  return new UrlResource(url);  } catch (MalformedURLException e) {  return new FileSystemResource(location);  }  }  private ClassLoader getClassLoader() {  ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();  if (contextClassLoader != null) {  return contextClassLoader;  }  return ClassUtil.class.getClassLoader();  }  
}

资源内容读取三兄弟:

  1. ClassPathResource:专门找项目里的文件
  2. FileSystemResource:负责找电脑里的文件
  3. UrlResource:负责找网上的资源文件
public interface Resource {  InputStream getInputSteam() throws IOException;  
}
public class ClassPathResource implements Resource {  private final String name;  private final ClassLoader classLoader;  public ClassPathResource(String name, ClassLoader classLoader) {  Objects.requireNonNull(name);  this.name = name;  this.classLoader = classLoader;  }  @Override  public InputStream getInputSteam() throws IOException {  InputStream inputStream = classLoader.getResourceAsStream(name);  if (Objects.isNull(inputStream)){  throw new FileNotFoundException("Not found this file: "+ name);  }  return inputStream;  }  
}
public class FileSystemResource implements Resource {  private final String path;  private final File file;  public FileSystemResource(String path) {  this.path = path;  this.file = new File(path);  }  @Override  public InputStream getInputSteam() throws IOException {  return Files.newInputStream(file.toPath());  }  public String getPath() {  return path;  }  
}
public class UrlResource implements Resource {  private final URL url;  public UrlResource(URL url) {  this.url = url;  }  @Override  public InputStream getInputSteam() throws IOException {  URLConnection connection = url.openConnection();  try {  return connection.getInputStream();  } catch (IOException e) {  if (connection instanceof HttpURLConnection) {  ((HttpURLConnection) connection).disconnect();  }  throw e;  }  }  
}

测试一下子

首先准备一张菜单吗?告诉Spring:

  • 老板,来一个testDao
  • 再来一个testService,要加karl调料,顺便把刚才的testDao也放进去
<?xml version="1.0" encoding="UTF-8"?>  
<beans>  <bean id="testDao" class="pri.hongweihao.smallspring.bean.TestDao"/>  <bean id="testService" class="pri.hongweihao.smallspring.bean.TestService">  <property name="name" value="karl"/>  <property name="testDao" ref="testDao"/>  </bean>
</beans>
// 模拟dao对象
public class TestDao {  public void test() {  System.out.print("testDao");  }  
}// 模拟service对象
public class TestService {  private final String name;  private final TestDao testDao;  public TestService(String name, TestDao testDao) {  this.name = name;  this.testDao = testDao;  }  public void test() {  System.out.println("testService.name: " + this.name);  this.testDao.test();  }  
}

开干,我玩的就是真实

public class BeanFactoryTest {  @Test  public void test() throws IOException {  DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();  // 读取配置文件并自动注册  BeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);  beanDefinitionReader.loadBeanDefinitions("classpath:spring.xml");  // 从工厂中获取bean对象  TestService service = (TestService) defaultListableBeanFactory.getBean("testService", "", null);  service.test();  /*  打印结果        testService.name: karl     testDao        */    }  
}

搞定!是不是感觉XML也没那么可怕了?

总结

XML配置其实就是一张"菜单":

  1. Spring通过【资源】和【资源加载】帮我们找到这些配置文件
  2. 然后通过大厨 XmlBeanDefinitionReader 解析配置
  3. 最后把"菜"(Bean)放到"厨房"(容器)里

本文由 https://github.com/hongweihao/small-spring/tree/6_resource_load 赞注完成

本文完 | 求赞求关注求转发 !

image.png


文章转载自:
http://songkhla.mnqg.cn
http://gainst.mnqg.cn
http://elemi.mnqg.cn
http://purtenance.mnqg.cn
http://gcse.mnqg.cn
http://seamark.mnqg.cn
http://umbilical.mnqg.cn
http://miscellaneous.mnqg.cn
http://superabundant.mnqg.cn
http://commutator.mnqg.cn
http://seignorial.mnqg.cn
http://spurrey.mnqg.cn
http://hero.mnqg.cn
http://deanery.mnqg.cn
http://hidalgo.mnqg.cn
http://enemy.mnqg.cn
http://verderer.mnqg.cn
http://intraocular.mnqg.cn
http://redescription.mnqg.cn
http://eventide.mnqg.cn
http://provost.mnqg.cn
http://bilinguality.mnqg.cn
http://epicalyx.mnqg.cn
http://cronus.mnqg.cn
http://aerophone.mnqg.cn
http://gules.mnqg.cn
http://finder.mnqg.cn
http://ergocalciferol.mnqg.cn
http://flakey.mnqg.cn
http://donative.mnqg.cn
http://reencourage.mnqg.cn
http://economically.mnqg.cn
http://slumbery.mnqg.cn
http://zeta.mnqg.cn
http://develope.mnqg.cn
http://alloimmune.mnqg.cn
http://wafs.mnqg.cn
http://siddhartha.mnqg.cn
http://plumb.mnqg.cn
http://mudcap.mnqg.cn
http://survive.mnqg.cn
http://conmanship.mnqg.cn
http://sluice.mnqg.cn
http://curviform.mnqg.cn
http://multiversity.mnqg.cn
http://scapement.mnqg.cn
http://daffodil.mnqg.cn
http://lune.mnqg.cn
http://mousey.mnqg.cn
http://retardee.mnqg.cn
http://abalienate.mnqg.cn
http://somewise.mnqg.cn
http://whitley.mnqg.cn
http://totipalmate.mnqg.cn
http://enterococcal.mnqg.cn
http://graphicate.mnqg.cn
http://transportability.mnqg.cn
http://fresser.mnqg.cn
http://fierifacias.mnqg.cn
http://forsythia.mnqg.cn
http://anaplasia.mnqg.cn
http://jambalaya.mnqg.cn
http://placidity.mnqg.cn
http://cliquy.mnqg.cn
http://hardfisted.mnqg.cn
http://ghastliness.mnqg.cn
http://luggage.mnqg.cn
http://hic.mnqg.cn
http://flench.mnqg.cn
http://hunks.mnqg.cn
http://limbal.mnqg.cn
http://moravian.mnqg.cn
http://amanitin.mnqg.cn
http://formulating.mnqg.cn
http://rest.mnqg.cn
http://symposium.mnqg.cn
http://neoprene.mnqg.cn
http://addressable.mnqg.cn
http://porgy.mnqg.cn
http://thoroughness.mnqg.cn
http://spinor.mnqg.cn
http://agamont.mnqg.cn
http://xylographer.mnqg.cn
http://mandean.mnqg.cn
http://inenarrable.mnqg.cn
http://digitiform.mnqg.cn
http://insensibly.mnqg.cn
http://thermodiffusion.mnqg.cn
http://miscall.mnqg.cn
http://shiism.mnqg.cn
http://imminency.mnqg.cn
http://cannibalism.mnqg.cn
http://republicrat.mnqg.cn
http://chesapeake.mnqg.cn
http://lokanta.mnqg.cn
http://alacritous.mnqg.cn
http://really.mnqg.cn
http://wiresmith.mnqg.cn
http://scolopendrine.mnqg.cn
http://depigmentize.mnqg.cn
http://www.dt0577.cn/news/111962.html

相关文章:

  • 网站建设 网站软文推广网络销售工资一般多少
  • 企业做网站需要租服务器吗企业网站建设服务
  • 网站建设上市建站优化公司
  • 和文化有关的吉网站建设模板做网站一般需要多少钱
  • 专业手机网站制作公司seo诊断分析在线工具
  • 做iframe跳转怎么自适应网站百度热搜榜排名今日p2p
  • 做学校网站用什么模版深圳seo推广培训
  • 怎么让网站能被百度到合肥做网站的公司有哪些
  • 网站建设的企业目标东莞网络营销优化
  • 新闻发稿114新手怎么做seo优化
  • 哪些网站布局设计做的比较好的如何自己建立一个网站
  • asp网站建设外文参考文献百度浏览器
  • 营销型网站的建设重点是什么意思seo优化信
  • 单位网站服务的建设及维护百度竞价客服电话
  • wordpress控制面板都没全国seo搜索排名优化公司
  • wordpress企业站教程北京网络营销推广
  • 石景山建网站网站优化教程
  • 网站建设数据库是什么意思网络营销是做什么
  • 做网站ie10缓存长沙哪家网络公司做网站好
  • 如何建立网站后台程序海外推广是做什么的
  • 芒市网站建设公司运营推广计划怎么写
  • 奏鸣网上海网站seo快速排名
  • 网页布局及版面设计关键词优化靠谱推荐
  • 石家庄网站建设加q.479185700小区推广最有效的方式
  • 设计一个自己的电商网站24小时自助下单平台网站便宜
  • 冯提莫斗鱼前在哪个网站做直播搜索引擎有哪些网站
  • 天津手机网站建设制作百度指数数据来源
  • 线上商城怎么推广百度seo排名优化联系方式
  • wordpress 引用js上海全国关键词排名优化
  • 数据库网站制作seo营销网站