Spring集合类型的bean及其注入

集合类型的注入,下面是大家都熟悉的形式 <bean id="service"> <property name="map"> <map> <entry key="key1" value="value1" /> <entry key="key2" value="value2" /> </map> </property> <property name="set"> <set> <value>value1</value> <value>value2</value> </set> </property> <property name="list"> <list> <value>value1</value> <value>value2</value> </list> </property> <property name="props"> <props> <prop key="key1">value1</prop> <prop key="key2">value2</prop> </props> </property> </bean> 也可以让集合类型,独立出一个bean,然后再注入,这要用到util标签 <util:map id="map"> <entry key="key1" value="value1" /> <entry key="key2" value="value2" /> </util:map> <util:list id="list"> <value>value1</value> <value>value2</value> </util:list> <util:set id="set"> <value>value1</value> <value>value2</value> </util:set> <util:properties id="props"> <prop key="key1">value1</prop> <prop key="key2">value2</prop> </util:properties> <bean id="service"> <property name="map" ref="map" /> <property name="list" ref="list" /> <property name="set" ref="set" /> <property name="props" ref="props" /> </bean> 如果你想使用下面的这种形式,你需要在XML文件的头上引入util命名空间和模型规范文件: http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd 如下例: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

2014年5月11日 · 1 分钟

[转载/新闻]华为荣耀和腾讯合作要玩大的

华为荣耀要和腾讯合作了,华为荣耀已经在官方微博宣布这一消息,并邀请网友们猜测双方合作的具体内容。看来,华为荣耀这次又要有大动作了。 昨天晚上,微博认证为华为荣耀业务部总裁、荣耀掌门人的刘江峰发布了一条消息:这一次,我们一起携手,玩点更大的。配图则是腾讯大楼。消息一出,引发网友们的猜想,称华为荣耀要腾讯微信或QQ空间平台首发即将发布的新机,还有网友猜测双方要联合发布手机。 小米宣布5月15日要召开新品发布会的时候,华为荣耀也曾跟着出预告称有“好消息”,或许华为荣耀也会推出一款或多款新产品也说不定。 而除了小米官网外,小米在发售平台上也玩出过不少花样,如微信、QQ空间,以及百度贴吧等,因此,华为荣耀与腾讯某一平台合作首发新产品的可能性比较大。不过,刘江峰称要“玩点更大的”,或许也有更大的惊喜也说不定。

2014年5月10日 · 1 分钟

Spring中特殊的接口(持续更新中)

Spring中提供很多特殊的接口,只要你的bean,实现了这些接口,Spring就会自动帮你完成一些相应的功能,让你的bean实现的丰富多彩,方便实用。 1、初始化接口,org.springframework.beans.factory.InitializingBean 实现该接口,需要实现一个 afterPropertiesSet() 方法。该方法会在所以的成员属性set之后执行。你可以在这个方法里完成一些初始化的工作,例如读取配置文件,配置连接参 数,启动线程池等待。 2、销毁接口 org.springframework.beans.factory.InitializingBean 实现该接口,需要实现一个destroy() 方法。该方法当在Spring容器关闭的时候执行,你可以在这个方法里完成一些程序关闭时的销毁工作,例如线程池的关闭,连接的关闭,资 源的关闭等等。 3、获取bean的id接口 org.springframework.beans.factory.BeanNameAware 实现该接口,需要实现一个setBeanName(String name)方法,Spring会像其他属性一样,把bean的id注入给你,用处举例:你可以根据业务设置不同的bean,你可以根据不同的id ,完成不同的业务逻辑 4、获取Spring容器接口 org.springframework.context.ApplicationContextAware 实现该接口,需要实现一个setApplicationContext(ApplicationContext applicationContext)接口,Spring会像其他属性一样,把应用上下文注入给你,你拿到这个context,可以对Spring完成一些自己想要操作。 5、bean工厂接口 org.springframework.beans.factory.FactoryBean<MyClass> 该接口是以工厂的形式产生一个MyClass类型的bean。实现该接口需要实现三个方法,MyClass getObject() 返回MyClass实例,Class<?> getObjectType()返回的MyClass实例的具体类型, boolean isSingleton(),该bean是否在spring容器中单例存在。

