将 AOP 功能添加到 Spring 项目后没有发现符合条件的 Bean 错误

我在向我的简单项目添加 AOP 功能时出现以下错误,有人可以为我解释一下吗?我还在下面提到了代码的相关部分。


Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.AOP.Car' available

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:346)

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)

    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1123)

    at com.AOP.App.main(App.java:13)

package com.AOP;


import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;    

@Configuration

@ComponentScan(basePackages = "com.AOP")

public class AppConfig {        

}

package com.AOP;


import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class App 

{

    public static void main( String[] args )

    {

        ApplicationContext context = new  AnnotationConfigApplicationContext(AppConfig.class);

        Car car =  context.getBean(Car.class);      

        car.drive();

    }

}

package com.AOP;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;


@Component

public class Car implements Vehicle{


    @Autowired

    private Tyre tyre;      

    public Tyre getTyre() {

        return tyre;

    }


    public void setTyre(Tyre tyre) {

        this.tyre = tyre;

    }


    public void drive()

    {

        System.out.println("driving a car");

        System.out.println(tyre);

    }

}

package com.AOP;


public interface Vehicle {

    void drive();


}

如果我在没有实现“Vehicle”接口的情况下得到一个简单的类“Car”,那么一切正常。但是添加该扩展名将导致 menterror。


冉冉说
浏览 199回答 1
1回答

郎朗坤

这种行为在Spring 文档中有很好的描述。你的情况正是:如果被代理的目标对象至少实现了一个接口,则使用 JDK 动态代理。您仍然可以通过名称获取 bean,并查看它的类是什么:    Object b = context.getBean("car");           System.out.println(b.getClass().getName());它类似于com.sun.proxy.$Proxy38,如果您尝试浏览它的界面,它们com.AOP.Vehicle之间就会有。至此,为什么无法按类获取bean就很清楚了。该怎么办 ?有一些选项:使Car不实现Vehicle(任何接口)。这样,bean 将由 CGLIB 代理(并且其类保持不变),并且您的代码将起作用通过向 annotation 添加以下属性强制在任何地方使用 CGLIB 代理@EnableAspectJAutoProxy(proxyTargetClass=true)。您的代码将起作用通过名称获取 bean(参见上面的代码)通过接口获取bean:    Vehicle car =  context.getBean(Vehicle.class);           car.drive();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java