小编Stv*_*dll的帖子

何时执行类的静态块?

我有2个罐子,我们称之为a.jar和b.jar.

b.jar取决于a.jar.

在a.jar中,我定义了一个类,我们称之为StaticClass.在StaticClass中,我定义了一个静态块,调用名为"init"的方法:

public class StaticClass {
  static {
    init();
  } 

  public void static init () {
    // do some initialization here
  }
}
Run Code Online (Sandbox Code Playgroud)

在b.jar中,我有一个main,所以在main中,我希望已经调用了init()方法,但实际上并没有.我怀疑是因为静态类没有被jvm加载,任何人都可以告诉我

  1. 我的结论是否正确?
  2. 触发jvm加载类的原因是什么?
  3. 如何自动执行静态块?

谢谢

java initialization

69
推荐指数
3
解决办法
6万
查看次数

如何使用Spring和Tomcat设置加载时编织而不在命令行上使用-javaagent

我使用的是Spring 3.2.9,Tomcat 6.0.44

我正在尝试配置我的应用程序的Spring检测提供程序(例如spring-instrumentation.jar)进行加载时编织,当它部署在Tomcat上时.

我要求不要在命令行上使用"-javaagent:/path/path/spring-instrument.jar"来进行配置.

我已经读过,我可以通过修改应用程序的Tomcat配置的<Context>元素来配置Spring检测(在Tomcat的server.xml或我的web应用程序的context.xml中).将适当的<Context>元素添加到server.xml会导致我的应用程序正确配置为与Spring的检测提供程序一起运行.将它添加到context.xml(见下文)不会导致工作设置.

我有一个META-INF/aop.xml文件,如下所示:

    <aspectj>
        <weaver options="-verbose -showWeaveInfo -debug">
            <include within="com.mv.xx.services..*"/>
            <exclude within="com.mv.xx.aop..*"/>
        </weaver>
        <aspects>
            <aspect name="com.mv.xx.aop.MyAspect"/>
        </aspects>
    </aspectj>
Run Code Online (Sandbox Code Playgroud)

我还指定我想通过将其添加到我的Spring上下文配置来使用加载时编织:

 <context:load-time-weaver />
Run Code Online (Sandbox Code Playgroud)

我将这个jar添加到我的应用程序的类路径:spring-instrument-tomcat.jar

我做了什么:

启动Tomcat时,如果我使用-javaagent参数在命令行上识别spring-instrument.jar的位置,如下所示:

-javaagent:/path/path2/spring-instrument-3.2.9.RELEASE.jar
Run Code Online (Sandbox Code Playgroud)

一切正常.


接下来,我从命令行中删除了"-javaagent:/path/path2/spring-instrument-3.2.9.RELEASE.jar".在Tomcat的server.xml文件(位于$ CATALINE_HOME/conf中)中,我向<Host>元素添加了一个<Context>元素,如下所示:

<Context path="/myApp" docBase="myApp">
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
Run Code Online (Sandbox Code Playgroud)

使用此配置,一切都正常.但是我要求不修改Tomcat的server.xml,因为我无法控制server.xml(DevOps会这样做,并且不愿修改它).


接下来,我从Tomcat的server.xml中删除了<Context>元素.根据Spring文档,我可以在我的webapp中添加/META-INF/context.xml,并将以前在Tomcat的server.xml中的<Context>元素放入context.xml中,如下所示:

        <Context>
            <Context path="/myApp" docBase="myApp">
                <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
            </Context>
        </Context>
Run Code Online (Sandbox Code Playgroud)

但是,当我重新启动Tomcat时,我在日志中收到一条错误消息:

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.weaving.AspectJWeavingEnabler#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating …
Run Code Online (Sandbox Code Playgroud)

spring tomcat spring-aop context.xml load-time-weaving

6
推荐指数
1
解决办法
4472
查看次数

传递其他参数来绑定?

我有两个看起来像这样的函数:

  primaryImageLoaded () {
    this.setState({primaryImageLoaded: true})
  }

  secondaryImageLoaded () {
    this.setState({ secondaryImageLoaded: true })
  }
Run Code Online (Sandbox Code Playgroud)

它们被称为这样(使用反应):

onLoad={this.secondaryImageLoaded.bind(this)
Run Code Online (Sandbox Code Playgroud)

这感觉过度,我想只有一个函数,并将状态变量作为参数传递,但我怎么能传递一个额外的参数.bind?是否可以在我传递给的对象中使用变量作为键setState

javascript reactjs

6
推荐指数
1
解决办法
5713
查看次数

使用同步块的Java中的并发性未给出预期结果

下面是一个简单的java程序.它有一个名为"cnt"的计数器,它会递增,然后添加到名为"monitor"的List中."cnt"由多个线程递增,并且值被多个线程添加到"监视器".

在方法"go()"的末尾,cnt和monitor.size()应该具有相同的值,但它们不具有相同的值.monitor.size()确实有正确的值.

如果通过取消注释其中一个已注释的同步块来更改代码,并注释掉当前未注释的块,则代码会生成预期结果.此外,如果将线程计数(THREAD_COUNT)设置为1,则代码会生成预期结果.

这只能在具有多个真实核心的计算机上重现.

public class ThreadTester {

    private List<Integer> monitor = new ArrayList<Integer>();
    private Integer cnt = 0;
    private static final int NUM_EVENTS = 2313;
    private final int THREAD_COUNT = 13;

    public ThreadTester() {
    }

    public void go() {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                for (int ii=0; ii<NUM_EVENTS; ++ii) {
                    synchronized( monitor) {
                        synchronized(cnt) {        // <-- is this synchronized necessary?
                            monitor.add(cnt);
                        }
//                        synchronized(cnt) {
//                            cnt++;        // <-- why does moving …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading synchronized synchronized-block

5
推荐指数
1
解决办法
180
查看次数

Spring OAuth2解释了授权服务器配置

我正在尝试实现OAuth安全性并遇到一个问题,对我来说配置类不够清晰.

实施时AuthorizationServerConfigurer我有三个配置器:

  • ClientDetailsServiceConfigurer用于提供如何以及从何处获取客户详细信息的方式.例如,它可以是从数据库提供注册客户端的服务.

说到了 AuthorizationServerSecurityConfigurer,AuthorizationServerEndpointsConfigurer我不确定他们做了什么或者应该如何配置.在文档中它只说:

AuthorizationServerEndpointsConfigurer:定义授权和令牌端点以及令牌服务.

也许有人可以用简单的词语解释这两个配置器做了什么,或者它们用于什么.

java spring spring-security oauth-2.0 spring-security-oauth2

4
推荐指数
1
解决办法
6997
查看次数

如何在联合查询中使用另一个选择的结果?

我有一个联合查询,我想在联合查询“左侧”的 select 语句中使用联合查询“右侧”的 select 的结果。下面的查询工作正常(至少在 postgres 上),但我运行 query1 两次,一次作为 query1,再次作为 SameAsQuery1。

select x as zz from (select 69 as x) as query1
union all
select count(zz) as zz from 
      (select x as zz from (select 69 as x) as sameAsQuery1) as query2
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情,这样我就不必运行 query1 两次,但它不起作用:

select x as zz from (select 69 as x) as query1
union all
select count(zz) as zz from query1
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

错误:关系“query1”不存在第 3 行:从 query1 选择 count(zz) 作为 zz

有没有办法重写这个查询,使 query1 只运行一次?

对 Llama 先生的回复进行小修改效果很好,看起来像这样(注意添加“as q2”): …

sql postgresql union subquery

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