2014年5月10日 · 1 分钟

[新闻]P7昨晚发布,再现华为精致做工

5月7日下午,华为在世界时尚之都法国巴黎召开发布会,正式发布了旗下年度旗舰机型华为P7,华为P7在继承了时尚外观设计的同时,也在硬件配置上进行了全方面的升级。 1、外观: 超薄的6.5mm机身,双面康宁玻璃,具有非常靓丽的镜面效果,机身中框采用金属材质,整体质感非常出色 2、屏幕 5英寸1080p全高清屏幕,ppi高达445。 3、CPU 内存 1.8GHz海思Kirin 910T四核处理器,内建2GB RAM和16GB ROM 4、相机 800万+1300万像素组合,其中主镜头为索尼最新堆栈式镜头,有着F2.0超大光圈 5、制式 广泛支持LTE 4G标准 华为P7 卓尔不群,最后让你欣赏一段展现华为完美做工的视频,超赞~

2014年5月8日 · 1 分钟

Spring使用占位符可配加密字符串

一个项目肯定会多少有些配置项,例如jdbc的一些配置,Spring的占位符,简化了对配置文件的读取,用起来极其方便。 1、假设你的配置项如下: jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=UTF8 jdbc.username=user jdbc.password=password jdbc.validationQuery=select 1 jdbc.maxActive=20 jdbc.initialSize=1 jdbc.minIdle=1 jdbc.maxWait=60000 jdbc.timeBetweenEvictionRunsMillis=3000 jdbc.minEvictableIdleTimeMillis=300000 jdbc.testWhileIdle=true jdbc.testOnReturn=false jdbc.testOnBorrow=false jdbc.defaultAutoCommit=true 写在配置文件config.properties中 2、你只要在Spring配置文件中配上如下bean <bean id="propertyConfigurer"> <property name="location" value="classpath:config.properties"/> </bean> 3、就可以在spring中自由注入你的配置项了 <bean abstract="true"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="${jdbc.maxActive}" /> <property name="initialSize" value="${jdbc.initialSize}" /> <property name="maxWait" value="${jdbc.maxWait}" /> <property name="minIdle" value="${jdbc.minIdle}" /> <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" /> <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" /> <property name="validationQuery" value="${jdbc.validationQuery}" /> <property name="testWhileIdle" value="${jdbc.testWhileIdle}" /> <property name="testOnBorrow" value="${jdbc.testOnBorrow}" /> <property name="testOnReturn" value="${jdbc.testOnReturn}" /> <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/> </bean> 4、如果你有些配置项是要加密的,在使用的时候需要解密。 这时你可以继承PropertyPlaceholderConfigurer,重写它的convertPropertyValue或者convertProperty方法进行解密 @Override protected String convertPropertyValue(String originalValue) { return 解密(originalValue); } @Override protected String convertProperty(String propertyName, String propertyValue) { return 解密(originalValue); } 然后把id=“propertyConfigurer"的class换成你自己的class。 这样就可以在配置文件中按你的格式配置密文了。

2014年5月8日 · 1 分钟

[新闻]2014年5月15日 '耀'你好看

