标签: load-time-weaving

在使用加载时间编织时未编织的超级类中的@Transactional

我正在研究的项目与DAOs下面的项目有类似的结构:

/** 
* Base DAO class
*/
@Transactional    
public class JPABase {

  @PersistenceContext
  private EntityManager entityManager;

  public void persist(Object entity) {
    entityManager.persist(entity);
  }
 //some more methods in here
}
Run Code Online (Sandbox Code Playgroud)

/** 
* Generic DAO class implementation
*/
@Transactional 
public abstract class GenericDao extends JpaBase {
   //some methods in here
}
Run Code Online (Sandbox Code Playgroud)

/** 
* Specialized DAO class
*/
@Repository
@Transactional
public class PersonDao extends GenericDao {
  //some methods in here
}
Run Code Online (Sandbox Code Playgroud)

到现在为止,该项目使用的编译时编织,但而配置也改为使用<context:load-time-weaver/>-javaagent:/opt/tomcat7-1/lib/spring-instrument.jar.

由于已经应用了这种改变,因此不再编织JpaBase's和 …

java spring aspectj compile-time-weaving load-time-weaving

38
推荐指数
1
解决办法
1395
查看次数

如何使用无接口的加载时编织配置AspectJ

在我的项目中,我目前在编译时使用AspectJ(由于某些限制而不仅仅是Spring AOP).为了加速Eclipse的开发,我想在加载时进行编织.我成功地做到了这一点,但有一个主要的约束:为我的服务使用包含一些事务方法的接口.如果我使用其实现而不是其接口声明服务,则在调用者类中,没有编织,因此不支持任何事务.

因此,如果AspectJ支持它,如何在没有接口的情况下使用加载时编织配置AspectJ?

我创建了一个重现问题的小项目:

以下测试失败.

以下测试成功:

  • 注入的服务是通过其接口而不是其实现来声明的(即通过"@Inject MyService service"替换"@Inject MyServiceImpl服务"),测试成功.

  • 在编译期间执行编织(在这种情况下,配置,POM和Spring应用程序上下文明显不同).但我的目标是在加载时进行编织,以避免每次保存Java文件时的编织阶段.

  • Spring AOP(tx:annotation-driven mode ="proxy"),即基于代理的解决方案,用于代替AspectJ.但在这种情况下,我们遇到了自调用问题,即目标对象中调用目标对象的其他方法的方法,即使被调用的方法用@Transactional标记,也不会在运行时导致实际的事务.

AspectJ的LTW/SRC /测试/ JAVA/myCompany的/ aspectj_ltw/MyServiceImplTest.java

package mycompany.aspectj_ltw;

import static junit.framework.Assert.assertTrue;

import javax.inject.Inject;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/META-INF/spring/applicationContext.xml" })
public class MyServiceImplTest {

    @Inject
    MyServiceImpl service;

    @Test
    public void shouldBeExecutedInTransaction() {
        assertTrue(this.service.isExecutedInTransaction());
    }
}
Run Code Online (Sandbox Code Playgroud)

AspectJ的LTW/SRC /主/爪哇/ myCompany的/ aspectj_ltw/MyService.java

package mycompany.aspectj_ltw;

public interface MyService {

    boolean isExecutedInTransaction();

}
Run Code Online (Sandbox Code Playgroud)

AspectJ的LTW/SRC /主/爪哇/ myCompany的/ aspectj_ltw/MyServiceImpl.java

package mycompany.aspectj_ltw;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; …
Run Code Online (Sandbox Code Playgroud)

aop spring aspectj spring-transactions load-time-weaving

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

Tomcat 8,Spring Boot,@ Configurable LoadTimeWeaving没有-javaagent?

我正在尝试设置@Configurable域对象(不是由spring容器管理).
我已经通过添加-javaagent:path/to/spring-instrument.jar作为JVM参数来完成这项工作但是我不能100%清楚这个-javaagent是否必须到位.我在Tomcat 8上运行它.我可能会误解文档,但似乎我可以使用另一种机制来实现这一点,特别是这一行:

