有些人(例如在服务器端http://www.theserverside.com/news/thread.tss?thread_id=41473)建议使用ThreadLocal对象与使用全局变量一样糟糕.我想如果你把它们变成公共静态变量就行了.那么问题是很难分辨它的使用位置,改变的地方等等.
在我的春天DI tomcat web-app中,它似乎可以解决这个问题,如果我只是为了创建一个包含我的ThreadLocal的单例对象,然后将该单例注入任何需要它的类中.
所以我的单身人士看起来像这样:
@Component
public class Username {
private ThreadLocal<String> username;
public Username() {
username = new ThreadLocal<String>();
}
public String getUsername()
return username.get();
}
public void setUsername(String name) {
username.set(name);
}
}
Run Code Online (Sandbox Code Playgroud)
可能需要它的类看起来像这样:
@Service
public class addEntryTransaction {
@Autowired
Username username;
public void method() {
...
log("Method called by "+username.getUsername());
...
}
}
Run Code Online (Sandbox Code Playgroud)
这仍然具有不必通过许多不关心的层传递用户名的好处,因此保持方法参数更简单.@Autowired是此类使用该变量的声明.
这种方法有哪些优缺点?
Java正在努力向后兼容.(在某种程度上,它使其仿制品瘫痪了).
但有些旧代码无法在较新版本上编译的情况(更重要的是Java 5和即将推出的Java 7)
我想以编程方式使用Spring注入一个普通的java对象,而不使用任何xml配置.要注入与标签标注的一样田/方法@EJB,@PostConstruct等等.这可能吗?谢谢!
我需要一些建议,动态代理比常规代理更有用.
我已经投入了大量精力来学习如何有效地使用动态代理.在这个问题中,抛开像AspectJ这样的框架基本上可以执行我们尝试使用动态代理实现的所有内容,或者例如CGLIB可以用来解决动态代理的一些缺点.
是其他人吗?
public Object invoke(Object target, Method method, Object[] arguments) {
System.out.println("before method " + method.getName());
return method.invoke(obj, args);
}
}
Run Code Online (Sandbox Code Playgroud)
装饰器模式肯定是有用的,因为它允许所有代理方法的副作用(尽管这种行为是书籍 - 使用方面的例子..).
public Object invoke(Object target, Method method, Object[] arguments) {
if ("getValues".equals(method.getName()) {
// check or transform parameters and/or return types, e.g.,
return RangeUtils.validateResponse( method.invoke(obj, args) );
}
if ("getVersion".equals(method.getName()) {
// another example with no delegation
return 3;
}
}
Run Code Online (Sandbox Code Playgroud)
另一方面,合同只能避免实现完整接口的需要.然后,重构代理方法将无声地使动态代理无效.
简而言之 - tomcat使用线程池,因此可以重用线程.有些库使用ThreadLocal变量,但不清理它们(使用.remove()),所以实际上它们会将"脏"线程返回到池中.
Tomcat具有在关闭时检测这些内容以及清理线程本地的新功能.但这意味着线程在整个执行过程中都是"脏"的.
我能做的是实现a Filter,并在请求完成后(并将线程返回到池中)ThreadLocal,使用tomcat中的代码(调用的方法)清除所有s checkThreadLocalsForLeaks.
问题是,值得吗?两个优点:
一个骗局:
Field当然,所有反射数据都将被缓存,但仍然如此.另一种选择是将问题报告给不清除其线程本地的库.
java.util.TimeZone.getTimeZone(id)是一种基于id获取时区的方法.当我使用这个类时,我用反编译器打开它,发现它是synchronized.既然如此static,这意味着没有两个线程可以同时调用该方法.如果多个线程(例如在Web应用程序中)经常获得时区,这可能会非常痛苦.为什么必须同步?
然后我意识到文档没有说同步.所以,我的反编译器可能是错误的.然后我打开了源,它是同步的.为什么没有记录?我知道javadoc不包含synchronized关键字,但可以提到它.
当然,解决方案是使用joda-time DateTimeZone
我想将Twitter响应中的日期字符串转换为Date对象,但我总是得到一个ParseException,我看不到错误!?!
输入字符串:Thu Dec 23 18:26:07 +0000 2010
SimpleDateFormat 图案:
EEE MMM dd HH:mm:ss ZZZZZ yyyy
Run Code Online (Sandbox Code Playgroud)
方法:
public static Date getTwitterDate(String date) {
SimpleDateFormat sf = new SimpleDateFormat(TWITTER);
sf.setLenient(true);
Date twitterDate = null;
try {
twitterDate = sf.parse(date);
} catch (Exception e) {}
return twitterDate;
}
Run Code Online (Sandbox Code Playgroud)
我也试过这个:http://friendpaste.com/2IaKdlT3Zat4ANwdAhxAmZ但是给出了相同的结果.
我在Mac OS X上使用Java 1.6.
干杯,
和我
名称(和javadocs)意味着它MouseAdapter是一个适配器(设计模式).但我并没有这样认为 - 至少乍一看它并没有适应任何东西
发生的唯一适应是您可以将实例传递MouseAdapter给任何需要任一接口的方法.因此,您可以使用MouseListener只有MouseMotionListener预期的实例.但是没有"翻译"发生.并且它不符合GoF的UML - 在"类适配器"版本中,期望对一个方法的调用从适配器调用方法.
那么,这是一个适配器(设计模式),还是只是一个引起混淆的随机名称?
我刚刚意识到我在scala中没有注释,这些注释在运行时被保留和分析.我也检查了这个问题,但我没有完全了解它的替代方案.
DI - 答案提到scala中不需要DI框架.虽然在基本层面上可能就是这种情况(虽然我不太喜欢这个例子 ;处理DI的惯用方法是什么?),像Spring这样的Java DI框架非常先进,可以处理许多事情,比如预定的工作,缓存,托管持久性等,通过注释,有时 - 自定义的.
ORM - 我承认我没有尝试任何原生的scala ORM,但是从我在squeryl中看到的,它也使用了注释,这意味着它们是不可避免的?
任何序列化工具 - 如何习惯性地将序列化输出自定义为JSON/XML/...?
Web服务框架 - 如何定义(在代码中)RESTful或SOAP服务的映射,标头等?
Scala用户需要使用混合scala/java(用于注释)项目才能使用来自Java的这些工具?
元数据的原生scala替代品是否比注释更好?我还没有完全进入scala思维模式,因此与使用注释相比,大多数示例对我来说都很难看,所以请尽量让人更有说服力:)