重磅来袭,5月15日 华为荣耀将带给你一个好消息,具体什么好消息呢,515再告诉你。 这里总结一下网上的一些猜测: 猜测一、荣耀3X升级版 华为荣耀3X可谓是一款性价比不错的手机,不过在上个月华为推出了荣耀3X畅玩版之后,1698元的荣耀3X抢购的热度明显下降了。而究其原因,自然是荣耀3X与荣耀3X畅玩版的配置拉不开差距,但是售价差距过大。华为为了解决此问题,或许将推出一款升级版的荣耀3X。有人猜测荣耀3X升级版,屏幕分辨率将由720P升级到1080P,存储空间也有8G升级为16G,采用皮质后盖 猜测二、荣耀3C 4G版 荣耀3c 上市已经有一段时间了,荣耀3C是华为进入低端市场的排头兵,一站成名,但是随着相似配置的同类产品涌现,荣耀3C也需要升级一下了,随着4G来袭,有网友猜测,5月15日,荣耀3C可能会坐上4G快车。 猜测三、智能手环TalkBand B1正式推出 TalkBand B1在二月份发布,一直受到广泛关注,这款穿戴产品,该手环采用1.4英寸英寸屏幕,具备NFC、防水等功能,内置有多种传感器,可以计步、监测睡眠等,同时配备的小屏幕还能显示来电、久坐提醒等功能,,很有可能本次发布会,华为荣耀将正式发布TalkBand B1。备注:目前华为商城正在预约荣耀手环Halo的公测。 尚不明确TalkBand B1是否就是荣耀Halo 还是两款不同的产品。 相信华为品质,荣耀总给你惊喜,美好的事情又要发生了,敬请期待……

2014年5月6日 · 1 分钟

SEO我做了哪些优化(续)

7、百度URL主动提交 百度是收录是一个漫长的过程,即便它把你的网站所有内容都编入的索引,你也搜不到你的文章。除了 sitemap 之外,登陆百度站长工具还有“URL提交”的工具,你可以主动提交你认为是你原创的文章。百度如果判断认为你的文章符合收录条件,一般一两天就出现在site:zhaoyanblog.com搜索结果里了。 8、关键字优化 你的网站,你的网站要有一个主题比较集中的方向,然后首页固定几个关键字。 其次你的文章中也要有独自的关键字,当然你的文章核心要围绕你的首页的几个关键字。 假设你很多文章是围绕关键字‘荣耀3c’的内容,并且被百度收录了,那么当用户搜‘荣耀3c’的时候,搜到你的文章的几率就会大一点,再假设用户搜到‘荣 耀3c’,点击你的文章的次数多一点,你的排名就会靠前。假设排到100名以内,那么你的百度权重就来了,百度权重就是这么定义的,关键字搜索的排名。注 意关键字要是有百度指数的关键字才行。 最近发现文章的名字也很重要,百度真的特别喜欢‘十大原因’、‘八大方法’、‘三个技巧’之类的文章。 百度指数:http://index.baidu.com/ 9、有质量的反链 不要在一些垃圾网站上发一些你的网站的链接,你可以在csdn,博客中国等知名博客上开一个博客网站,每次你有新的文章的时候都在这些网站上发表一篇博客,然后引用部分文章内容,然后贴上你那篇文章的url,一般这些知名网站的收录是比较快的,会对你的文章的收录有一点好处的。 10、尽量少的外链 尽量少的外部链接,这个对网站的收录是没有任何好处的,而且如果外部链接很垃圾的话,甚者会影响网站的收录,特别是一些访问很慢的网站,广告等,也会拖慢你网站的访问效率。如果你的网站访问很慢,甚者无反应的,google是很敏感的,你在google注册的网站站长工具会很快收到一条警告。

2014年5月5日 · 1 分钟

elasticsearch的java搜索语法

