onRefresh();
protected void onRefresh() {
try {
createEmbeddedServletContainer();
}
}
private void createEmbeddedServletContainer() {
EmbeddedServletContainer localContainer = this.embeddedServletContainer; //null
ServletContext localServletContext = getServletContext(); //null
if (localContainer == null && localServletContext == null) {
EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory(); //返回org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
this.embeddedServletContainer = containerFactory
.getEmbeddedServletContainer(getSelfInitializer()); //this = AnnotationConfigEmbeddedWebApplicationContext,返回
}
initPropertySources();
}
protected EmbeddedServletContainerFactory getEmbeddedServletContainerFactory() {
String[] beanNames = getBeanFactory()
.getBeanNamesForType(EmbeddedServletContainerFactory.class); //[tomcatEmbeddedServletContainerFactory]
return getBeanFactory().getBean(beanNames[],EmbeddedServletContainerFactory.class);
}
public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
return doGetBean(name, requiredType, null, false);//tomcatEmbeddedServletContainerFactory,interface org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
}
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
try {
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
} Object beanInstance = doCreateBean(beanName, mbdToUse, args);
return beanInstance;
} protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
}
}
return bean;
}
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName); //AnnotationAwareAspectJAutoProxyCreator判断要不要生成代理,
}
}
return null;
}
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args); //org.springframework.beans.BeanWrapperImpl: wrapping object [org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory@7a7cc52c]
Object exposedObject = bean;
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
return exposedObject;
}
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
Object wrappedBean = bean;
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
return wrappedBean;
}
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) {
Object result = existingBean;
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessAfterInitialization(result, beanName);
if (result == null) {
return result;
}
}
return result;
}
TomcatEmbeddedServletContainerFactory 类:
原来是通过server.xml解析的,这里是代码写死的。
public EmbeddedServletContainer getEmbeddedServletContainer(
ServletContextInitializer... initializers) {
Tomcat tomcat = new Tomcat();//org.apache.catalina.startup.Tomcat@620c8641
File baseDir = (this.baseDirectory != null ? this.baseDirectory
: createTempDir("tomcat"));//C:\Users\ADMINI~1\AppData\Local\Temp\tomcat.5396461944750847035.8086
tomcat.setBaseDir(baseDir.getAbsolutePath());
Connector connector = new Connector(this.protocol);
tomcat.getService().addConnector(connector);
customizeConnector(connector);
tomcat.setConnector(connector);
tomcat.getHost().setAutoDeploy(false);
configureEngine(tomcat.getEngine());
for (Connector additionalConnector : this.additionalTomcatConnectors) {
tomcat.getService().addConnector(additionalConnector);
}
prepareContext(tomcat.getHost(), initializers);
return getTomcatEmbeddedServletContainer(tomcat);
}
 public Connector(String protocol) {
setProtocol(protocol);
ProtocolHandler p = null;
try {
Class<?> clazz = Class.forName("org.apache.coyote.http11.Http11NioProtocol");
p = (ProtocolHandler) clazz.getConstructor().newInstance();
} finally {
this.protocolHandler = p;
}
}
public Server getServer() {
if (server != null) {
return server;
}
System.setProperty("catalina.useNaming", "false");
server = new StandardServer();
initBaseDir();
server.setPort( -1 );
Service service = new StandardService();
service.setName("Tomcat");
server.addService(service);
return server;
}
public Host getHost() {
Engine engine = getEngine();
if (engine.findChildren().length > 0) {
return (Host) engine.findChildren()[0];
}
Host host = new StandardHost();
host.setName(hostname);
getEngine().addChild(host);
return host;
}
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
return new TomcatEmbeddedServletContainer(tomcat, getPort() >= 0);
}
public TomcatEmbeddedServletContainer(Tomcat tomcat, boolean autoStart) {
Assert.notNull(tomcat, "Tomcat Server must not be null");
this.tomcat = tomcat;
this.autoStart = autoStart;
initialize();
}
private void initialize() throws EmbeddedServletContainerException {
synchronized (this.monitor) {
try {
addInstanceIdToEngineName();
try {
final Context context = findContext();
this.tomcat.start();
}
}
}
public void start() throws LifecycleException {
getServer();
getConnector();
server.start();
}
public final synchronized void start() throws LifecycleException {
if (state.equals(LifecycleState.NEW)) {
init();
} else if (state.equals(LifecycleState.FAILED)) {
stop();
} else if (!state.equals(LifecycleState.INITIALIZED) &&
!state.equals(LifecycleState.STOPPED)) {
invalidTransition(Lifecycle.BEFORE_START_EVENT);
}
try {
setStateInternal(LifecycleState.STARTING_PREP, null, false);
startInternal();
if (state.equals(LifecycleState.FAILED)) {
stop();
} else if (!state.equals(LifecycleState.STARTING)) {
invalidTransition(Lifecycle.AFTER_START_EVENT);
} else {
setStateInternal(LifecycleState.STARTED, null, false);
}
}
}
public final synchronized void init() throws LifecycleException {
try {
initInternal();
}
}
protected void initInternal() throws LifecycleException {
for (int i = 0; i < services.length; i++) {
services[i].init();
}
}
public final synchronized void init() throws LifecycleException {
try {
initInternal();
}
}
protected void initInternal() throws LifecycleException {
if (engine != null) {
engine.init();
}
for (Executor executor : findExecutors()) {
if (executor instanceof JmxEnabled) {
((JmxEnabled) executor).setDomain(getDomain());
}
executor.init();
}
mapperListener.init();
synchronized (connectorsLock) {
for (Connector connector : connectors) {
try {
connector.init(); //里面会adapter = new CoyoteAdapter(this);,
}
}
}
}
解析requestMappingHandlerMapping是时候, 
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)  {
Object result = existingBean;//requestMappingHandlerMapping
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessBeforeInitialization(result, beanName);//beanProcessor = ApplicationContextAwareProcessor,
}
return result;
}
ApplicationContextAwareProcessor类:
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
else {
invokeAwareInterfaces(bean);
}
return bean;
}
protected void initInterceptors() {
if (!this.interceptors.isEmpty()) {
for (int i = 0; i < this.interceptors.size(); i++) {
Object interceptor = this.interceptors.get(i); //[WebRequestHandlerInterceptorAdapter, ConversionServiceExposingInterceptor, ResourceUrlProviderExposingInterceptor]
this.adaptedInterceptors.add(adaptInterceptor(interceptor));
}
}
}
initializeBean方法里面的invokeInitMethods(beanName, wrappedBean, mbd);  把url跟controller的映射注册到requestMappingHandlerMapping进去了
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) {
else {
((InitializingBean) bean).afterPropertiesSet();
}
}
if (mbd != null) {
String initMethodName = mbd.getInitMethodName();
if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}
requestMappingHandlerMapping类:
public void afterPropertiesSet() {
super.afterPropertiesSet();
}
protected void initHandlerMethods() {
String[] beanNames = getApplicationContext().getBeanNamesForType(Object.class)); //所有的bean
for (String beanName : beanNames) {
if (!beanName.startsWith(SCOPED_TARGET_NAME_PREFIX)) {
Class<?> beanType = null;
try {
beanType = getApplicationContext().getType(beanName);
}
if (beanType != null && isHandler(beanType)) {
detectHandlerMethods(beanName); //beanName = accountController
}
}
}
handlerMethodsInitialized(getHandlerMethods());
}
protected boolean isHandler(Class<?> beanType) {
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
protected void detectHandlerMethods(final Object handler) {
Class<?> handlerType = (handler instanceof String ?
getApplicationContext().getType((String) handler) : handler.getClass()); //class com.hcxy.car.controller.AccountController
final Class<?> userType = ClassUtils.getUserClass(handlerType); //class com.hcxy.car.controller.AccountController
Map<Method, T> methods = MethodIntrospector.selectMethods(userType,
new MethodIntrospector.MetadataLookup<T>() {
@Override
public T inspect(Method method) {
try {
return getMappingForMethod(method, userType);
}
}
});//{public Map AccountController.addAccount(java.util.Map) n={[/ota/account/add],methods=[POST]}, public Map AccountController.all1( )={[/ota/account/all],methods=[GET]}} for (Map.Entry<Method, T> entry : methods.entrySet()) {
Method invocableMethod = AopUtils.selectInvocableMethod(entry.getKey(), userType);
T mapping = entry.getValue();
registerHandlerMethod(handler, invocableMethod, mapping);
}
}
请求进来。从tomcat走到DispatcherServlet。

