小编Boz*_*zho的帖子

我应该将我的ThreadLocals放入弹簧注入的单例中吗?

有些人(例如在服务器端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 concurrency spring dependency-injection

14
推荐指数
3
解决办法
2万
查看次数

在什么情况下,旧版Java代码无法在较新版本上编译

Java正在努力向后兼容.(在某种程度上,它使其仿制品瘫痪了).

但有些旧代码无法在较新版本上编译的情况(更重要的是Java 5和即将推出的Java 7)

java

14
推荐指数
2
解决办法
640
查看次数

我可以在没有任何xml配置文件的情况下使用Spring注入Java对象吗?

我想以编程方式使用Spring注入一个普通的java对象,而不使用任何xml配置.要注入与标签标注的一样田/方法@EJB,@PostConstruct等等.这可能吗?谢谢!

java spring

14
推荐指数
1
解决办法
6122
查看次数

java动态代理与常规代理的有用性

我需要一些建议,动态代理比常规代理更有用.

我已经投入了大量精力来学习如何有效地使用动态代理.在这个问题中,抛开像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)

另一方面,合同只能避免实现完整接口的需要.然后,重构代理方法将无声地使动态代理无效.

结论 …

java proxy design-patterns use-case dynamic-proxy

14
推荐指数
2
解决办法
4568
查看次数

是否值得清除Filter中的ThreadLocals以解决与线程池相关的问题?

简而言之 - tomcat使用线程池,因此可以重用线程.有些库使用ThreadLocal变量,但不清理它们(使用.remove()),所以实际上它们会将"脏"线程返回到池中.

Tomcat具有在关闭时检测这些内容以及清理线程本地的新功能.但这意味着线程在整个执行过程中都是"脏"的.

我能做的是实现a Filter,并在请求完成后(并将线程返回到池中)ThreadLocal,使用tomcat中代码(调用的方法)清除所有s checkThreadLocalsForLeaks.

问题是,值得吗?两个优点:

  • 防止内存泄漏
  • 防止库的不确定行为,假设线程是"新鲜的"

一个骗局:

  • 该解决方案使用反射,因此它可能很慢.Field当然,所有反射数据都将被缓存,但仍然如此.

另一种选择是将问题报告给不清除其线程本地的库.

java multithreading tomcat servlets

14
推荐指数
1
解决办法
2740
查看次数

为什么TimeZone.getTimeZone(id)已同步,为什么没有记录?

java.util.TimeZone.getTimeZone(id)是一种基于id获取时区的方法.当我使用这个类时,我用反编译器打开它,发现它是synchronized.既然如此static,这意味着没有两个线程可以同时调用该方法.如果多个线程(例如在Web应用程序中)经常获得时区,这可能会非常痛苦.为什么必须同步?

然后我意识到文档没有说同步.所以,我的反编译器可能是错误的.然后我打开了源,它是同步的.为什么没有记录?我知道javadoc不包含synchronized关键字,但可以提到它.

当然,解决方案是使用joda-time DateTimeZone

java

14
推荐指数
2
解决办法
3155
查看次数

您对这一领域驱动设计的观点有什么问题?

我刚刚撰写了一篇关于我对域驱动设计的看法的长篇(和杂乱)博客文章,其中大量使用了spring和hibernate等框架.

我要求你发现我对这个问题的看法有什么问题 - 为什么这不起作用,为什么它没有给DDD的好处,为什么它一般不是一个好主意.

博客文章在这里(我认为我不需要复制粘贴在SO上 - 如果你认为我应该,请告诉我).

我知道这个问题是主观的,但它的目的是收集最主要的意见.

(我正在标记Java,因为讨论的框架是Java框架)

java oop domain-driven-design

13
推荐指数
1
解决办法
591
查看次数

Twitter日期不可解析?

我想将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.

干杯,

和我

java twitter date

13
推荐指数
2
解决办法
1万
查看次数

为什么MouseAdapter是适配器?

名称(和javadocs)意味着它MouseAdapter是一个适配器(设计模式).但我并没有这样认为 - 至少乍一看它并没有适应任何东西

发生的唯一适应是您可以将实例传递MouseAdapter给任何需要任一接口的方法.因此,您可以使用MouseListener只有MouseMotionListener预期的实例.但是没有"翻译"发生.并且它不符合GoF的UML - 在"类适配器"版本中,期望对一个方法的调用从适配器调用方法.

那么,这是一个适配器(设计模式),还是只是一个引起混淆的随机名称?

java design-patterns

13
推荐指数
2
解决办法
1211
查看次数

什么是运行时保留注释的scala替代方法

我刚刚意识到我在scala中没有注释,这些注释在运行时被保留和分析.我也检查了这个问题,但我没有完全了解它的替代方案.

  • DI - 答案提到scala中不需要DI框架.虽然在基本层面上可能就是这种情况(虽然我不太喜欢这个例子 ;处理DI的惯用方法是什么?),像Spring这样的Java DI框架非常先进,可以处理许多事情,比如预定的工作,缓存,托管持久性等,通过注释,有时 - 自定义的.

  • ORM - 我承认我没有尝试任何原生的scala ORM,但是从我在squeryl中看到的,它也使用了注释,这意味着它们是不可避免的?

  • 任何序列化工具 - 如何习惯性地将序列化输出自定义为JSON/XML/...?

  • Web服务框架 - 如何定义(在代码中)RESTful或SOAP服务的映射,标头等?

Scala用户需要使用混合scala/java(用于注释)项目才能使用来自Java的这些工具?

元数据的原生scala替代品是否比注释更好?我还没有完全进入scala思维模式,因此与使用注释相比,大多数示例对我来说都很难看,所以请尽量让人更有说服力:)

scala

13
推荐指数
1
解决办法
1119
查看次数