我已经声明了以下方面建议dao调用,我正在尝试运行@Before建议,但它不起作用.
这就是方面.
package com.hedgebenefits.aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class AccessControlAspect {
@Before("within(com.hedgebenefits.daos..*) && execution(public * *(..))")
public void daoCall() {
System.out.println("Before advice invoked for DAO method called ");
}
}
Run Code Online (Sandbox Code Playgroud)
我的application-context.xml具有以下标记
<aop:aspectj-autoproxy/>
Run Code Online (Sandbox Code Playgroud)
我的Dao课程如下:
package com.hedgebenefits.daos.impl;
import com.hedgebenefits.daos.AdminDao;
import com.hedgebenefits.domain.Admin;
import org.springframework.stereotype.Repository;
@Repository
public class AdminDaoImpl implements AdminDao{
@Override
public void save(Admin admin) {
}
}
Run Code Online (Sandbox Code Playgroud)
我放了一个断点,但我可以看到它不活跃,我肯定在这里做了一些愚蠢的错误,但无法搞清楚.PL.咨询.
每次我阅读官方的Spring AOP文档(链接)时,我都会对使用RuntimeExceptions的建议行为感到困惑.有人会检查我的未成年人是否适合以下建议?
@之前
@AfterReturning接口
@AfterThrowing
@后
@周围
我在启动服务器时遇到以下错误.应用程序中包含Spring和AspectJ类.
Caused by: java.lang.VerifyError: JVMVRFY013 class loading constraint violated; class=org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint, method=getSourceLocation()Lorg/aspectj/lang/reflect/SourceLocation;, pc=0
at java.lang.J9VMInternals.verifyImpl(Native Method)
at java.lang.J9VMInternals.verify(J9VMInternals.java:93)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:170)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.currentJoinPoint(AbstractAspectJAdvice.java:83)
Run Code Online (Sandbox Code Playgroud)
作为第一遍,我为企业应用程序提供了PARENT_FIRST选项

