Java 动态代理

2019-06-07   Java   动态代理  

引言

动态代理是 Java 技术中最重要的一点,如果不会动态代理,那么在学习 Spring、MyBatis 等框架的源码时是学不明白的!

代理的概念

动态代理简单来说就是动态的产生一个代理对象,代理对象会负责将所有的方法调用分派到委托对象上反射执行。

举一个生活中的例子:一个人还没有出名时,如果想找他唱歌跳舞,那就直接找他本人就完事了。但是当他出名后,成了明星,就不能直接找他唱歌跳舞了,得找他的经纪人来沟通。比如刘德华,他是一个非常出名的明星,会唱歌,会跳舞。如果你想找他唱歌跳舞,刘德华(被代理类)就会说,你先去找我的经纪人(代理类)吧。所以你这时只能去找经纪人了,因此这个经纪人就拦截了我们对刘德华的直接访问。

所以现实生活中的例子跟我们开发是一样的,我们在开发时,产生一个代理对象,拦截对被代理对象的访问,并做出相应的业务处理。

微服务入门-SpringBoot+Dubbo搭建一个简单的 Maven 多模块的 Demo

2019-06-03   杂七杂八   微服务 SpringBoot Dubbo Maven  

微服务

微服务就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系统,在微服务结构中,每个子系统就被称为“服务”。这些子系统能够独立运行在 web 容器中,它们之间通过 RPC 方式通信。

Dubbo

Dubbo 是一款高性能 Java RPC 框架,也叫微服务系统的协调者。在它这套体系中,一共有三种角色,分别是:服务提供者(provider)、服务消费者(consumer)、注册中心(zookeeper)。

服务提供者启动时,向注册中心注册自己提供的服务。服务消费者在启动时,向注册中心订阅自己所需的服务。注册中心返回服务提供者地址列表给消费者。此时消费者调用提供者提供的服务时,就跟在本地调用一样。

本文只是一个入门的 Demo,更多的 Dubbo 原理不在本文阐述范围内。

pom.xml错误:org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter)的解决方法

2019-05-30   杂七杂八   Maven pom.xml  

pom.xml 文件在添加了新的依赖后,一直报:org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter) 的错误,Maven Update 后依然如此。

我用的 Eclipse 是 Eclipse Neon (4.6)版本,自带 Maven 插件。

更新eclipse中的maven插件方法如下:

点击:help -> Install New Software -> add -> http://repo1.maven.org/maven2/.m2e/connectors/m2eclipse-mavenarchiver/0.17.2/N/LATEST/

一直下一步即可。

image

SpringMVC的静态资源映射

2019-03-15   Spring全家桶   静态资源映射  

XML配置

1.mvc:resources

spring3.0.4以后版本提供了mvc:resources

<!--对静态资源文件的访问-->
<mvc:resources mapping="/images/**" location="/resources/images/" />

/images /**映射到 ResourceHttpRequestHandler 进行处理,location指定静态资源的位置,这里是webapp目录下的resources/images文件夹

MyBatis的批量操作

2019-02-28   MyBatis   MyBatis批量  

批量新增

表结构

CREATE TABLE `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(250) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

实体类

public class Customer implements Serializable {

	private static final long serialVersionUID = -1545195873576249731L;

	private Integer id;
	
	private String name;
	
	private Integer age;
	
	// get、set 和 toString 方法省略
}

mysql group_concat函数和oracle listagg函数的作用和区别

2019-01-23   数据库   MySQL Oracle group_concat listagg  

mysql group_concat的作用和语法

  • 作用:将组中的字符串连接成为具有各种选项的单个字符串

  • 语法:group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])

分隔符默认是逗号

比如有这样一个表

image

有这样一个需求:将分数用分隔符’-‘以降序的方式连接在一起

我们可以这样写

SELECT GROUP_CONCAT(A.SCORE ORDER BY A.SCORE DESC SEPARATOR '-') FROM GRADE A;

结果如下

image

springBoot freemarker 无法加载static 中 js css 文件(报错404)

2019-01-06   Spring全家桶   SpringBoot  

注入一个继承WebMvcConfigurationSupport的配置类,并重写addResourceHandlers方法

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport{

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/","file:./static/");
    }
}

contos7升级Python

2018-12-29   杂七杂八   Python  

contos7默认安装的python版本是2.7,可以用以下步骤升级到指定版本

安装编译环境

yum -y install gcc

创建安装目录

cd /usr/local/
mkdir python-3.6.3

下载python3.6.3的安装包

cd src/
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz

React map生成元素添加点击事件onClick绑定this

2018-11-30   JavaScript   React onClick 绑定this  

描述

使用.map(function(v,i)生成元素添加onClick事件:onClick={() => this.handlerClickArticleUrl(v.article_url)}时,前台访问报错:Uncaught TypeError: Cannot read property 'handlerClickArticleUrl' of undefined

handlerClickArticleUrl是在class里定义的方法

handlerClickArticleUrl(url){
        console.log("点击的文章链接是:"+url);
    }

调用方法如下

{
    article.map(function (v,i){
        return (
            <a href={v.article_url} target="_blank" onClick={() => this.handlerClickArticleUrl(v.article_url)}>{v.title}</a>
        )
    }
}

SpringBoot的两种跨域配置

2018-11-28   Spring全家桶   SpringBoot 跨域  

addCorsMappings

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport{

    /**
     * 跨域配置
     * addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
     * allowedMethods:允许所有的请求方法访问该跨域资源服务器,如:POST、GET、PUT、DELETE等。
     * allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:"X-TOKEN"
     * allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:"http://
     * www.baidu.com",只有百度可以访问我们的跨域资源。
     * @param registry
     */
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        super.addCorsMappings(registry);
        registry.addMapping("/**")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowedOrigins("http://localhost:3000");
    }
}