Java 不打电话的建议

Java 不打电话的建议,java,spring-aop,Java,Spring Aop,我有一个简单的spring应用程序,代码如下: 方面加载程序类 包com.ishan.spring.aspectLoader import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.ishan.spring.services.ShapeSe

我有一个简单的spring应用程序,代码如下:

方面加载程序类 包com.ishan.spring.aspectLoader

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ishan.spring.services.ShapeService;

public class AspectLoader {

public static void main(String a[]){

    AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

    context.registerShutdownHook();

    ShapeService service = (ShapeService) context.getBean("shapeService");
    service.draw();

}
}

形状服务类

package com.ishan.spring.services;

import com.ishan.spring.interfaces.Shape;

public class ShapeService {

public Shape getShape() {
    return shape;
}

public void setShape(Shape shape) {
    this.shape = shape;
}

public String draw1(){
    System.out.println("String draw called");
    this.shape.draw();
    return "drawn";
}

 public int draw(){
     System.out.println("int draw called");
     draw1();
    return 1;
 }

private Shape shape;

}
package com.ishan.spring.impl;

import com.ishan.spring.interfaces.Shape;

public class Circle implements Shape{

private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public void draw() {
    System.out.println("Circle drawn");

}
圆圈类

package com.ishan.spring.services;

import com.ishan.spring.interfaces.Shape;

public class ShapeService {

public Shape getShape() {
    return shape;
}

public void setShape(Shape shape) {
    this.shape = shape;
}

public String draw1(){
    System.out.println("String draw called");
    this.shape.draw();
    return "drawn";
}

 public int draw(){
     System.out.println("int draw called");
     draw1();
    return 1;
 }

private Shape shape;

}
package com.ishan.spring.impl;

import com.ishan.spring.interfaces.Shape;

public class Circle implements Shape{

private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public void draw() {
    System.out.println("Circle drawn");

}
}

形状界面

package com.ishan.spring.interfaces;

public interface Shape {

public void draw();
}
日志方面

package com.ishan.spring.aspects;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class LoggingAspect {

@Before("execution(public * draw*(..))")
public void logBefore(){
    System.out.println("Advice run before method call");
}

} 
spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
default-autowire="byName"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop      http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<aop:aspectj-autoproxy/>

<bean id="circle" class="com.ishan.spring.impl.Circle">
    <property name="name" value="myCircle"></property>
</bean>

<bean id="triangle" class="com.ishan.spring.impl.Triangle">
    <property name="name" value="myTriangle"></property>
</bean> 

<bean id="shapeService" class="com.ishan.spring.services.ShapeService">
    <property name="shape" ref="triangle"></property>
</bean> 

    <bean id="logAspect" class="com.ishan.spring.aspects.LoggingAspect"/>

</beans>


问题是我无法在shapeservice类的draw1()方法之前运行我的建议。我无法找出通配符表达式中的问题。

您的通配符表达式很好

aspect没有在
draw1()
方法上启动的原因是,它是从
draw()调用的;它位于同一个bean中,即简单的java方法调用

如果从其他Springbean调用了
draw1()
(或者就像调用了
draw()
一样),aspect肯定会启动

要亲自查看,请在下面尝试

ShapeService service = (ShapeService) context.getBean("shapeService");
service.draw1();