DispatcherServlet类: protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);//DefaultRequestToViewNameTranslator加到DispatcherServlet
initViewResolvers(context);//DefaultRequestToViewNameTranslator加到DispatcherServlet
initFlashMapManager(context);//DefaultRequestToViewNameTranslator加到DispatcherServlet
}
private void initHandlerMappings(ApplicationContext context) {
this.handlerMappings = null; //this = DispatcherServlet
if (this.detectAllHandlerMappings) {
Map<String, HandlerMapping> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false); //从容器找到所有的HandlerMapping,{requestMappingHandlerMapping=RequestMappingHandlerMapping@5ad6f98e, viewControllerHandlerMapping=WebMvcConfigurationSupport$EmptyHandlerMapping@786ff0ea, beanNameHandlerMapping=BeanNameUrlHandlerMapping@15186ce0, resourceHandlerMapping=SimpleUrlHandlerMapping@54bb1194, defaultServletHandlerMapping=WebMvcConfigurationSupport$EmptyHandlerMapping@1109730f, faviconHandlerMapping=SimpleUrlHandlerMapping@25109608, welcomePageHandlerMapping=WebMvcAutoConfiguration$WelcomePageHandlerMapping@38dbeb39}
if (!matchingBeans.isEmpty()) {
this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values()); //7个,
AnnotationAwareOrderComparator.sort(this.handlerMappings);
}
}
}
private void initHandlerAdapters(ApplicationContext context) {
this.handlerAdapters = null; //this = DispatcherServlet
if (this.detectAllHandlerAdapters) {
Map<String, HandlerAdapter> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerAdapter.class, true, false); //从容器中找{requestMappingHandlerAdapter=RequestMappingHandlerAdapter@45297e7, httpRequestHandlerAdapter=HttpRequestHandlerAdapter@5423a17, simpleControllerHandlerAdapter=SimpleControllerHandlerAdapter@42ff9a77}
if (!matchingBeans.isEmpty()) {
this.handlerAdapters = new ArrayList<HandlerAdapter>(matchingBeans.values());
AnnotationAwareOrderComparator.sort(this.handlerAdapters);
}
}
}
private void initHandlerExceptionResolvers(ApplicationContext context) {
this.handlerExceptionResolvers = null; //this = DispatcherServlet
if (this.detectAllHandlerExceptionResolvers) {
Map<String, HandlerExceptionResolver> matchingBeans = BeanFactoryUtils
.beansOfTypeIncludingAncestors(context, HandlerExceptionResolver.class, true, false); //{errorAttributes=DefaultErrorAttributes@30cafd13, handlerExceptionResolver=HandlerExceptionResolverComposite@60f662bd}
if (!matchingBeans.isEmpty()) {
this.handlerExceptionResolvers = new ArrayList<HandlerExceptionResolver>(matchingBeans.values());
AnnotationAwareOrderComparator.sort(this.handlerExceptionResolvers);
}
}
private void initViewResolvers(ApplicationContext context) {
this.viewResolvers = null;//this = DispatcherServlet
if (this.detectAllViewResolvers) {
// Find all ViewResolvers in the ApplicationContext, including ancestor contexts.
Map<String, ViewResolver> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false);
if (!matchingBeans.isEmpty()) {
this.viewResolvers = new ArrayList<ViewResolver>(matchingBeans.values());
//[org.springframework.web.servlet.view.BeanNameViewResolver@29090809, org.springframework.web.servlet.view.ViewResolverComposite@22aee519, org.springframework.web.servlet.view.InternalResourceViewResolver@7ba06506, org.springframework.web.servlet.view.ContentNegotiatingViewResolver@3e2c4d4b, org.thymeleaf.spring4.view.ThymeleafViewResolver@780129bc]
AnnotationAwareOrderComparator.sort(this.viewResolvers);
}
}
private void initFlashMapManager(ApplicationContext context) {
try {//this = DispatcherServlet
this.flashMapManager = context.getBean(FLASH_MAP_MANAGER_BEAN_NAME, FlashMapManager.class); //SessionFlashMapManager
}
请求进来,然后进到doService方法。
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
doDispatch(request, response);
}
}
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerExecutionChain mappedHandler = null; //拦截器链
try {
try {
processedRequest = checkMultipart(request); //上床文件,
multipartRequestParsed = (processedRequest != request);
mappedHandler = getHandler(processedRequest); //public java.util.Map com.hcxy.car.controller.AccountController.all1()
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // ha = RequestMappingHandlerAdapter
if (!mappedHandler.applyPreHandle(processedRequest, response)) { //前置拦截器
return;
}
//反射调用controller的方法。
mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); applyDefaultViewName(processedRequest, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv); //后置拦截器
}
}
}
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (HandlerMapping hm : this.handlerMappings) {//[SimpleUrlHandlerMapping@7afbf2a0, RequestMappingHandlerMapping@349f0ca4, BeanNameUrlHandlerMapping@52ca0ad4, SimpleUrlHandlerMapping@2565a7d0, WebMvcConfigurationSupport$EmptyHandlerMapping@47f2c722, WebMvcConfigurationSupport$EmptyHandlerMapping@4fd7b79, WebMvcAutoConfiguration$WelcomePageHandlerMapping@7e050be1],只有RequestMappingHandlerMapping有url和controller的对应关系。
HandlerExecutionChain handler = hm.getHandler(request); //hm= RequestMappingHandlerMapping

if (handler != null) {
return handler;//public java.util.Map com.hcxy.car.controller.AccountController.all1()
}
}
return null;
}
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
for (HandlerAdapter ha : this.handlerAdapters) { //[RequestMappingHandlerAdapter@6e2eead5, HttpRequestHandlerAdapter@113eed88, SimpleControllerHandlerAdapter@5f0677f3]
if (ha.supports(handler)) {
return ha;//RequestMappingHandlerAdapter
}
}
}
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerInterceptor[] interceptors = getInterceptors();//拦截器
if (!ObjectUtils.isEmpty(interceptors)) {
for (int i = 0; i < interceptors.length; i++) {
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(request, response, this.handler)) {
}
this.interceptorIndex = i;
}
}
return true;
}
反射调用controller的方法。
mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); //ha = RequestMappingHandlerAdapter
protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
else {
mav = invokeHandlerMethod(request, response, handlerMethod);
}
return mav;
}
protected <T> void writeWithMessageConverters(T value, MethodParameter returnType,
ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage) {
if (selectedMediaType != null) {
selectedMediaType = selectedMediaType.removeQualityValue();
for (HttpMessageConverter<?> messageConverter : this.messageConverters) {
if (messageConverter instanceof GenericHttpMessageConverter) {
if (((GenericHttpMessageConverter) messageConverter).canWrite(
declaredType, valueType, selectedMediaType)) {
outputValue = (T) getAdvice().beforeBodyWrite(outputValue, returnType, selectedMediaType,
(Class<? extends HttpMessageConverter<?>>) messageConverter.getClass(),
inputMessage, outputMessage); //{@11105} accounts -> {@11106} 12345,返回的Map。
if (outputValue != null) {
addContentDispositionHeader(inputMessage, outputMessage);
((GenericHttpMessageConverter) messageConverter).write(
outputValue, declaredType, selectedMediaType, outputMessage);
}
return;
}
}
}
}
}
objectWriter.writeValue(generator, value);   //写出去数据给流浪器,从response写出去。
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);     //视图响应

