我们通常讨论依赖注入的时候,讲的都是将一个Bean引入到另一个Bean的属性或构造器参数中,它通常指的是将一个对象与另一个对象进行关联。而装配Bean的另一个方面指的是将一个值注入到Bean的属性或构造器中,也就是字面量的注入。 比如,将专辑的名字装配到TaylorSwift Bean的构造器或title属性中: @Bean public CompactDisc taylorSwift() { return new TaylorSwift("titledemo","artistdemo"); } 这实现了我们为BlankDisc Bean设置title和artist的需求,但它在实现的时候是将值硬编码在配置类中的,同理XML也是。但有时候我们可能会希望避免硬编码值,而是想让这些值在运行时再确定。 为了实现,Spring提供了两种在运行时求值的方式: 属性占位符 Spring表达式语言(spEL) 使用属性占位符注入外部的值 处理外部值的最简单方式就是声明属性源并通过 继续阅读 >>


贺含悦 18/05/07 22:07:50
在上一篇博客中我们看到了最为核心的Bean装配技术。但是,Bean装配所涉及的领域并不仅仅局限于那些,Spring还提供了多种技巧,借助它们可以实现更为高级的Bean装配功能。 环境与profile 在开发软件的时候,有一个很大的挑战就是将应用程序从一个环境迁移到另一个环境。在开发阶段中,某些环境相关做法可能并不适合迁移到生产环境中,甚至即便迁移过去也无法工作。数据库配置、加密算法以及与外部系统的集成是跨环境部署时会发生变化的几个典型例子。 有时候在不同的环境中某个Bean也会有所不同,我们必须要有一种方法使其在每种环境下都会选择最合适的配置。 其中一种方式就是在单独的配置类(或XML文件)中配置每个Bean,然后在构建阶段确定要将哪一个配置编译到可部署的应用中。 在JavaConfig中配置Profile Bean 面对不同环境有不同方法生成不同版本的Bean,Spring提供了一种策略,就是在运行时确定创建哪个版本的Bean。这样的结果就是同一个部署单元(可能会是WAR文件)能够 继续阅读 >>


贺含悦 18/05/07 22:07:31
在典型的Spring应用中,我们可能会同时使用自动化和显式配置。就产生了混合配置,即可以在JavaConfig中引入XML配置,也可以在XML配置中引用JavaConfig。 在JavaConfig中引用XML配置 之前我们在JavaConfig配置中写过一个CDPlayerConfig: 2.27:CDPlayerConfig @Configuration public class CDPlayerConfig { @Bean public CompactDisc taylorSwift(){ return new TaylorSwift(); } @Bean public CDPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); } } 在上面地代码中,我们将CompactDisc Bean和CDPla 继续阅读 >>


贺含悦 18/05/07 22:07:10
装配是什么? 创建应用对象之间协作关系的行为通常称为装配(wiring),这也是DI的本质。 我们必须要告诉Spring要创建哪些bean并且如何将其装配在一起。 Spring提供了三种主要的装配机制: 在XML中进行显式配置 在Java中进行显式配置 隐式的bean发现机制和自动装配 Spring的配置风格是可以互相搭配的,但应尽可能地使用自动配置的机制,因其使用起来要方便的多,显式配置越少越好。显式配置越少,代码就越容易维护。而基于Java和XML相比,JavaConfig的安全性比XML要好,并且功能更强大。 所以我们先来看Spring的自动化配置。 自动化装配Bean——便利 Spring从两个角度来实现自动化装配: 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的Bean。 自动装配 (autowiring):Spring自动满足Bean之间的依赖。 组件扫描和自动装配组合在一起就能使我们的显式配置降低到最少。 为了 继续阅读 >>


贺含悦 18/05/07 22:06:34
为什么使用动态内存 程序不知道自己需要多少对象; 程序不知道对象的准确类型; 程序需要在多个对象之间共享数据; 动态内存在哪里 程序有静态内存、栈内存。静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建或销毁。对于栈对象,仅在其定义的程序块运行时才存在;static对象在使用之前分配,在程序结束时销毁。 除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。程序用堆来存储动态分配的对象——即,那些在程序运行时分配的对象。动态对象的生存期由程序来控制,也就是说,当动态对象不再使用时,我们的代码必须显式的销毁它们。(c++ primer P400) 自由存储区和堆 自由存储是c++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区 堆是操作系统维护的一块内存 虽然c++编译器默认使 继续阅读 >>


