E商传奇系统之传奇缔造者是怎么样的,适合所有人创业吗

脱离tomcat容器在单独的java application的main函数中初始化spring
出chǔ:分享通过在java main函数中执行spring的代码
package com.zuidaima.
import org.springframework.context.support.GenericXmlApplicationC
import com.service.UserS
public class Main {
public static void main(String[] args) throws InterruptedException {
GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.setValidating(false);
context.load(&classpath*:applicationContext*.xml&);
context.refresh();
UserService userService = context.getBean(UserService.class);
while (true) {
System.out.println(userService.findUser());
Thread.sleep(10000);
UserService.java
package com.zuidaima.
import org.springframework.stereotype.S
public class UserService {
public String findUser() {
return &javaniu&;
代码下载地址:/share/4592.htm
&此文从网络中自动搜索生成,不代表本网站赞成被搜索网站的内容或立场
软件世界网- &2014 蜀ICP备号 三峰网旗下网站如何用Spring 3.1的Environment和Profile简化工作 - ImportNew
由于项目很紧,我每周写一篇技术博客的目标在12月份恐怕难以完成。我的周末一共只有4天,一个漂亮的家庭工作环境,当然这是为了方便做些其他的事情,而不是为了整天泡在Hack News上。现在已经是中午了,我还有2个小时完成这篇博客。马上开始!
我编写或设计的软件通常需要部署在不同的环境,也需要使用不同的部署配置。这些部署配置大致可以分为以下几类:
Java企业级容器(包括JBoss、WebLogic、Tomcat、Glassfish等)
独立运行的Java应用程序
GUI应用程序
本文暂不对GUI应用程序进行讨论,留到后续再说。对于其他的类型(容器、独立应用程序和测试框架)来说,代码往往是相同的。因此,在设计或者编码这类软件的时候,这一点非常关键。对于每种场景来说,我所写的代码需要完美运行在每一种场景中。
这是程序合格并且健壮的关键!这里的问题是,有一些资源的配置是与代码的运行平台息息相关的。在我编写单元测试的时候,我无法(其实我能,这么说是为了让你领会文章的主题)获得绑定到JNDI树上的数据源。而在容器中,我只需要遍历JNDI树,询问是否可以获取数据源即可。
另外,想Spring这样的框架也是鼓励这样的开发模式的,至少控制反转挺受欢迎。不同于直接用代码配置数据库和队列,Spring框架是在运行时注入这些对象的,生活依然美好。
你以为我的博客会把网上到处都是控制反转的示例代码再罗列一遍么?当然不是。看下面的代码:
public class BusinessClazz implements SomethingReallyImportant {
private DataSource dataS
public void setDataSource(DataSource dataSource) {
this.dataSource = dataS
数据源是通过运行时注入获得的,BusinessClazz对数据源本身一无所知。我不是世上最聪明的人,但也肯定不是最笨的人。我是说,我曾经读过像《J2ee Development Without Ejb》和《Expert one-on-one J2EE design and development》这类的书,并且自以为已经理解了其中的内容。但这些都是给妹子们看的,不是么?开个玩笑。我在Spring中间了一个数据源实例,并注入到BusinessClazz实例中。
&bean name=&myBusinessClazz&&
&property name=&dataSource& ref=&dataSource&/&
现在,我的可以完全不考虑数据源的具体实现,仍能在所有的部署环境中运行。但对于数据源呢,应该如何配置才能保证“一次配置,到处运行”?我们将注重对数据源的配置做说明,这个例子也是用于那些因运行环境或运行时不同而需要做修改的组件。
一般情况下,数据源需要两部分配置信息。第一部分是关于数据库位于何处,以及如何连接该数据库的信息。这里需要的信息包括主机名、款口端口号、服务名等。
第二部分是关于如何展示描述配置信息的。下面是一些可选方案。在其中,我建立了一个到数据库的连接,
&bean id=&dataSource& destroy-method=&close&
class=&mons.dbcp.BasicDataSource&&
&property name=&driverClassName& value=&org.hsqldb.jdbcDriver&/&
&property name=&url& value=&jdbc:hsqldb:hsql://localhost&/&
&property name=&username& value=&sa&/&
&property name=&password& value=&&/&
也可以使用Apache的commons-dbcp库创建一个连接池,
&bean id=&dataSource&
class=&mons.dbcp.BasicDataSource& destroy-method=&close&&
&property name=&driverClassName& value=&net.sourceforge.jtds.jdbc.Driver&/&
&property name=&url& value=&jdbc:myserver&/&
&property name=&username& value=&username&/&
&property name=&password& value=&password&/&
&property name=&initialSize& value=&2&/&
&property name=&maxActive& value=&5&/&
&property name=&maxIdle& value=&2&/&
还可以使用容器来管理连接,再从容器中获取连接,
&jee:jndi-lookup id=&dataSource& jndi-name=&java:mydatasource&/&
当然,还有其他许多方法可以配置数据源,但为了说明问题,上面的示例已经够用了。Spring框架的类可以用来处理随运行环境而变化的属性,使用简单,功能强大。
现在的问题是,如何在不同的部署环境中无缝切换,并选择不同类型的数据源呢?
本文所说的问题并不起最近才有的,在过去的6、7年中,许多部署团队想出了各种不同的方法来解决它。每个团队都针对其特定的问题,采取了适合自身条件的方法来解决,他们会在代码中加入一些自适应的判断来简化问题。
这里,希望代码可以“一次编写,到处运行”的最大驱动力之一,就是可以开发人员编写用于测试生还 生产环境代码的单元测试。
对这个问题的一个典型的示例方案是将数据源定义在不同上下文文件中,这些文件需要按照统一的命名约定来命名,以免造成混乱。例如,假设我们有3个操作模式,所以需要建3个不同的上下文文件,
datasources-containerContext.xml
datasources-pooledConnection.xml
datasources-singleConnection.xml
接下来就是平台相关的代码了,会在你的应用程序初始化Spring的时候执行。它通过Ant式的通配符跨越部署的类路径来查找上下文文件。
ClassPathXmlApplicationContext containerContext =
new ClassPathXmlApplicationContext(&**/**-containerContext.xml&);
ClassPathXmlApplicationContext nonContainerContext =
new ClassPathXmlApplicationContext(&**/**-pooledContext.xml&);
ClassPathXmlApplicationContext testingContextContext =
new ClassPathXmlApplicationContext(&**/**-singleContext.xml&);
好了,在刚刚过去的几个小时里,你已经建立一个可以在多种环境中运行的系统,所编写的代码也充分利用这个特点。这个办法你已经用了好几年了,但是,这个办法的主要缺点是,每个团队、每个项目都会有自己的方式来解决前面提到的问题。
使用Spring Profile
Spring 3.1为这个问题提供了一个解决方案(如果你还没有为自己的项目升级Spring版本,嗯,你麻烦大了)。
Spring在容器中引入Environment和Profile的概念。每个应用程序上下文都有一个都可以访Environment对象。
ClassPathXmlApplicationContext classPathXmlApplicationContext =
new ClassPathXmlApplicationContext();
ConfigurableEnvironment configurableEnvironment =
classPathXmlApplicationContext.getEnvironment();
每种运行环境都有很多活动Profile类可供使用。大多数讲解Spring Profile的例子都是在开发模式或生产模式下。对于不同运行环境问题来说,我的解决方案是使用使用多个Profile来适应不同运行时。这个解决方案的优势是你可以自行决定如何使用Profile。
默认星空情况下,你所创建的Bean在载入容器中后是没有Profile对象的。下面看一个例子。假设下面是我的应用程序中,数据源实例的定义。
&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&…&&
&bean id=&dataSource& destroy-method=&close&
class=&mons.dbcp.BasicDataSource&&
&property name=&driverClassName& value=&org.hsqldb.jdbcDriver&/&
&property name=&url& value=&jdbc:hsqldb:hsql://localhost&/&
&property name=&username& value=&sa&/&
&property name=&password& value=&&/&
在Spring 3.0中,增加了一个新的容器类 ,可以作为ClassPathXmlApplicationContext和FileSystemXmlApplicationContext之外的另一个选择。
GenericXmlApplicationContext类的特点是可以通过Setter方法完成所有的配置,而无需依靠笨重的构造器去完成配置。记住,在初始化容器的准备工作完成后,需要调用refresh()方法完成实际的初始化工作。
下面的代码展示了如何使用GenericXmlApplicationContext类初始化容器:
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.getEnvironment().setActiveProfiles(&standalone&);
ctx.load(&*Context.xml&);
ctx.refresh();
这里,我将活动Profile设置为“standalone”。在这个工程里,我希望代码既可以作为“standalone”运行在应用程序容器之外,还可以作为“container”运行在容器中。这里,我可以设置多个Profile,例如,下面的代码设置了Profile为“standalone”与“activemq”。
ctx.getEnvironment().setActiveProfiles(&standalone&, &activemq&);
虽然做了上面的配置,实际上并不会对当前的配置上下文产生影响,因为还没有配置Profile实例。所以,修改配置上下文为:
&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&…& profile=&standalone&&
&bean id=&dataSource& destroy-method=&close&
class=&mons.dbcp.BasicDataSource&&
&property name=&driverClassName& value=&org.hsqldb.jdbcDriver&/&
&property name=&url& value=&jdbc:hsqldb:hsql://localhost&/&
&property name=&username& value=&sa&/&
&property name=&password& value=&&/&
只有当活动Profile设置为“standalone”时,才会实例化这个Bean。Profile是Bean的属性,而不是一个实例对象,因此,你无法配置单独的Bean来选择Profile。在较早的Spring版本中,这会导致产生多个文件,而Ant的通配符无法在运行时找到正确的配置文件。
在Spring 3.1中,&beans/&标签可以嵌套在&beans/&标签内。现在,我们重新编写一下数据源配置文件:
&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&…&&
&beans profile=&standalone&&
&bean id=&dataSource&&
&property name=&driverClassName& value=&org.hsqldb.jdbcDriver&/&
&property name=&url& value=&jdbc:hsqldb:hsql://localhost&/&
&property name=&username& value=&sa&/&
&property name=&password& value=&&/&
&beans profile=&container&&
&jee:jndi-lookup id=&dataSource& jndi-name=&java:mydatasource&/&
这样,就可以通过下面的代码快速切换Profile:
ctx.getEnvironment().setActiveProfiles(&container&);
另一种切换Profile的方法是在运行时作为系统参数传入:
-Dspring.profiles.active=&standalone&
此外,也可以作为Ear/War的初始化参数传入:
&servlet-name&dispatcher&/servlet-name&
&servlet-class&
org.springframework.web.servlet.DispatcherServlet
&/servlet-class&
&init-param&
&param-name&spring.profiles.active&/param-name&
&param-value&production&/param-value&
&/init-param&
&/servlet&
阅读本文对你有什么帮助?
希望本文能够使你对Spring 3.1的新特性有所了解,这个新特性已经在Spring的3个主修订版中跳票了。
英文原文:,翻译: -
译文链接:
【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
关于作者:
码农一枚,热爱技术的技术菜鸟
不知道效率如何?期待楼主更新
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2017 ImportNewJAVA封装Mongodb操作之二:MongoOperations - soledede - ITeye技术网站
博客分类:
mongoOperation相对于MongoRepository来说,方法更多一些,也更接近于mongo的原生态语言。它的方法包括了MongoRepository的所有方法外,还有分组查询group(),update方法,mapreduce方法以及直接操作collection的方法;好多都是方法的参数里都有query参数。
体类user如下:
package com.mkyong.public class User {private Sprivate Sprivate Sprivate int // getter and setter methods }
接下来,我们看具体的操作代码,如下,这里假设要将user类保存到名为userprofile的数据集中。
package com.mkyong.import java.util.Limport org.springframework.context.ApplicationCimport org.springframework.context.annotation.AnnotationConfigApplicationCimport org.springframework.context.support.GenericXmlApplicationCimport org.springframework.data.document.mongodb.MongoOimport org.springframework.data.document.mongodb.query.Cimport org.springframework.data.document.mongodb.query.Qimport org.springframework.data.document.mongodb.query.Uimport com.mkyong.config.SpringMongoCimport com.mkyong.user.Upublic class App{public static void main( String[] args ){ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfig. class );MongoOperations mongoOperation = (MongoOperations)ctx.getBean( " mongoTemplate " );User user = new User( " 1001 " , " yong " , " mook kim " , 30 );// 保存 mongoOperation.save( " userprofile " ,user);// 查找 User savedUser = mongoOperation.findOne( " userprofile " ,new Query(Criteria.where( " id " ).is( " 1001 " )),User. class );System.out.println( " savedUser : " + savedUser);// 更新 mongoOperation.updateFirst( " userprofile " ,new Query(Criteria.where( " firstname " ).is( " yong " )), Update.update( " lastname " , " new lastname " ));User updatedUser = mongoOperation.findOne( " userprofile " ,new Query(Criteria.where( " id " ).is( " 1001 " )),User. class );System.out.println( " updatedUser : " + updatedUser);// 删除 mongoOperation.remove( " userprofile " ,new Query(Criteria.where( " id " ).is( " 1001 " )),User. class );// 显示当前列表 List & User & listUser = mongoOperation.getCollection( " userprofile " , User. class );System.out.println( " Number of user = " + listUser.size());}}
输出结果如下:
savedUser : User [id = 1001 , firstname = yong, lastname = mook kim, age = 30 ]updatedUser : User [id = 1001 , firstname = yong, lastname = new lastname, age = 30 ]Number of user =
Spring mongodb插入数据
下面详细讲解如何使用spring mongodb插入数据。在spring mongodb中,插入数据到
mongodb有如下几种方法:
User user = new User( " ... " );// 将user对象保存到"user"这个collection中 mongoOperation.save(user);// 将user对象保存到"new collection"这个collection中 mongoOperation.save( " new collection " ,user);// 将user对象保存到"user"这个collection中 mongoOperation.insert(user);// 将user对象保存到"new collection"这个collection中 mongoOperation.insert( " new collection " , user);// 将user的对象列表(List)保存到"user"collection中去 mongoOperation.insertList(userInList);// 将user的对象列表(List)保存到"new collection"collection中去 mongoOperation.insertList( " new collection " , userInList);
要注意的是,Spring mongodb中,当没有指定collection时,就会把对象保存到以对象命名的collection中。比如上例中的mongoOperation.insert(user),由于没指定collection的名称,所以会把user对象保存到user这个新建立的collection中。
另外请注意其中的save和insert的区别。它们的区别为:
1)save意思是,当记录不存在时插入,或者是当记录已存在是更新,实际上就是saveorupdate的意思。
2) insert的意思是:当记录不存在时插入,而如果记录存在时则忽略,继续插入。
下面举例子说明:
package com.mkyong.import java.util.ArrayLimport java.util.Limport org.springframework.context.ApplicationCimport org.springframework.context.annotation.AnnotationConfigApplicationCimport org.springframework.data.document.mongodb.MongoOimport org.springframework.data.document.mongodb.query.Cimport org.springframework.data.document.mongodb.query.Qimport com.mkyong.config.SpringMongoCimport com.mkyong.user.Upublic class App {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfig. class );MongoOperations mongoOperation = (MongoOperations) ctx.getBean( " mongoTemplate " );// 新增一个user对象,并把它放到"ABC"这个collection中 System.out.println( " Case 1... " );User userA = new User( " 1111 " , " user " , " A " , 99 );mongoOperation.save( " ABC " , userA);// 查找刚插入的user对象 User userA1 = mongoOperation.findOne( " ABC " ,new Query(Criteria.where( " id " ).is( " 1111 " )), User. class );System.out.println(userA1);// 插入新的user,放到userB这个collection中去 System.out.println( " Case 2... " );User userB = new User( " 2222 " , " user " , " B " , 99 );mongoOperation.save(userB);// 查找 User userB1 = mongoOperation.findOne(new Query(Criteria.where( " id " ).is( " 2222 " )), User. class );System.out.println(userB1);// 插入对象列表,放到arraylist中 System.out.println( " Case 3... " );User userC = new User( " 3333 " , " user " , " C " , 99 );User userD = new User( " 4444 " , " user " , " D " , 99 );User userE = new User( " 5555 " , " user " , " E " , 99 );List & User & userList = new ArrayList & User & ();userList.add(userC);userList.add(userD);userList.add(userE);mongoOperation.insertList( " ABC-List " , userList);List & User & users = mongoOperation.find( " ABC-List " , new Query(Criteria.where( " firstname " ).is( " user " )), User. class );for (User temp : users) {System.out.println(temp);}}}
输出结果如下:
Case 1 ...User [id = 1111 , firstname = user, lastname = A, age = 99 ]Case 2 ...User [id = 2222 , firstname = user, lastname = B, age = 99 ]Case 3 ...User [id = 3333 , firstname = user, lastname = C, age = 99 ]User [id = 4444 , firstname = user, lastname = D, age = 99 ]User [id = 5555 , firstname = user, lastname = E, age = 99 ]
更新Document
在mongodb中,可以使用save,updateFirst(),updateMulti()方法来进行更新,下面
是相关的例子
public class App {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfig. class );MongoOperations mongoOperation = (MongoOperations) ctx.getBean( " mongoTemplate " );User user = new User( " 1000 " , " user-first " , " user-last " , 17 );System.out.println( " Case 1...by save() " );mongoOperation.save(user);User userPrint1 = mongoOperation.findOne( new Query(Criteria.where( " id " ).is( " 1000 " )), User. class );System.out.println(userPrint1);// 修改user对象的lastname user.setLastname( " new last name " );// 更新user对象 mongoOperation.save(user);User userPrint2 = mongoOperation.findOne( new Query(Criteria.where( " id " ).is( " 1000 " )), User. class );System.out.println(userPrint2);// Case 2 ... update firstname field, $set System.out.println( " Case 2...by updateFirst() - $set " );// 将id为1000的user对象的firstname属性的值更新为”new firstname” mongoOperation.updateFirst( " user " ,new Query(Criteria.where( " _id " ).is( " 1000 " )),Update.update( " firstname " , " new first name " ));User userPrint3 = mongoOperation.findOne( new Query(Criteria.where( " id " ).is( " 1000 " )), User. class );System.out.println(userPrint3);// 对id为1000的user的age加上10 System.out.println( " Case 3...by updateFirst() - $inc " );Update updateAge = new Update();updateAge.inc( " age " , 10 );mongoOperation.updateFirst( " user " ,new Query(Criteria.where( " _id " ).is( " 1000 " )), updateAge);User userPrint4 = mongoOperation.findOne( new Query(Criteria.where( " _id " ).is( " 1000 " )), User. class );System.out.println(userPrint4);}}
Case 1 ...by save()User [id = 1000 , firstname = user - first, lastname = user - last, age = 17 ]User [id = 1000 , firstname = user - first, lastname = new last name, age = 17 ]Case 2 ...by updateFirst() - $setUser [id = 1000 , firstname = new first name, lastname = new last name, age = 17 ]Case 3 ...by updateFirst() - $incUser [id = 1000 , firstname = new first name, lastname = new last name, age = 27 ]
此外,还支持使用updateMulti,updateMulti是将所有的对象进行更新,比如:
mongoOperation.updateMulti( " user " ,new Query(Criteria.where( " firstname " ).is( " yong " )),Update.update( " age " , 40 ));
表示将所有firstname为yong的user对象的age属性全部更新为40。
查询Document
在spring mongodb中,可以使用findOne(),find()和getCollection()去查询mongodb,常见的用法如下:
User user = new User( " ... " );// 找到第一个id=1001的user对象 User user = mongoOperation.findOne( " test " , new Query(Criteria.where( " id " ).is( " 1001 " )), User. class );// 从test集合中获得所有id&=1000并且age=21的user对象 List & User & users = mongoOperation.find( " test " , new Query(Criteria.where( " id " ).lte( " 2001 " ).and( " age " ).is( 21 )), User. class );// 从test 集合中获得所有的user对象列表 List & User & users = mongoOperation.getCollection( " test " , User. class );
删除document
在spring mongodb中, 删除document使用remove方法,示例如下:
在spring mongodb中, 删除document使用remove方法,示例如下:User user = new User( " ... " );// 删除user集合中的user对象 mongoOperation.remove(user);// 删除test集合下的id=2的user对象 mongoOperation.remove( " test " , new Query(Criteria.where( " id " ).is( " 2 " )));// 删除test集合下的,id=3的user对象,最后并且返回这个被删除的对象 User deletedUser = mongoOperation.findAndRemove( " test " ,new Query(Criteria.where( " id " ).is( " 3 " )), User. class );
浏览: 587649 次
来自: 上海
楼主什么时候把gecko源码分析一下呢,期待
为什么还要写代码啊,如果能做到不写代码就把功能实现就好了
好厉害!求打包代码

我要回帖

更多关于 系统之传奇缔造者 的文章

 

随机推荐