elasticsearch作为开源的搜索引擎,支持复杂的搜索,本文示例用java客户端实现的搜索。 1、maven引入依赖jar包 <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>1.1.0</version> </dependency> 2、产生client Settings settings = ImmutableSettings.settingsBuilder() .put("client.transport.sniff", true) .build(); TransportClient client = new TransportClient(settings); 3、使用query查询 SearchResponse actionGet = client.prepareSearch("indexName") .setTypes("typeName") .setQuery( QueryBuilders.boolQuery().must(QueryBuilders.termQuery("attr1", "value1")) ).execute().actionGet(); SearchHits hits = actionGet.getHits(); List<Map<String, Object>> matchRsult = new LinkedList<Map<String, Object>>(); for (SearchHit hit : hits.getHits()) { matchRsult.add(hit.getSource()); } 查询条件有好多种形式,都可以通过QueryBuilders来构建组合: QueryBuilders.inQuery("attr1", new String[{"value1","value2","value3"}); QueryBuilders.rangeQuery("attr1").gt("value1")//gt lt eq gte lte; 查询的形式和意思都可以根据方法名猜测的出来。 4、使用filter查询 filter和query的使用方式类似,它是使用FilterBuilders来构建查询条件。 不过比query多了or、and关系查询 FilterBuilders.orFilter(FilterBuilders.termFilter("attr1", "value1"),FilterBuilders.termFilter("attr2", "value2")); FilterBuilders.andFilter(FilterBuilders.termFilter("attr1", "value1"),FilterBuilders.termFilter("attr2", "value2")); 是通过 .setPostFilter(filter) 指定给search; 5、分页查询 一种方式是指定from/size ...

2014年5月4日 · 1 分钟

JAVA泛型之我见

java在1.5之前是没有泛型的,是后来加的,加了之后用起来感觉和C++的泛型差不多,但是原理是不一样的,C++的泛型是有宏演变而来的,虽然对泛型的处理不包含在预编译阶段 ,但是对泛型的处理也是简单的替换操作,也就是说泛型就相当于一个模版,在编译过后,编译器会帮你生成一个个具体的类。 java不同,java的模版类就是一个类,里面的参数T 不过是它的一个成员变量而已,只不过在构造示例的时候,以模版类型的方式传递。举个例子说: class Template<T>{} 它就是一个类,Template<String>(); 就是一个实例,String只不过是构造方法(可以这样理解)的一个参数而已,java编译器不会帮你生成一个新的类。 java的泛型在设计之初就是因为Object当作“任意”类型的时候,编译阶段无法进行类型检查,而引入了一个T参数,让你在构造对象的时候,强制你指定类型,它就可以做一些类 型检查了,你也可以进行对一个“任意”类型的功能实现,达到代码重用的目的。 对于Template<T> 这样的类型的实现子类,例如: class MyTemplate1 extend Template<String>{} class MyTemplate2 extend Template<Integer>{} 对于MyTemplate1和MyTemplate2的父类都是Template.class 但是又有所不同,上文说过Template本身就是一个类型,不是一个类的模版。所以为了描述MyTemplate1和MyTemplate2 的父类型的不同。 jdk又引入了一个ParameterizedType类型,它和Class 一样继承于Type类型。 它包含了一个泛型实例( Template<Integer>())的类型信息。 如果你想得到一个这样的类型,你只有通过泛型类型的子类得到,也就是说MyTemplate1的父类型才是这样的类型。 你通过Template<Integer> instance = new Template<Integer>()是得不到的这样的类型的。 你只有通过MyTemplate2的才可以得到: ParameterizedType type = (ParameterizedType)MyTemplate2.class.getGenericSuperclass(); 或者是通过一个匿名类 ParameterizedType type = new Template<Integer>(){}.getClass().getGenericSuperclass(); 可以通过ParameterizedType 的getActualTypeArguments()方法 拿到里面的Integer类型。 所以你在用各种json工具的时候,你会发现他们当把Json转成一个对象的时候,它都要求你传入一个Type类型,而不是一个Class类型 因为一个Class类型是无法描述Map<String,String>()这种类型全部信息的,那些json工具是无法通过一个Map.class帮你把把字符串转成一个具体的map的。 而且Map<String,String>()也不是一个类, 这时你可以传入一个ParameterizedType类型。 这样你就可以理解为什么像fastjson那样会提供下面这样一个类了: public class TypeReference<T> { private final Type type; protected TypeReference(){ Type superClass = getClass().getGenericSuperclass(); type = ((ParameterizedType) superClass).getActualTypeArguments()[0]; } public Type getType() { return type; } public final static Type LIST_STRING = new TypeReference<List<String>>() {}.getType(); } 解释一下 new TypeReference<List<String>>() {} 是TypeReference<List<String>>的一个匿名子类。 它的getGenericSuperclass() 就是TypeReference<List<String>> 这种类型(ParameterizedType)。 它的参数也就是List<String> 也是一个ParameterizedType类型。

2014年4月30日 · 1 分钟

[新闻]华为荣耀发布新品荣耀手环Halo

4月23日 华为举行发布会,除了如大家所想的荣耀X1 4G版外,华为发布了一款荣耀家族新成员–荣耀手环Halo 荣耀手环Halo支持手机App、运动记录、睡眠监测、蓝牙耳机、云端同步,号称真正炫酷好玩又健康的玩具。 荣耀手环在华为商城vmall官网已经开启预约,预约时间是:4月29日11:00-5月6日18:00 下面提前一睹它的芳容,心动的就去预约吧:http://mm.vmall.com/halo.html

2014年4月29日 · 1 分钟

荣耀家族制式说明

荣耀3c 1G移动版 支持移动3G TD-CDMA 移动联通2G GSM 1G电信版 支持电信3G CDMA2000 电信2G CMDA 移动联通2G GSM 2G移动版 支持移动3G TD-CDMA 移动联通2G GSM 2G联通版 支持联通3G WCDMA 移动联通2G GSM 1G移动4G版 支持移动4G TDD-LTE 移动3G TD-CDMA 移动联通2G GSM 2G移动4G版 支持移动4G TDD-LTE 移动3G TD-CDMA 移动联通2G GSM 1G联通4G版 支持移动4G TDD-LTE 联通3G WCDMA 移动联通2G GSM 2G联通4G版 支持移动4G TDD-LTE 联通3G WCDMA 移动联通2G GSM 荣耀3c畅玩版 1G移动版 支持移动3G TD-CDMA 移动联通2G GSM 1G联通版 支持联通3G WCDMA 移动联通2G GSM 荣耀3x、荣耀3x Pro 支持移动3G TD-CDMA 联通3G WCDMA 移动联通2G GSM ...

2014年4月28日 · 2 分钟

java实现cassandra的增删改查

cassandra使用cql语言作为操作语言,cassandra在2.0之后,在操作上越来越像sql数据库的操作,这样想从传统关系型数据库,切换到cassandra的花,上手成本也越来越低。使用官方java驱动操作cassandra 非常简单。 maven引入驱动包 <dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>2.0.1</version> </dependency> 1、创建应用的唯一session。 Cluster cluster = Cluster.builder() .addContactPoint("192.168.22.161") .build(); 这里构建一个集群对象,“192.168.22.161” 是cassandra的种子节点(seed node). Session session = cluster.connect(); 你也可以针对一个特定的keyspace获取一个session Session session = cluster.connect("mykeyspace"); session是线程安全的,所以一个应用中,你可以只有一个session实例,官方建议一个keyspace一个session。 2、session可以直接支持执行cql语句。 String cql = "select * from mykeyspace.tablename;"; session.execute(cql); 你完全可以用这种方式完成任意操作,记住cql语句后面一定要带分号。 3、如果你不想繁琐的去拼字符串,你可以用com.datastax.driver.core.Querybuilder。 insert 一条记录String cql = “insert into mykeyspace.tablename(a,b) values(1,2);” 你可以这样写: session.execute( QueryBuilder.insertInto("mykeyspace", "tablename") .values(new String[]{"a","b"}, new Object[]{1,2})); delete 记录String cql = “delete from mykeyspace.tablename where a=1”; 你可以这样写: session.execute(QueryBuilder.delete() .from("mykeyspace", "tablename") .where(QueryBuilder.eq("a", 1))); update 记录String cql = “update mykeyspace.tablename set b=2 where a=1” ...

2014年4月27日 · 1 分钟

cassandra关于集合类型的操作

举例: create table test( a int, b list<text>, c set<text>, d map<text,text>, primary key(a) ); 插入使用下面的形式 insert into test(a,b,c,d) values(1,[’listtext1’,’listtext2’],{‘settext1’,‘settext2’},{‘mapkey1’:‘mapvale2’,‘mapkey2’:‘mapvalue2’}); 第一: list类型 增加元素: update test set b=b+[’listtext3’,’listext4’] where a=1; 删除第i个元素: 你可以使用 delete b[i] from test where a=1; 或者 update test set b[i]=null where a=1; 注:后者的方法是可行的,不过官方文档没有说明 删除内容为listtext1和listtext2的元素 update test set b = b-[’listtext1’,’listtext2’] where a=1; 第二: Set类型 增加元素 update test set c=c+{‘settext3’,‘settext4’} where a=1; 删除元素 update test set c=c-{‘settext1’,‘settext2’} where a=1; ...

2014年4月25日 · 1 分钟

荣耀X1土豪小资必备的五大优势

荣耀X1,生来就不是为平常小厮们所准备的,它处处透着土豪的气质,不自觉的大气上档次,下面是荣耀X1突出的N个特点 1、屏大 荣耀X1的屏不是一般的大,在手机界,已经找不出比它还大,即便未发布的三星note 4,传闻也就是6.3寸屏,而荣耀X1的屏达到了7寸,采用LTPS技术,全贴合屏,1920 x 1200的像素,史无前例,就是平板电脑的范儿。 2、4G全制式 虽然荣耀X1外观大小可比平板电脑,但是它还是一部手机,而且是一部4G手机,无论是TDD-LTE还是FDD-LTE的4G标准,无论是WCDMA TD-CDMA的3G标准 还是GSM的2G标准,它通吃。在家当平板,出门做电话,倍有面啊。 3、高配置 配置是强劲的,没话说,4核处理器,2G内存,足够的配置,PC机也不过这样的配置。这样的大的屏幕,配的是5000mA的大电池。1300万/500万相机,F2.2大光圈。 4、极致外观 极其方正的外观,典雅朴素,是我的菜。航空铝材金属机身,2.99mm窄边框,7.1mm的超薄机身,只有239g 5、高性价比 3G版的1799 4G版的1999. 等同于同时拥有了一部手机,一部平板,荣耀X1,土豪小资值得拥有。

2014年4月23日 · 1 分钟

提高alexa排名就是这样简单

第一步: 自己安装一个alexa工具条,浏览下自己的网站,此时你就有了最初始的排名。可能是几千万之后。 第二步: 每天都浏览一下自己的网站,你会发现你的排名很容易的在前进,不过在进入几百万名的时候,提升就相当缓慢了。 第三步: 加入elexa排名显示代码: <script> document.write("<script src=‘http://xslt.alexa.com/site_stats/js/t/b?url=zhaoyanblog.com’></script>");</script> 显示效果如下: 这样即便不安装alexa工具条的人,访问你的网站,也会有助于提升alexa排名。 第四步: 如果你的用户量不多的话,你的排名还是徘徊在百万名范围内。所以要刷流量,不能用代码刷,必须用真实的客户端。 百度的加速乐测速工具,使用全国分布的真实客户端进行测速,你只要每天测个两下,你的流量就上去了。 测速地址;http://jiasule.baidu.com/tools/realtime_speed/ 亲身体验,上述方法可以让你的网站排名达到几十万,国内排名2万以内。 不过本站使用的是廉价的虚拟机,这样的测试对服务器冲击较大,就不再去刷排名了,本来这个博客就是玩玩而已嘛~~~

2014年4月20日 · 1 分钟