吕子健 18/05/07 21:08:07
如果DispatcherServlet拦截“/”,即拦截了所有的请求,对*.js,*.jpg等静态资源的访问也就被拦截了。但如果DispatcherServlet只拦截*.do这样的URL,就不存在访问不到静态资源的问题。 通过下面几种方式可以正常访问静态文件,不要找不到静态文件报404。 方法一:利用Tomcat的defaultServlet来处理静态文件 在web.xml里添加如下配置 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.pn 继续阅读 >>


李猛 18/05/04 17:18:12
关于Python的web application,可以参考PEP-3333。另外,我还找到了一篇翻译,英文有困难的童鞋可以点这里。 WSGI Python Web Server Gateway Interface,翻译过来时Python web服务器网关接口,实际上就是一种协议,我们的应用(Django,Flask)实现了WSGI,就可以配合实现了WSGI(uWSGI,gunicorn)的服务器工作了。 以下是他们的结构图。 下面详述两种模式: 两级结构 在这种结构里,uWSGI作为服务器,它用到了HTTP协议以及wsgi协议,flask应用作为application,实现了wsgi协议。当有客户端发来请求,uWSGI接受请求,调用flask app得到相应,之后相应给客户端。 这里说一点,通常来说,Flask等web框架会自己附带一个wsgi服务器(这就是flask应用可以直接启动的原因),但是这只是在开发阶段用到的,在生产环境是不够用的,所以用到了uwsgi这个性能高的ws 继续阅读 >>


李余通 18/05/04 13:58:49
Spring MVC基于MVC模式(模型(Model)-视图(View)-控制器(Controller))实现,能够帮助你构建像Spring框架那样灵活和松耦合的Web应用程序。 核心类与接口 DispatcherServlet 前置控制器 HandlerMapping 处理器映射 Controller 控制器 ViewResolver 视图解析器 View 视图处理 Spring MVC的请求流向 当用户在浏览器中点击链接或提交表单的时候,就会产生HttpRequest。 请求首先会来到DispatcherServlet,DispatcherServlet会查询一个或多个处理器映射来确定将该请求发给哪一个控制器,根据请求所携带的URL信息来进行决策。如果没有找到合适的控制器,通过defaultHandler返回Response给浏览器。 在对应的控制器中,控制器开始处理请求、创建模型数据并将模型数据打包并标示出用于渲染输出的View名称,接着把模型和视图名发送回Dispatc 继续阅读 >>


李猛 18/04/27 23:12:09
7-4 排座位(25 分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。 输入格式: 输入第一行给出3个正整数:N(≤100),即前来参宴的宾客总人数,则这些人从1到N编号;M为已知两两宾客之间的关系数;K为查询的条数。随后M行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系,其中关系为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K行,每行给出一对需要查询的宾客编号。 这里假设朋友的朋友也是朋友。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。只有单纯直接的敌对关系才是绝对不能同席的。 输出格式: 对每个查询输出一行结果:如果两位宾客之间是朋友,且没有敌对关系,则输出No problem;如果他们之间并不是朋友,但也不敌对,则输出OK;如果他们之间有敌对,然而也有共同的朋友,则输出OK but…;如果他们之间 继续阅读 >>


殷健翔 18/04/27 21:19:46
注:本文中的部分内容摘抄自他人博客,如有侵权,请联系我,侵删~ 本篇博客主要讲述 synchronized 关键字的实现原理以及 JDK 1.6 后对 synchronized 的种种优化。synchronized 的使用不再赘述。 博主目前依旧存在的疑惑 请在阅读完此篇博客之后,帮助博主回答这三个问题: 多线程争夺 Monitor 的具体过程是怎样的?是根据 ObjectMonitor 中的 _count 值判断当前 Monitor 是否被锁定吗? JVM 如果检测到在单线程环境下执行同步代码(StringBuffer),是会进行锁消除呢,还是会使用偏向锁? 对于偏向锁的撤销过程及膨胀过程,博主只是在一些博客的基础上给出了自己的理解!不权威,建议阅读源码,博主对这部分知识的讲解持怀疑态度,如果在阅读的过程中发现博主对偏向锁的撤销与膨胀理解有误,请指出,感激不尽~(网上基本上没有从源码角度分析的,对于偏向锁撤销与升级的详细过程也是众说纷纭) 引言 我们先来看一份代码: 继续阅读 >>


董恒毅 18/04/27 11:38:27