不要定义TomcatInstrumentableClassLoader了对Tomcat 8.0高.相反,让Spring InstrumentableClassLoader通过TomcatLoadTimeWeaver策略自动使用Tomcat的新本机设施.

代码示例如下:

@SpringBootApplication
@EnableLoadTimeWeaving
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }   
    @Bean
    public MyService myService(){
        return new MyService();
    }
}
Run Code Online (Sandbox Code Playgroud)
@Configurable
public class MyDomainObject {

    @Autowired
    private MyService myService;

    public MyService getMyService(){
        return myService;
    }
}
Run Code Online (Sandbox Code Playgroud)
 public class MyService {
    private static final Logger log = LoggerFactory.getLogger(MyService.class);

    public void test(){
        log.info("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

那么有没有办法在不指定-javaagent的情况下编织这些@Configrable对象?我有兴趣学习如何在将WAR作为WAR部署到独立Tomcat 8服务器和/或在作为'胖'jar启动时使用嵌入式Tomcat 8服务器时完成此操作. …

aspectj load-time-weaving tomcat8 spring-boot embedded-tomcat-8

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

Spring的LoadTimeWeaver代理无法启动

我正在尝试使用Spring和AspectJ实现加载时间编织.据我所知,我已经正确配置了所有内容,但是当我尝试运行集成测试时,我不断收到错误:

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 bean with name 'loadTimeWeaver': Initialization of bean failed; nested exception is 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
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:643)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:407)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.boku.risk.service.perisistence.PersistenceTestBase.setupBase(PersistenceTestBase.java:23)
    at com.boku.risk.service.dao.CountryLimitDaoTest.setup(CountryLimitDaoTest.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native …
Run Code Online (Sandbox Code Playgroud)

aop spring aspectj load-time-weaving

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

OSGi WeavingHook示例

有没有人有使用OSGi 4.3+ Weaving Hook服务的例子?使用AspectJ,ASM,JavaAssist怎么样?有人在使用OSGi WeavingHooks吗?

OSGi Core 5.0.0第56.2节中的示例简单地省略了实际的编织,并说"最后的编织留给了读者".

我的目标是:

  1. 创建一个可以放在字段(基元或对象)上的注释(@MyAnnotation).
  2. 创建一个org.osgi.framework.hooks.weaving.WeavingHook来编织带有该注释的类
  3. 使用加载时编织在具有该注释的任何字段修改处切入
  4. 触发已修改字段的EventAdmin事件.
  5. 从WeavingHook动态更新捆绑线路,以连接到EventAdmin捆绑包.

我的问题主要是#3.

我目前正在尝试使用AspectJ WeavingAdaptor进行编织,但是我在使用方面库时遇到了问题,因为它期望构造函数中的java.net.URL [] aspectURLs是jar或目录它可以在文件系统上找到,而不是捆绑.另外,我不知道如何通过回调的处理由韦弗产生的任何新类acceptClass(字符串名称,字节[])的方法GeneratedClassHandler.

也许WeavingAdaptor不适合开始编织?或者也许我不应该使用AspectJ?

MyAnnotation.java

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
Run Code Online (Sandbox Code Playgroud)

MyWeavingHook.java

public class MyWeavingHook implements WeavingHook {

    public class MyWeavingClassloader implements WeavingClassLoader {

        private Bundle b;

        public MyWeavingClassLoader(Bundle b) {
            this.b = b;
        }

        void acceptClass(java.lang.String name, byte[] bytes) {
            //no way to get this back into the woven classes bundle classloader?
        } 

        URL[] getAspectURLs() …
Run Code Online (Sandbox Code Playgroud)

java aop osgi aspectj load-time-weaving

12
推荐指数
1
解决办法
3887
查看次数

jetty-maven-plugin和loadTimeWeaver

似乎没有我的弹簧webapp使用jetty-maven插入

我总是得到

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver': Initialization of bean failed; nested exception is java.lang.IllegalStateException: ClassLoader [org.eclipse.jetty.webapp.WebAppClassLoader] 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
Run Code Online (Sandbox Code Playgroud)

虽然我有:

  • 将MAVEN_OPTS设置为javaagent:/Users/blabla/.m2/repository/org/springframework/spring-instrument/3.1.3.RELEASE/spring-instrument-3.1.3.RELEASE.jar
  • 将JAVA_OPTIONS设置为相同的东西
  • 弹簧仪器弹簧方面添加了dep
  • 添加jvmArgs-javaagent:....jetty-maven-plugin配置

spring jetty eclipselink maven load-time-weaving

11
推荐指数
1
解决办法
6597
查看次数

在Spring LTW环境中使用Maven运行单元测试

我正在使用Spring LoadTimeWeaving功能在ddd架构中开发应用程序.问题是我可以使用eclipse运行我的Junit测试,但不能通过Maven运行.我尝试了各种网站上提供的所有选项,但它根本不起作用.我得到以下异常:

引起:org.springframework.beans.factory.BeanCreationException:创建名为'loadTimeWeaver'的bean时出错:bean的初始化失败; 嵌套异常是java.lang.IllegalStateException:ClassLoader [sun.misc.Launcher $ AppClassLoader]不提供'addTransformer(ClassFileTransformer)'方法.指定自定义LoadTimeWeaver或使用Spring的代理启动Java虚拟机:-javaagent:org.springframework.instrument.jar

我已将仪器jar作为argLine的一部分添加到surefire插件中.以下是我的代码工件.请让我知道我哪里出错或者是否有其他解决方案.

我在Mac OSX上使用Eclipse Indigo for Development,Maven 3.0

pom.xml(仅限重要细节)

<dependencies>
    <!-- Spring Dependencies -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>


    <!-- Spring Security Dependencies --> …
Run Code Online (Sandbox Code Playgroud)

spring junit4 load-time-weaving maven-surefire-plugin

8
推荐指数
1
解决办法
6366
查看次数

如何使用Hibernate JPA和Spring Framework启用加载时/运行时编织

我在Spring Framework应用程序中使用Hibernate作为JPA提供程序(我使用它EntityManagerFactory而不是它SessionFactory).我设法让Spring Framework的加载时间编织支持工作,所以我已经超越了这个障碍.

我需要在实体上启用延迟加载byte[]@ManyToOne属性.我理解如何使用Hibernate的ant任务在构建时检测(编织)我的实体,但是我想在运行时检测我的实体(加载时间编织).我已经看到过几个谷歌搜索结果的引用,但没有启用它的实际说明.我需要设置什么属性来指示Hibernate它可以在运行时检测我的实体?

spring hibernate jpa hibernate-entitymanager load-time-weaving

8
推荐指数
1
解决办法
7427
查看次数

使用AspectJ的Spring AOP:加载时间编织

如果我使用的是基于AspectJ的Spring AOP,那么我是否可以配置我的方面以使用加载时间编织?或者,当使用基于AspectJ的方法时,Spring AOP是否也支持运行时/编译时编织?

aop spring aspectj load-time-weaving

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

使用@ChangeTracking关系保存ManyToMany会抛出PersistenceException

当我试图保存ManyToMany关系时,我得到一个数据库异常:

Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "INVERSES_ID"; SQL statement:
INSERT INTO m2m_owner_inverse (inverses_ID, owners_ID) VALUES (?, ?) [23502-184]
Error Code: 23502
Call: INSERT INTO m2m_owner_inverse (inverses_ID, owners_ID) VALUES (?, ?)
    bind => [null, 1]
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我在日志中看到插入了两个实例:

[EL Fine]: sql: 2016-02-22 13:18:32.67--ClientSession(1546269015)--Connection(1894667608)--INSERT INTO M2MOWNER (NAME) VALUES (?)
    bind => [null]
[EL Fine]: sql: 2016-02-22 13:18:32.676--ClientSession(1546269015)--Connection(1894667608)--CALL IDENTITY()
[EL Fine]: sql: 2016-02-22 13:18:32.716--ClientSession(1546269015)--Connection(1894667608)--INSERT INTO M2MINVERSE (NAME) VALUES (?) …
Run Code Online (Sandbox Code Playgroud)

java jpa eclipselink load-time-weaving

8
推荐指数
0
解决办法
256
查看次数