我很熟悉Spring AOP.正如我在春季文档http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html中所读到的那样,Spring AOP研究代理的概念.
在8.2.3.1支持的切入点指示符部分中,我找到了以下注释
由于Spring的AOP框架基于代理的特性,受保护的方法根据定义不会被拦截,既不用于JDK代理(这不适用),也不用于CGLIB代理(这在技术上可行,但不建议用于AOP).因此,任何给定的切入点都只能与公共方法匹配!
起初,我不相信它,所以我试图在不使用接口的情况下实现它,默认情况下所有方法都是公开的,并且对上述情况感到惊讶.由于代理类是建议/目标对象的子类,受保护的方法可以由子类访问,所以我认为受保护的方法可以正常工作.
有人可以告诉我为什么不拦截受保护的方法?我错过了什么吗?
我想完成从控制器收到的JSON响应,例如状态属性.在这方面,我将使用Aspect类,其中@Around方法返回一个自定义类对象.在这种情况下,我收到一个错误:
java.lang.ClassCastException: *.controller.RestResponse cannot be cast to java.util.List
Run Code Online (Sandbox Code Playgroud)
有没有办法通过aspectJ annotation @Around将@ResponseBody类型的返回更改为自定义类型?我无法更改控制器代码!
控制器类:
@Controller
@RequestMapping(value = "/users")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public List<User> get() throws InterruptedException {
return userService.getUsers();
}
...
}
Run Code Online (Sandbox Code Playgroud)
Aspect类:
@Component
@Aspect
public class RestInterceptor {
@Pointcut("within(* controller.api.*)")
public void endpointMethod() {
}
@Around("endpointMethod()")
public RestResponse unifyResponse(ProceedingJoinPoint pjp) throws Throwable {
Object controllerResult = pjp.proceed();
RestResponse result = new RestResponse(0, controllerResult);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
自定义类RestResponse:
public class RestResponse{
private …Run Code Online (Sandbox Code Playgroud) 所以我对使用以下表达式声明的方法有一个方面:
@Before("execution(* aaa.bbb.ccc.*.*(..))")
Run Code Online (Sandbox Code Playgroud)
这适用于包中的所有类aaa.bbb.ccc.但是,现在,我想要捕获所有类aaa.bbb,包括那些类aaa.bbb.ccc.所以我试着把它备份到这里:
@Before("execution(* aaa.bbb.*.*(..))")
Run Code Online (Sandbox Code Playgroud)
aaa.bbb但是,这只会从中获取类,并忽略来自的类aaa.bbb.ccc.有没有办法让表达式递归搜索所有子包?
我有一组非托管类,我在Spring之外实例化.我一直在尝试使用Spring AOP将加载时间编织@Autowire到这些类的bean中,但到目前为止还没有任何运气.
我一直在使用Tomcat 8和Spring Boot 1.2.0进行测试.
我@Configuration尝试设置类的位置如下所示:
@Configuration
@PropertySource("classpath:application.properties")
@EnableSpringConfigured
@EnableLoadTimeWeaving
public class Config
Run Code Online (Sandbox Code Playgroud)
在里面Config我将我想要的bean定义@Auotwire到我的非托管类中:
@Bean
public StateProvider stateProvider() {
//setup bean
return new DynamoStateProviderImpl( );
}
Run Code Online (Sandbox Code Playgroud)
非托管bean看起来像这样:
@Configurable(autowire = Autowire.BY_TYPE, dependencyCheck = true, preConstruction = true)
public class StateOutput implements UnifiedOutput {
@Autowired
private StateProvider stateProvider;
Run Code Online (Sandbox Code Playgroud)
我的pom内有以下deps
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-agent</artifactId>
<version>2.5.6.SEC03</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我还没有看到任何注入stateProvider …
我正在研究Spring AOP模块,我对AROUND建议的确切运作方式有些怀疑.
阅读官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html
我可以阅读有关AROUND ADVICE的内容:
围绕建议:围绕连接点的建议,例如方法调用.这是最有力的建议.around通知可以在方法调用之前和之后执行自定义行为.它还负责选择是继续加入点还是通过返回自己的返回值或抛出异常来快速建议的方法执行.
这是周围建议的序列图:

因此,根据我的理解,我可以定义一个建议(我的自定义行为),它将在切入点指定的关节点之前和之后执行.
例如,我可以用这种方式定义AROUND ADVICE:
@Around(“execution(@example.Cacheable * rewards.service..*.*(..))”)
public Object cache(ProceedingJoinPoint point) throws Throwable {
Object value = cacheStore.get(cacheKey(point));
if (value == null) {
value = point.proceed();
cacheStore.put(cacheKey(point), value);
}
return value;
}
Run Code Online (Sandbox Code Playgroud)
在调用服务方法之前和之后执行实现的chaching行为.这样对吗?
我无法完全理解的是它是如何使用ProceedingJoinPoint点参数的.
根据我的理解,它用于选择执行或不执行特定操作但具体如何工作?
另一个疑问是如何正确使用AOP建议如何回答以下问题:
如果我想尝试捕获异常,我必须使用哪些建议?
我认为在这种情况下,答案是使用After throw通知,因为当匹配的方法执行通过抛出异常退出时,通知会执行.
但我不确定它,因为根据我的理解,只有在方法抛出异常时才会执行建议.或者在这种情况下我必须使用**AROUND ADVICE*?
TNX
假设我有一个如下所示的程序:
@Component
public class MainAction {
public void doTheAction() {
System.out.println("Now doing the action");
}
}
@Aspect
@Component
public class BeforeAspect {
@Autowired
private Logger logger;
@Before("execution(* thepackagename.MainAction.*(..))")
public void doBefore() {
logger.log("The @Before advice has run");
}
}
@Component
public class Logger {
public void log(String s) {
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我通过的Eclipse(main方法调用esentially运行它,这是工作的罚款mainAction.doTheAction()后,mainAction被Spring创建).
现在我想编写一个测试,确保在log调用时正确doTheAction调用该方法.我们正在使用JMockit进行测试.(这是我实际遇到的问题的一个非常简化的情况;通过AOP方面调用更复杂的记录器,并且正在记录错误的某些值.在进行修复之前,我正在尝试编写一个测试以确保记录的值是正确的.)
这就是我的(简化)测试目前的样子:
@RunWith(JMockit.class)
@ContextConfiguration(locations = {"classpath:Beans.xml"})
public class MainActionTest {
@Tested
private MainAction mainAction;
@Test
public void testThatLoggerIsCalled(@Injectable Logger …Run Code Online (Sandbox Code Playgroud) 我在我的Web应用程序中使用Spring 4.2.4.RELEASE,我想从中删除对aspectjweaver.jar的依赖.我不直接使用AOP,我当然不使用AspectJ.但我的应用程序失败,出现以下异常:
java.lang.ClassNotFoundException: org.aspectj.util.PartialOrder$PartialComparable
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:450)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at org.eclipse.jetty.webapp.WebAppClassLoader.findClass(WebAppClassLoader.java:510)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:441)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.sortAdvisors(AspectJAwareAdvisorAutoProxyCreator.java:73)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:91)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:346)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以完全删除对aspectjweaver.jar的依赖吗?
spring-aop ×10
java ×7
spring ×7
aspectj ×4
aop ×3
expression ×1
jmockit ×1
junit ×1
protected ×1
proxy ×1
return ×1
spring-boot ×1
spring-mvc ×1
websphere ×1