首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat 8,Spring,@Configurable但没有-javaagent?

Tomcat 8,Spring,@Configurable但没有-javaagent?
EN

Stack Overflow用户
提问于 2015-10-15 20:33:39
回答 2查看 1.5K关注 0票数 14

我正在尝试设置一个@Configurable域对象(不是由spring容器管理)。

通过将-javaagent:path/to/spring-instrument.jar作为JVM参数添加,我可以做到这一点,但我并不完全清楚这个-javaagent是否必须到位。我在Tomcat 8上运行这个程序。我可能误解了documentation,但似乎我可以使用另一种机制来实现这一点,尤其是这一行:

不要再在TomcatInstrumentableClassLoader和更高版本上定义Tomcat 8.0了。相反,让Spring通过InstrumentableClassLoader策略自动使用Tomcat的新的本机InstrumentableClassLoader工具。

代码示例如下:

代码语言:javascript
复制
@SpringBootApplication
@EnableLoadTimeWeaving
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }   
    @Bean
    public MyService myService(){
        return new MyService();
    }
}
代码语言:javascript
复制
@Configurable
public class MyDomainObject {

    @Autowired
    private MyService myService;

    public MyService getMyService(){
        return myService;
    }
}
代码语言:javascript
复制
 public class MyService {
    private static final Logger log = LoggerFactory.getLogger(MyService.class);

    public void test(){
        log.info("test");
    }
}

那么,有没有一种方法可以在不指定-javaagent的情况下获得这些@Configrable对象呢?我很想了解一下,如果我能够在部署到独立的Tomcat 8服务器和/或使用嵌入式Tomcat 8服务器作为“fat”jar启动时完成这一任务。

在部署为单独部署时,Tomcat 8服务器不会抛出错误,但上面的getMyService()方法返回null。在启动过程中,以胖jar的形式启动会引发以下错误:

Caused by: java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar

我想真正的问题是如何在Tomcat 8中实现Specify a custom LoadTimeWeaver?任何事情似乎都是自动发生的,就像文档声明的那样,但同样,我可能误解了这意味着什么。

EN

回答 2

Stack Overflow用户

发布于 2020-06-16 21:53:58

你可以试试这个:

代码语言:javascript
复制
@Bean
public InstrumentationLoadTimeWeaver loadTimeWeaver() {
    return new InstrumentationLoadTimeWeaver();
}

有一个新的库,它解决了动态设置spring InstrumentationLoadTimeWeaver以启用对方面的支持,而不必使用显式java代理启动JVM。

代码语言:javascript
复制
<dependency>
    <groupId>de.invesdwin</groupId>
    <artifactId>invesdwin-instrument</artifactId>
    <version>1.0.2</version>
</dependency>

@SpringBootApplication
@EnableLoadTimeWeaving
public class TestApplication{
    public static void main(final String[] args) {
        DynamicInstrumentationLoader.waitForInitialized(); //dynamically attach java agent to jvm if not already present
        DynamicInstrumentationLoader.initLoadTimeWeavingContext(); //weave all classes before they are loaded as beans
        SpringApplication.run(TestApplication.class, args); //start application, load some classes
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-06-15 14:12:59

创建自己的注释@MyConfigurable如何?所以,当方法被调用时,您可以随心所欲地做任何事情。

代码语言:javascript
复制
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.CONSTRUCTOR)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyConfigurable
{}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33158039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档