if (mv != null && !mv.wasCleared()) {//
render(mv, request, response); //渲染
if (errorView) {
WebUtils.clearErrorRequestAttributes(request);
}
}
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception { 

        View view;
if (mv.isReference()) {
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
}
}
else {
view = mv.getView();
} try {
if (mv.getStatus() != null) {
response.setStatus(mv.getStatus().value());
}
view.render(mv.getModelInternal(), request, response);
}
}
protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
HttpServletRequest request) throws Exception { for (ViewResolver viewResolver : this.viewResolvers) { //viewResolvers是视图解析器
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
return null;
}
public View resolveViewName(String viewName, Locale locale) throws Exception {
if (!isCache()) {
return createView(viewName, locale);
}

spring tomcat启动 请求处理的更多相关文章

  1. tomcat启动(Ⅶ)请求处理--Processor.process(SocketWrapper<S> socketWrapper)

    tomcat启动(六)Catalina分析-StandardServer.start() 上一篇分析到:Http11NioProcessor.process(SocketWrapper<S> ...

  2. hibernate+spring+tomcat启动报错Not supported by BasicDataSource

    最近使用hibernate+spring+jsp的小项目制作过程中出现一些错误,例如: java.lang.UnsupportedOperationException: Not supported b ...

  3. Spring + Tomcat 启动报错java.lang.ClassNotFoundException: org.apache.commons.pool.impl.GenericObjectPool

    错误如下: -- ::,-[TS] INFO http-- org.springframework.beans.factory.support.DefaultListableBeanFactory - ...

  4. [spring+tomcat]启动时报错:NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I

    一般来讲问题的原因为tomcat版本较低, 建议升级到tomcat7x 以上版本

  5. Spring Tomcat启动过程

    入口,配置再web.xml中, 初始化applicationContext 创建webApplicationContext,这里可加载web.xml文件中定义了contextClass 获取conte ...

  6. Spring Boot启动过程(四):Spring Boot内嵌Tomcat启动

    之前在Spring Boot启动过程(二)提到过createEmbeddedServletContainer创建了内嵌的Servlet容器,我用的是默认的Tomcat. private void cr ...

  7. Spring Boot 添加jersey-mvc-freemarker依赖后内置tomcat启动不了解决方案

    我在我的Spring Boot 项目的pom.xml中添加了jersey-mvc-freemarker依赖后,内置tomcat启动不了. 报错信息如下: org.springframework.con ...

  8. spring boot tomcat 打本地包成war,通过Tomcat启动时出现问题: ZipException: error in opening zip file

    一个第三方公司提供spring boot 项目,直接启动是ok的, 但是打包成war,通过Tomcat启动,就出现 ZipException: error in opening zip file: 2 ...

  9. Spring Boot:内置tomcat启动和外部tomcat部署总结

    springboot的web项目的启动主要分为: 一.使用内置tomcat启动 启动方式: 1.IDEA中main函数启动 2.mvn springboot-run 命令 3.java -jar XX ...

随机推荐

  1. IT兄弟连 Java语法教程 流程控制语句 控制循环结构1

    Java语言没有提供goto语句来控制程序的跳转,这种做法提高了程序流程控制的可读性,但降低了程序流程控制的灵活性.为了弥补这种不足,Java提供了continue和break来控制循环结构.除此之外 ...

  2. 【转】oracle中的NULL、''(空字符串)以及'_'(空格)

    在Oracle中使用null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? 1.NULL和''(空字符串)是一个意思 注:为了便于区分空字符串和空格,下面的示例均以'_'代表空格. ...

  3. 愉快地使用Groovy Shell

    这是一篇有关Groovy Shell的帖子,以及它如何在日常工作中为您提供帮助(只要您是软件开发人员).无论您使用哪种编程语言或技术,都可以从Groovy Shell中受益.唯一真正的要求是您能够编写 ...

  4. C#上手练习1(if语句、Swich语句)

    1.打印字符串. 2.调用简单方法,方法里有if语句.Swich语句. C# if else 语句是最常用的条件语句,并且 if else 语句的形式有多种,包括单一条件的 if 语句.二选一条件的 ...

  5. centos 7 搭建vsftp

    一.FTP简介 1.ftp 概述                                                FTP:(file  transfer  protocol文件传输协议) ...

  6. java核心技术第六篇之断言、日志、包装类型和工具类

    JDK1.5新特性: 1.自动拆装箱. 2.泛型 3.可变参数 4.静态导入 5.增强for循环 6.互斥锁 7.枚举 8.注解 JDK1.6新特性: 1.Desktop类和SystemTray类 2 ...

  7. 前端开发工具HBuilder使用技巧以及快捷键

    创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter) 中途换行: 'Ctrl+Enter' 设置charset: m e 6 Enter ...

  8. MBProgressHUD源码(上)

    本篇博文记录MBProgressHUD源码学习过程,从官方提供的Demo项目入手,一步步了解其代码结构,学习它使用的技术,体会作者的编程思想. 一.结构 我们先来看下MBProgressHUD的结构, ...

  9. 一文解读5G (转)

    今天要研究的对象,是5G接入网. 什么是接入网?相信不少同学,对这个概念一定不会陌生. 搬出这张移动通信架构图: 接入网,在我们无线通信里,一般指无线接入网,也就是通常所说的RAN(Radio Acc ...

  10. linux环境下的Oracle部署

    一.  环境及相关软件 虚拟机:VMwore Workstation Linux系统:CentOS ORACLE:ORACLE_112030_Linux-x86-64 Xmanger软件 二.  安装 ...