org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
就是这样写的:package org.spring.test;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Aspect
@Component
public class Log {

@Before("execution(public void org.spring.test.UserDAOImpl.save(org.spring.test.User))")
public void myLog() {
System.out.println("You can do sth before this!!!");
}
}

解决方案 »

  1.   

    spring的aop是符合aop规范的,需要应用aopalliance.jar这个包,你可能没有这个包
      

  2.   

    请根据错误信息查错:
    java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
      

  3.   

    好像有点起色了,但是还是有问题,我查了好久都查不出哪里有问题:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'userDAO' must be of type [org.spring.test.UserDAOImpl], but was actually of type [$Proxy7]

    UserService.java:package org.spring.test;import javax.annotation.Resource;import org.springframework.stereotype.Component;@Component("userService")
    public class UserService {
    private UserDAOImpl userDAOImpl;

    public UserDAOImpl getUserDAOImpl() {
    return userDAOImpl;
    } @Resource(name="userDAO")
    public void setUserDAOImpl(UserDAOImpl userDAOImpl) {
    this.userDAOImpl = userDAOImpl;
    } public void add(User user) {
    userDAOImpl.save(user);
    }
    }
      

  4.   

    你注入的userDAO,不是org.spring.test.UserDAOImpl类,看看你的spring配置文件userDAO的类是什么。
      

  5.   

    谢谢大家,问题已经解决了!!!
    我把UserService.java改成这样的:package org.spring.test;import javax.annotation.Resource;import org.springframework.stereotype.Component;@Component("userService")
    public class UserService {
    private UserDAO userDAO;//这里不需要new就可以在下面直接使用save方法(IoC的体现)

    public UserDAO getUserDAO() {
    return userDAO;
    } @Resource(name="user")//这是由JSR250提供的
    public void setUserDAO(UserDAO userDAO) {
    this.userDAO = userDAO;
    } public void add(User user) {
    userDAO.save(user);
    }
    }但是我这里还是有疑问:UserDAO是我定义的接口类,里面就一个save方法,UserDAOImpl是它的实现类,为什么定义成实现类(UserDAOImpl)的setter方法就不行,而定义成接口类(UserDAO)的setter方法就OK了呢?
      

  6.   

    如果你全部都用UserDAOImpl而不用UserDAO也是可以的,你应该是哪里写的有问题。
      

  7.   

    我把所有的代码都贴出来吧,帮我指点指点,谢谢。
    (1)先是Model。
    User.java:package org.spring.test;public class User {
    private String username;
    private String password;
    public String getUsername() {
    return username;
    }
    public void setUsername(String username) {
    this.username = username;
    }
    public String getPassword() {
    return password;
    }
    public void setPassword(String password) {
    this.password = password;
    }
    }
    (2)然后是接口。
    UserDAO.javapackage org.spring.test;public interface UserDAO {
    void save(User user);
    }
    (3)接着是接口的实现类。
    UserDAOImpl.javapackage org.spring.test;import org.springframework.stereotype.Component;@Component("user")
    public class UserDAOImpl implements UserDAO{
    public void save(User user) {
    String name = user.getUsername();
    String pass = user.getPassword();
    System.out.println("A user saved!!!\nMy name is "+name+" and my password is "+pass);
    }
    }
    (4)再接着是Bean。
    UserService.javapackage org.spring.test;import javax.annotation.Resource;import org.springframework.stereotype.Component;@Component("userService")
    public class UserService {
    private UserDAO userDAO;

    public UserDAO getUserDAO() {
    return userDAO;
    } @Resource(name="user")
    public void setUserDAO(UserDAO userDAO) {
    this.userDAO = userDAO;
    } public void add(User user) {
    userDAO.save(user);
    }
    }
    (5)最后是业务。
    UserServiceTest.javapackage org.spring.test;import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest {
    @Test
    public void testAdd() throws Exception {
    ApplicationContext context =
        new ClassPathXmlApplicationContext("beans.xml");

    UserService service = (UserService) context.getBean("userService");

    User user = new User();
    user.setUsername("sonic");
    user.setPassword("sonic");
    service.add(user);
    }
    }
      

  8.   

    是哪里的问题呢?因为之前userDAOImpl.save(user);然后@Before("execution(public void org.spring.test.UserDAOImpl.save(org.spring.test.User))")我比较好理解,说明是在执行userDAOImpl.save(user);之前执行了@Before下面的逻辑。
    我的意思是,现在的情况貌似是setUserDAO的时候注入了UserDAOImpl这个接口实现类,然后再下面的add方法中()public void add(User user) {
            userDAO.save(user);
        }
    可以直接使用接口类中的save方法(不过我想不可能使用接口类的方法,肯定使用的是实现类中的方法),@Before注释的方法在实现类的save方法之前执行了。这些理解不了。是Spring很智能还是我对IoC的理解还不行?
      

  9.   

    Aop采用了动态代理,凡采用动态代理的都需要面向接口编程,所以不能用实现类
      

  10.   

    我虽然是添加了aopalliance.jar但还是提示错误:
    Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
    好像Spring3.1和这个aopalliance.jar已经不太兼容了吧,aopalliance.jar包里面根本就没有Advice这个文件夹啊
      

  11.   

    把spring2.5的Spring.jar加上就好了吧
      

  12.   

    我也有过这样的错误,跟你的一模一样,你检查你的那里写错了没有,我的是添加了aopalliance.jar这个就好了