我刚开始玩AspectJ(1.6.11).我通过commons-email libary发送电子邮件,我想知道发送邮件需要多长时间.这是我的电子邮件发送代码:
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
public class EmailTest
{
public static void main(String[] args) throws EmailException
{
Email e = new SimpleEmail();
e.setHostName("localhost");
e.setFrom("foo@localhost");
e.addTo("batto@localhost");
e.setSubject("Test " + System.currentTimeMillis());
e.setMsg("Message");
e.send();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的方面:
public aspect EmailAspect
{
private long start;
pointcut conn() : call(* javax.mail.Transport.send(..));
void around() : conn() {
start = System.currentTimeMillis();
Throwable t = null;
try {
proceed();
}
catch(Throwable _t) {
t = _t;
}
long spent = System.currentTimeMillis() - start;
System.out.println("Send time: …Run Code Online (Sandbox Code Playgroud) 我无法@Autowire在Aspect中使用服务层实例.在Aspect中,对@Autowiredbean 的引用是NULL并且它会抛出NullPointerException.任何帮助都感激不尽.我想,我搞砸了配置.
以下是我的servlet-context.xml:
<!-- Activates various annotations to be detected in bean classes -->
<context:annotation-config />
<context:spring-configured />
<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="xx.yy" />
<!-- an @AspectJ aspect will be interpreted as an aspect by Spring AOP and beans in the context will be advised accordingly -->
<aop:aspectj-autoproxy />
<beans:bean id="loggingAspect" class="xx.yy.aop.aspects.LoggingAspect" />
<beans:bean id="authenticationAspect" class="xx.yy.aop.aspects.AuthenticationAspect" />
<!-- Enables the Spring …Run Code Online (Sandbox Code Playgroud) 为tomcat webapplication打包的war包含WEB-INF/classes和WEB-INF/lib/*.jar
哪个在CLASSPATH中有优先权?
我问的原因是,我的应用程序使用A.jar,其中包含从aspectj项目生成的方面; 和B.jar,将与A.jar的方面编织.当编译项目myapp时,它会生成许多类,这些类覆盖来自B.jar的相同类,这些类被打包到WEB-INF/classes目录中.所以如果tomcat首先加载WEB-INF/lib/*.jar,那么编织方面将不会生效
我已经看到已经提出了一些这个问题的实例.但是,我相信我满足这些解决方案中列出的标准.即我很确定我的课程路径上有所需的罐子+我的原理配置地址按顺序查看.
一个解决方案提到该问题可能是由于在类路径上有另一个XML解析器引起的.我在我的类路径上有dom4j,但我已将其删除以进行测试,问题仍然存在.
这是我的类路径:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="test"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/mysql-connector-java-5.1.18-bin.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/jaxen-1.1.3.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.aop-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.asm-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.aspects-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.beans-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.context.support-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.context-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.core-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.expression-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.instrument.tomcat-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.instrument-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.jdbc-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.jms-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.orm-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.oxm-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.test-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.transaction-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.portlet-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.servlet-3.1.0.RC1.jar"/>
<classpathentry kind="lib" path="C:/Users/user/workspace/rugby-project/lib/org.springframework.web.struts-3.1.0.RC1.jar"/>
<classpathentry …Run Code Online (Sandbox Code Playgroud) 当我制作Spring项目时,我似乎得到了一堆这样的警告.该项目使用Compile Time Weaving和各种Spring注释,如Transactional,Autowired和Configurable.
我有三个问题:它们是什么(效果是什么)?我应该关注他们吗?和"我该怎么做才能删除它们?"
ajc: this affected type is not exposed to the weaver: com.myapp.domain.UserEntity [Xlint:typeNotExposedToWeaver]
Run Code Online (Sandbox Code Playgroud)
让我知道您需要帮我解决这个问题.我可以发布POM文件的相关部分,部分Java Spring配置文件或其他任何内容.我真的不知道需要什么,所以让我知道.
我在春季论坛上看到了它,但那个地方是一个鬼城.有几个人问了这个问题,但没有答案.
我正在使用Java配置Spring和CTW.
我有一个包含私有方法的库类.通过子类直接覆盖此方法是没有选择的.当从库内部调用这个包私有方法时,有没有办法,无论多么难看,执行自己的代码,例如使用AspectJ?
这是类的简化示例(packagePrivateMethod()实际上不是直接调用,而是从本机代码调用):
public LibClass {
public LibClass() {
...
packagePrivateMethod();
...
}
void packagePrivateMethod() {
// <-- here I want to execute additional code
...
}
}
Run Code Online (Sandbox Code Playgroud) 我想将@Autowired注释用于"Aspect".我想在我的方面注入一个存储库但是当我尝试调用我的自动连接类的方法时,会发生NullPointException.
@Aspect
public class AspectSecurity {
@Autowired
private UserRepository userRepository;
@After("execution(public * dash.*.*Controller.*(..))")
public void authentication(JoinPoint jp) throws UnauthorizedException {
System.out.println("SECURITY !");
System.out.println(userRepository.findAll().toString());
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试@Component在我的方面类上面添加,但我有同样的错误.
如果我不使用方面类,但@Controller我可以毫无问题地调用我的存储库.
一些文档说明了使用xml文件的spring配置,但是使用spring boot我没有这些文件.
这是我的pom.xml的一部分,它调用了aspectJ插件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>1.6</source>
<target>1.6</target>
<Xlint>ignore</Xlint>
<complianceLevel>${compiler.version}</complianceLevel>
<encoding>UTF-8</encoding>
<verbose>false</verbose>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这是我的Application类:
package dash;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import …Run Code Online (Sandbox Code Playgroud) 我没有努力建议一个spring data jpa存储库.目标是检测(围绕)void使用自定义注释(在此示例中为ResourceNotFound)注释的特定存储库中的所有非公共方法,并在返回值为null空集合时抛出异常.
@Repository
@ResourceNotFound
@Transactional(readOnly = true)
public interface CityRepository extends JpaRepository<City, Long>, JpaSpecificationExecutor<City> { … }
Run Code Online (Sandbox Code Playgroud)
以下建议是连接带注释的接口实现的所有公共方法@ResourceNotFound.
@Pointcut("within(com.digitalmisfits.spring.aop.annotation.ResourceNotFound *)")
public void beanAnnotatedWithResourceNotFound() {}
@Pointcut("execution(public * *(..))")
public void publicMethod() {}
@Around("beanAnnotatedWithResourceNotFound() && publicMethod()")
public Object publicMethodInsideAClassMarkedWithResourceNotFound(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("publicMethodInsideAClassMarkedWithResourceNotFound " + pjp.getTarget().toString());;
Object retVal = pjp.proceed();
if(((MethodSignature) pjp.getSignature()).getReturnType() != Void.TYPE && isObjectEmpty(retVal))
throw new RuntimeException("isObjectEmpty == true");
return retVal;
}
Run Code Online (Sandbox Code Playgroud)
该publicMethodInsideAClassMarkedWithResourceNotFound(…)方法的工作原理,当切入点isspecified为:
@Pointcut("execution(public * package.CityRepository+.*(..))")
Run Code Online (Sandbox Code Playgroud)
但是,@ResourceNotFound注释没有被提取.这可能是由于存储库接口的基础类是(代理的)SimpleJpaRepository …
我想在Gradle项目中使用AspectJ(它不是一个Android项目 - 只是一个简单的Java应用程序).
以下是我的build.gradle的样子:
apply plugin: 'java'
buildscript {
repositories {
maven {
url "https://maven.eveoh.nl/content/repositories/releases"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.6"
}
}
repositories {
mavenCentral()
}
project.ext {
aspectjVersion = "1.8.2"
}
apply plugin: 'aspectj'
dependencies {
//aspectj dependencies
aspectpath "org.aspectj:aspectjtools:${aspectjVersion}"
compile "org.aspectj:aspectjrt:${aspectjVersion}"
}
Run Code Online (Sandbox Code Playgroud)
代码编译,但方面似乎没有编织.可能有什么不对?
我想在spring-boot应用程序中使用各方面完成的事务,但到目前为止,我主要找到更多"普通"设置的帮助......
到目前为止我设法建立了什么?
我在主要课上有这些注释:
@SpringBootApplication
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
Run Code Online (Sandbox Code Playgroud)
这在我的属性中:
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
Run Code Online (Sandbox Code Playgroud)
我正在使用java代理spring-instrument和aspectj-weaver开始应用程序,我可以在stacktrace中看到我使用过的方面,@Transactional所以至少这是有用的.
另外,真正奇怪的是,问题在我添加第二个实体后开始 - 第一个工作没有问题,但现在我遇到了这个错误:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
Run Code Online (Sandbox Code Playgroud)
从我所注意到的beanfactory是null当invokeWithinTransaction正在运行TransactionAspectSupport-但bean创建过程中它被设置(从我已经看到在调试的时候beanFactory是null TransactionAspectSupport因为它是不是能够得到不会启动一个事务TransactionManager).我想TransactionAspectSupport在某些时候正在创建非bean实例,这可能是我的问题的原因(但那么如何以及为什么?)?
更新:
从我注意到的@Transactional是AnnotationTransactionAspect在一个案例中处理,而JtaAnnotationTransactionAspect在另一个案例中处理.
我缺少什么想法?也许我应该设置一些神奇的属性?
哦,这是我的依赖,如果这很重要:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency> …Run Code Online (Sandbox Code Playgroud) aspectj ×10
java ×7
spring ×4
spring-aop ×3
aop ×2
spring-boot ×2
autowired ×1
gradle ×1
hibernate ×1
spring-mvc ×1
tomcat ×1
transactions ×1