这篇文章发布已经快4年了,不知道大家英语学的怎么样呢? 最近想组一个微信群一起学习英语,有兴趣的同学可以加我的微信,说明一下来意~ 园子里时不时就吹起一阵学英语的浪潮,不少同鞋表示一直想学,或者一直在学,就是效果不明显(你躺枪了么?)相信自己或者身边的人都或多或少吃了英语弱的当(你懂的,我们重点在说薪水的问题:)。而各种英语成功学,方法论,版本是一个接一个层出不穷。今天我们不说为什么要学好英语,好处太多而且已经广为流传了,我们主要结合目标管理来讨论一下如何坚定不移的,快速的学好英语。以我自己的亲身经历作样板,以下情况全部属实,绝无虚构。 先说说我在开始学英语之前的情况: 时间:2012年2月,已工作4.5年 词汇量:小于1500,(初中英语成绩特别好,高中以后全部打混,再加上工作时间完全不接触英语,所以最后基本上就剩下1500不到的词汇量) 其它英语能力:总之就是不能听,不能读,不能写,当然,更不能说,连最基本的8种时态都记不怎么清了。 再说说现在的情况: 截止时间:2013年6月,持续学习时间15个月(现在并没有停止英语的学习,只是没有以前强度那么大了) 词汇量:8000+ 其它英语能力 读:能够无障碍浏览英文网站(包括技术论坛,新闻科技网站),不用借助词典阅读原版技术书籍(CLR via c#一类的) 写:平时工作上邮件,开发文档,技术文档,需求文档都是用英文写 说:每周主持2次以上和美国同事开会,有问题随时呼叫他们 听:80%理解VOA常速,NPR,CNN新闻,Channel9 Videos,以及印度口音(印度人的发音不好,可是不能阻止别人英语很好!) 其它:今年6月份因公出差,到西雅图工作一个月 之所以列出上面的对比,是希望可以让你知道,我这样的基础都能学好英语,你又何尝不可呢?不是要谈目标管理吗?我不是标题党,接下来我们就结合这个例子来看看怎样做是好的目标管理,我会把我学习英语的方法总结出来,这是一个模子,可以套到任何地方。不管你是打算学英语,还是写博客,还是换工作,或者找对象:)。 本文包括一套完全的英语学习方法(听,说,读,写)以及本人学习过程中的经验,心态的分享。 给自己的英语学习订一个目标 建立一套完整的计划 学习任务之一:从哪里开始? 学习任务之二:音标学习 学习任务之三:四级单词攻克计划 学习任务之四:继续新概念之旅 学习任务之五:新概念第三册 学习任务之六:疯狂阅读计划 学习任务之七:两周专项写作提升 学习任务之八:听力/口语/阅读/写作之综合提高 过程监控 结果检查 心态分享 暴力记单词法 资源下载 目标管理之目标 目标管理不是一个独立的个体,它包括订立目标,制作计划,过程管理,以及结果评估。之所以叫目标管理,是因为目标是一切的开始,也是一切的终结,没有目标,一切都是空谈,就好像你连去哪里都不知道,又如何知道你走在正确还是错误的道路上呢? 重中之重是目标,那么怎么样才能算是一个好的目标呢?热血澎湃的说:“我要学好英语!” 这算是一个目标吗?当然不算,如果这都算一个目标,那"我晚上想吃酸辣土豆丝,很想!"也可以算目标了,这最多就算是一个想法或者欲望而已。要知道想法和欲望这种东西,甚至不用动脑就能产生了,可以说有时候它就是一种冲动而已,我们每天都是好多种这种冲动,所以要将冲动变为现实那是很难的一件事情。那么如何才算是一个好的目标? 请不要怪我学术派,让我借SMART原则一用。 目标必须是具体的(Specific) 目标必须是可以衡量的(Measurable) 目标必须是可以达到的(Attainable) 目标必须和其他目标具有相关性(Relevant) 目标必须具有明确的截止期限(Time-based) 关于具体 为什么说“我要学好英语”不是一个目标,首先第一个它就不具体。什么情况叫好?每个人对好的定义都不一样,在不具体的情况下,人总是很容易找到一堆借口来推脱或扯皮。我们可以找一些具体的指标,比如说背多少个单词,看多少本英文原著,学几册新概念,要达到可以和外国人正常交流等,要听得懂VOA常速,要能不借助词典浏览英文技术文章等等。只有目标具体了,我们才能有参照点的去要求自己。 关于量化 目标要具体最简单的办法就是将其量化,比如说一定要熟悉6级所有单词,那么根据火星词汇记载6级是5600个单词,那就一定要把5600这个数量列出来,先把这个数字记住了,它会在潜意识上增强你的决心,更重要的时候在检查进度的时候比较容易,比如说时间过去了一个月,你背了3000个,还有2600个,是不是再花2600/(3000/30)=26天就背完了? 平均每天100个单词,有没有背?这是一种比较好的检查进度的方式。 关于可达成 我当初给自己制定的计划时间是2年,为什么是2年而不是2个月呢?因为那太不现实了,这就是可达成,先衡量自己在什么位置,有多少时间,才能够设定具体的目标。当然也可以调换一下,自己的位置和目标可知,来推算需要多少时间可以到底那个位置。 关于相关性 相关性就没什么好说的了,学好英语和程序员的职业生涯息息相关。 关于时间限制 时间限制非常重要,如果没有时间限制基本是很难达成的。这也是为什么很多人没有学好英语的原因之一,你只说要学好英语,一个月过去了,二个月过去了,可能你就背了几个单词,慢慢的你连单词都不想背了,最后就果断放弃了。所以一定要设定一个时间期限,然后把这个时间铭记在心,这样可以加强自己我监督。这个时间期限不光可以设在总体的目标上,后面我们会将大的目标分解成很多小的阶段目标,每一个小的阶段目标都必须要有时间期限,这样我们才能定时的去检查我们自己的进度,时刻提醒自己有没有掉队或者跑错方向。 另外我还有几点自己的总结: 如果可能,请告诉你身边经常接触的人你的目标,这样等于是无形找人监督你(万一他某天突然问你英语学的怎么样了?你好意思说放弃了么)。 与身边的人分享你的进度,告诉他你进行的怎么样了,可以在每一个阶段完成的时候请大家喝奶茶或者吃饭什么的,相当于是奖励你自己了。 为你的目标找一个借口,或许这个借口就是你真实的目标也不一定,但是当你到底终点的时候这个已经不重要了。重点是一定要找到自己的兴趣点,比如说你非常想加工资,你就告诉自己,英语学好了你就可以加工资了,而且还能加好多工资,你肯定会像打鸡血了一样的。又或者说你想出国工作,那你就得告诉自己,你连英语都说不来,想出国工作?门都没有啊!!! 如果能找到同伴,那样最好,可以互相监督。但是这个不是必要的,像个男人一样,有些事情是需要你一个人扛起来的! 目标的分解 我们有了一个总体的目标之后,要习惯将它分解成一个一个的小目标。按照时间的维护可以分为: 短期目标(每一天,每一周,每一月) 长期目标(每一季度,每半年,每一年) 最终目标 按照内容的维护可以分为: 词汇量目标 听力能力目标(听力理解范围) 阅读能力目标(每分钟阅读单词数) 写作目标 口语表达目标 目标是会发生变化的 就是我们的需求一样,它是一定会变的!当然它和需求不一样的情况是,大多数情况下它都是变得更好,更高。刚开始工作需要被逼着看邮件,后来发现英语好了,做程序员待遇基本翻倍,于是加强了听和说的的锻炼。换了工作之后,发现原来可以出国,去看看外面的天也是一件很不错的事,于是把听和说又提高了一个台阶。到现在学英语已经完全成为了一种爱好一种习惯了,喜欢每天早上大声的读英文,听自己的口音,喜欢听美式和英式口音的区别。喜欢和外国人交流,想了解他们的文化,他们的历史。当一种行为变成一种爱好或者习惯,便一发不可收拾了。 总之,先根据自己的情况来设定目标,然后再把它细化。找一个最贴近你的目标,也许你暂时不用口头交流,那你只需要提高词汇量,加强语法和阅读训练就可以了。至于后面怎么样,我可以肯定的告诉你,目标是会发生变化的! 目标管理之计划 当我们有了一个清晰的目标之后,接下来的事情就是它需要一个完美的计划。这里我们可以借助我们软件开发过程中的WBS(任务分解结构)的方法来帮助我们制定计划。当然软件开发的时候是多个人协同合作,而学英语是需要我们自己一个人来完成的。 在这里,我们只是将它分解成6块而已,我的建议是最好一段时间专攻一项,因为我们毕竟是利用工作以外的时间来学习,专攻一项的话效果比较明显,自己也可以很清楚的看到进步。只有看到进步了,才会觉得有希望,连希望都看不到的时候,我想没有多少人可以坚持下去。所以要让自己看到进步,这很重要,哪怕只有一点的小进步,也会给你增加信心,这都是你坚持下去的动力。 学习任务之一:从哪里开始? 我想计划的难题可能是这个,因为如果起点找的不对,就很容易半途而废,所以这个起点很重要。我们要结合自己的特点以及现在的水平去找这个开始的点,千万不能别人是那样做的,你也那样做。 就我而已,因为基础实在是太差,连生活基础会话都说不来。所以我当时选择了《新概念第一册》,当然我不是自己学( 基础太差是没法自学的,光背几个单词也解决不了问题,还容易气馁),也没有去报班,报班的情况要不就是一周两三结课,这样效果太慢。要不就是连续几天封闭式上完,对我来说都不合适,所以我在网上下载了新东方老师以前的上课视频,也是从头到尾针对课文作讲解的,非常的详细。 在找到起点之后,接下来,我们就要作一个短期的计划和目标。这个是一定要的,大家看到新概念第一册总共是144课,但是老师是只讲单数课的,复数课自己复习。所以在我的电脑里面是有72节的视频课程,每一节的视频是1个小时,也就是说学完新概念第一册需要72小时。下面是我的计划表: 除了看视频以外,我们还要做以下3件事: 每一课后面的习题也是要做的,既然是基础,就一定要礼实。 背诵课文,这个任务可以在早上做,比较好实现。新概念第一册和第二册的课文都不难,很好背。 记每一课的单词,有了课文的背景,单词是很好背的,而且第一册是最基础的1700个,全是见过的。 学习任务之二:音标学习 […]
View DetailsDI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚。另外再介绍一下.NET Core的DI实现以及对实例生命周期的管理(这个是经常面试会问到的问题)。最后再给大家简单介绍一下在控制台以及Mvc下如何使用DI,以及如何把默认的Service Container 替换成Autofac。 我录了一些关于ASP.NET Core的入门视频:有兴趣的同学可以去看看。 http://www.cnblogs.com/jesse2013/p/aspnetcore-videos.html 一、什么是依赖注入 1.1 依赖 1.2 什么注入 为什么反转 何为容器 二、.NET Core DI 2.1 实例的注册 2.2 实例生命周期之单例 2.3 实例生命周期之Tranisent 2.4 实例生命周期之Scoped 三、DI在ASP.NET Core中的应用 3.1 在Startup类中初始化 3.2 Controller中使用 3.3 View中使用 3.4 通过HttpContext来获取 四、如何替换其它的Ioc容器 一、什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control),DI等概念搞晕。 1.1依赖 当一个类需要另一个类协作来完成工作的时候就产生了依赖。比如我们在AccountController这个控制器需要完成和用户相关的注册、登录 等事情。其中的登录我们由EF结合Idnetity来完成,所以我们封装了一个EFLoginService。这里AccountController就有一个ILoginService的依赖。 这里有一个设计原则:依赖于抽象,而不是具体的实现。所以我们给EFLoginService定义了一个接口,抽象了LoginService的行为。 1.2 什么是注入 注入体现的是一个IOC(控制反转的的思想)。在反转之前 ,我们先看看正转。 AccountController自己来实例化需要的依赖。 1 2 3 4 5 private ILoginService<ApplicationUser> _loginService; public AccountController() { _loginService = new EFLoginService() } 大师说,这样不好。你不应该自己创建它,而是应该由你的调用者给你。于是你通过构造函数让外界把这两个依赖传给你。 1 2 3 4 5 public AccountController(ILoginService<ApplicationUser> loginService) { _loginService = loginService; } 把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入。 1.3 为什么要反转? 为了在业务变化的时候尽少改动代码可能造成的问题。 比如我们现在要把从EF中去验证登录改为从Redis去读,于是我们加了一个 RedisLoginService。这个时候我们只需要在原来注入的地方改一下就可以了。 1 2 […]
View Details由于还使用elasticsearch,所以使用jedis没有使用lettuce 不然两个会冲突 1.pom引入
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> |
2.配置走一波,2.0版本之前的一些被移除了,我使用jedis就配置jedis了,使用lettuce的话一个样,换个名字就行
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Redis_config # Redis数据库索引(默认为0) spring.redis.database=3 # Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接超时时间(毫秒) spring.redis.timeout=3600 # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.jedis.pool.max-wait=-1 # jedis超时 spring.redis.jedis.shutdown-timeout=100 # 连接池中的最大空闲连接 spring.redis.jedis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.jedis.pool.min-idle=0 |
3.redis config走一波
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
package cc.datebook.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; /** * Redis缓存配置类 * @author wangH * */ @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Autowired private JedisConnectionFactory jedisConnectionFactory; /** * @description 自定义的缓存key的生成策略 * 若想使用这个key 只需要讲注解上keyGenerator的值设置为keyGenerator即可</br> * @return 自定义策略生成的key */ @Bean public KeyGenerator keyGenerator() { return new KeyGenerator(){ @Override public Object generate(Object target, Method method, Object... params) { StringBuffer sb = new StringBuffer(); sb.append(target.getClass().getName()); sb.append(method.getName()); for(Object obj:params){ sb.append(obj.toString()); } return sb.toString(); } }; } //缓存管理器 @Bean public RedisCacheManager cacheManager(JedisConnectionFactory jedisConnectionFactory) { return RedisCacheManager.create(jedisConnectionFactory); } /** * RedisTemplate配置 * * @param jedisConnectionFactory * @return */ @Bean public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory ) { //设置序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); //配置redisTemplate RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); redisTemplate.setConnectionFactory(jedisConnectionFactory); RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer);//key序列化 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value序列化 redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//Hash value序列化 redisTemplate.afterPropertiesSet(); return redisTemplate; } } |
4.jedis config 走一波
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package cc.datebook.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; @Configuration public class JedisRedisConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.password}") private String password; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.timeout}") private int timeout; @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.jedis.pool.max-wait}") private long maxWaitMillis; @Bean JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setHostName(host); factory.setPort(port); factory.setTimeout(timeout); factory.setPassword(password); return factory; } @Bean public JedisPool redisPoolFactory() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password); return jedisPool; } } |
5.然后直接用就行了
|
1 2 3 4 |
@Autowired private RedisTemplate redisTemplate; HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash(); |
from:https://blog.csdn.net/wangh92/article/details/79626969
View DetailsOrchard Core 是Orchard CMS的ASP.NET Core版本。 Orchard Core是全新一代的ASP.NET Core CMS。 官方文档介绍:http://orchardcore.readthedocs.io/en/latest/ GitHub: https://github.com/OrchardCMS/OrchardCore 下面快速开始搭建CMS 新建项目 打开VS2017 新建一个CMSWeb的ASP.NET Core Web应用程序 然后选择空模板 安装OrchardCore包 NuGet包命令 目前预览版需加 -Pre Install-Package OrchardCore.Application.Cms.Targets -Pre 或者在NuGet搜索 OrchardCore.Application.Cms.Targets 项目开发 打开Startup.cs ,在ConfigureServices加入
|
1 |
services.AddOrchardCms(); |
然后删除Configure 中的
|
1 2 3 4 |
app.Run(async (context) => { await context.Response.WriteAsync("Hello World!"); }); |
加入
|
1 |
app.UseModules(); |
最终如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Startup { // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddOrchardCms(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseModules(); } } |
然后运行程序,打开浏览会看到初始化安装界面。输入对应信息,然后完成安装。 注意密码必须包含大小写数字和字符才能成功提交。如上图中出现红色是不行的。 安装好后配置一下,最终如下: 后台为/Admin ,可以进入查看相关设置。 Orchard Core Framework:ASP.NET Core 模块化,多租户框架。 《ASP.NET Core跨平台开发从入门到实战》 京东淘宝亚马逊当当 博客示例代码GitHub:https://github.com/linezero/Blog from:https://www.cnblogs.com/linezero/p/OrchardCore.html
View DetailsSpring Boot 对常用的数据库支持外,对 Nosql 数据库也进行了封装自动化。 Redis 介绍 Redis 是目前业界使用最广泛的内存数据存储。相比 Memcached,Redis 支持更丰富的数据结构,例如 hashes, lists, sets 等,同时支持数据持久化。除此之外,Redis 还提供一些类数据库的特性,比如事务,HA,主从库。可以说 Redis 兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景。本文介绍 Redis 在 Spring Boot 中两个典型的应用场景。 如何使用 1、引入依赖包
|
1 2 3 4 5 6 7 8 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> |
Spring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redis,spring-boot-starter-data-redis依赖于spring-data-redis 和 lettuce 。Spring Boot 1.0 默认使用的是 Jedis 客户端,2.0 替换成 Lettuce,但如果你从 Spring Boot 1.5.X 切换过来,几乎感受不大差异,这是因为 spring-boot-starter-data-redis 为我们隔离了其中的差异性。 Lettuce 是一个可伸缩线程安全的 Redis 客户端,多个线程可以共享同一个 RedisConnection,它利用优秀 netty NIO 框架来高效地管理多个连接。 2、添加配置文件
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=localhost # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) 默认 8 spring.redis.lettuce.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 spring.redis.lettuce.pool.max-wait=-1 # 连接池中的最大空闲连接 默认 8 spring.redis.lettuce.pool.max-idle=8 # 连接池中的最小空闲连接 默认 0 spring.redis.lettuce.pool.min-idle=0 |
3、添加 cache 的配置类
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport{ @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } } |
注意我们使用了注解:@EnableCaching来开启缓存。 3、好了,接下来就可以直接使用了
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
@RunWith(SpringRunner.class) @SpringBootTest public class TestRedis { @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired private RedisTemplate redisTemplate; @Test public void test() throws Exception { stringRedisTemplate.opsForValue().set("aaa", "111"); Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa")); } @Test public void testObj() throws Exception { User user=new User("aa@126.com", "aa", "aa123456", "aa","123"); ValueOperations<String, User> operations=redisTemplate.opsForValue(); operations.set("com.neox", user); operations.set("com.neo.f", user,1, TimeUnit.SECONDS); Thread.sleep(1000); //redisTemplate.delete("com.neo.f"); boolean exists=redisTemplate.hasKey("com.neo.f"); if(exists){ System.out.println("exists is true"); }else{ System.out.println("exists is false"); } // Assert.assertEquals("aa", operations.get("com.neo.f").getUserName()); } } |
以上都是手动使用的方式,如何在查找数据库的时候自动使用缓存呢,看下面; 4、自动根据方法生成缓存
|
1 2 3 4 5 6 7 8 9 10 11 |
@RestController public class UserController { @RequestMapping("/getUser") @Cacheable(value="user-key") public User getUser() { User user=new User("aa@126.com", "aa", "aa123456", "aa","123"); System.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功"); return user; } } |
其中 value 的值就是缓存到 Redis 中的 key 共享 Session 分布式系统中,Session 共享有很多的解决方案,其中托管到缓存中应该是最常用的方案之一, Spring Session 官方说明 Spring Session provides an API and implementations for […]
View Details1. 消息队列的历史 了解一件事情的来龙去脉,将不会对它感到神秘。让我们来看看消息队列(Message Queue)这项技术的发展历史。 Message Queue的需求由来已久,80年代最早在金融交易中,高盛等公司采用Teknekron公司的产品,当时的Message queuing软件叫做:the information bus(TIB)。 TIB被电信和通讯公司采用,路透社收购了Teknekron公司。之后,IBM开发了MQSeries,微软开发了Microsoft Message Queue(MSMQ)。这些商业MQ供应商的问题是厂商锁定,价格高昂。2001年,Java Message queuing试图解决锁定和交互性的问题,但对应用来说反而更加麻烦了。 于是2004年,摩根大通和iMatrix开始着手Advanced Message Queuing Protocol (AMQP)开放标准的开发。2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。 目前RabbitMQ的最新版本为3.5.7,基于AMQP 0-9-1。 RabbitMQ采用Erlang语言开发。Erlang语言由Ericson设计,专门为开发concurrent和distribution系统的一种语言,在电信领域使用广泛。OTP(Open Telecom Platform)作为Erlang语言的一部分,包含了很多基于Erlang开发的中间件/库/工具,如mnesia/SASL,极大方便了Erlang应用的开发。OTP就类似于Python语言中众多的module,用户借助这些module可以很方便的开发应用。 2. AMQP messaging 中的基本概念 Broker: 接收和分发消息的应用,RabbitMQ Server就是Message Broker。 Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。 Connection: publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。 Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。 Exchange: message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。 Queue: 消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。 Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。 3. 典型的“生产/消费”消息模型 生产者发送消息到broker server(RabbitMQ)。在Broker内部,用户创建Exchange/Queue,通过Binding规则将两者联系在一起。Exchange分发消息,根据类型/binding的不同分发策略有区别。消息最后来到Queue中,等待消费者取走。 4. Exchange类型 Exchange有多种类型,最常用的是Direct/Fanout/Topic三种类型。 Direct Message中的“routing key”如果和Binding中的“binding key”一致, Direct exchange则将message发到对应的queue中。 Fanout 每个发到Fanout类型Exchange的message都会分到所有绑定的queue上去。 Topic 根据routing key,及通配规则,Topic exchange将分发到目标queue中。 Routing key中可以包含两种通配符,类似于正则表达式:
|
1 2 |
“<span class="hljs-comment">#”通配任何零个或多个word “*”通配任何单个<span class="hljs-built_in">word</span></span> |
这里也推荐给想要了解RabbitMQ的同学一个网站,http://tryrabbitmq.com ,它提供在线RabbitMQ 模拟器,可以帮助理解Exchange/queue/binding概念。 至此,我们对于消息队列的发展,RabbitMQ的产生,以及AMQP协议中的重要概念做了一个完整的介绍。 from:https://www.cnblogs.com/frankyou/p/5283539.html
View Details上篇文章介绍了 Spring Boot 初级教程:Spring Boot(一):入门篇,方便大家快速入门、了解实践 Spring Boot 特性;本篇文章接着上篇内容继续为大家介绍 Spring Boot 的其它特性(有些未必是 Spring Boot 体系桟的功能,但是是 Spring 特别推荐的一些开源技术本文也会介绍),对了这里只是一个大概的介绍,特别详细的使用我们会在其它的文章中来展开说明。 Web 开发 Spring Boot Web 开发非常的简单,其中包括常用的 json 输出、filters、property、log 等 json 接口开发 在以前使用 Spring 开发项目,需要提供 json 接口时需要做哪些配置呢 添加 jackjson 等相关 jar 包 配置 Spring Controller 扫描 对接的方法添加 @ResponseBody 就这样我们会经常由于配置错误,导致406错误等等,Spring Boot 如何做呢,只需要类添加 @RestController 即可,默认类中的方法都会以 json 的格式返回
|
1 2 3 4 5 6 7 8 9 10 |
@RestController public class HelloController { @RequestMapping("/getUser") public User getUser() { User user=new User(); user.setUserName("小明"); user.setPassWord("xxxx"); return user; } } |
如果需要使用页面开发只要使用@Controller注解即可,下面会结合模板来说明 自定义 Filter 我们常常在项目中会使用 filters 用于记录调用日志、排除有 XSS 威胁的字符、执行权限验证等等。Spring Boot 自动添加了 OrderedCharacterEncodingFilter 和 HiddenHttpMethodFilter,并且我们可以自定义 Filter。 两个步骤: 实现 Filter 接口,实现 Filter 方法 添加@Configuration 注解,将自定义Filter加入过滤链 好吧,直接上代码
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
@Configuration public class WebConfiguration { @Bean public RemoteIpFilter remoteIpFilter() { return new RemoteIpFilter(); } @Bean public FilterRegistrationBean testFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter()); registration.addUrlPatterns("/*"); registration.addInitParameter("paramName", "paramValue"); registration.setName("MyFilter"); registration.setOrder(1); return registration; } public class MyFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest request = (HttpServletRequest) srequest; System.out.println("this is MyFilter,url :"+request.getRequestURI()); filterChain.doFilter(srequest, sresponse); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } } } |
自定义 Property 在 Web 开发的过程中,我经常需要自定义一些配置文件,如何使用呢 配置在 application.properties 中
|
1 2 |
com.neo.title=纯洁的微笑 com.neo.description=分享生活和技术 |
自定义配置类
|
1 2 3 4 5 6 7 8 9 10 |
@Component public class NeoProperties { @Value("${com.neo.title}") private String title; @Value("${com.neo.description}") private String description; //省略getter settet方法 } |
log配置 […]
View Details推荐博客 纯洁的微笑 程序猿DD liaokailin的专栏 Spring Boot 揭秘与实战 系列 catoop的专栏 简书Spring Boot专题 方志朋Spring Boot 专栏 Spring-boot集成 推荐网站 Spring boot 官网 Spring Boot参考指南-中文版 Gradle 中文参考指南 慕课网视频 spring-boot-tutorials 开源书籍-微服务:从设计到部署 开源代码 spring boot官方例子 spring-boot-examples SpringBoot-Learning favorites-web springboot-learning-example spring-boot-all from:http://www.ityouknow.com/springboot/2015/12/30/springboot-collect.html
View Details1:在pom.xml 中 配置
|
1 2 3 4 5 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> |
注意:并不是pom.xml 的<build>标签中 2: 如果有页面的话 禁止页面缓存
|
1 2 3 4 5 6 7 8 9 |
spring: application: name: XXX aop: proxy-target-class: true thymeleaf: cache: false prefix: classpath:/templates/ mode: LEGACYHTML5 |
3:开idea工具的自动编译功能 完成以上步骤 即可实现SpringBoot项目自动编译+热部署,这我们修改后的代码能够立刻看到效果,提高效率! from:https://blog.csdn.net/woshiyeguiren/article/details/79312245 转者PS:其他构建工具可以去http://mvnrepository.com/搜索~
View Details什么是 Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。 使用 Spring Boot 有什么好处 其实就是简单、快速、方便!平时如果我们需要搭建一个 Spring Web 项目的时候需要怎么做呢? 1)配置 web.xml,加载 Spring 和 Spring mvc 2)配置数据库连接、配置 Spring 事务 3)配置加载配置文件的读取,开启注解 4)配置日志文件 … 配置完成之后部署 Tomcat 调试 … 现在非常流行微服务,如果我这个项目仅仅只是需要发送一个邮件,如果我的项目仅仅是生产一个积分;我都需要这样折腾一遍! 但是如果使用 Spring Boot 呢? 很简单,我仅仅只需要非常少的几个配置就可以迅速方便的搭建起来一套 Web 项目或者是构建一个微服务! 使用 Spring Boot 到底有多爽,用下面这幅图来表达 快速入门 说了那么多,手痒痒的很,马上来一发试试! Maven 构建项目 1、访问 http://start.spring.io/ 2、选择构建工具 Maven Project、Java、Spring Boot 版本 2.1.3 以及一些工程基本信息,可参考下图所示: 3、点击 Generate Project 下载项目压缩包 4、解压后,使用 Idea 导入项目,File -> New -> Model from Existing Source.. -> 选择解压后的文件夹 -> OK,选择 Maven 一路 […]
View Details