如果所有类都不在同一个包中,Spring @autowired将不起作用


问题内容

我有四个包:

  1. com.spring.org

档案: HomeController.java

  1. com.spring.org.dao

档案:SubscriberDao.javaSubscriberDaoImpl.java

  1. com.spring.org.model

档案: Subscriber.java

  1. com.spring.org.service

档案:SubscriberService.javaSubscriberServiceImpl.java

我根据类型将所有控制器类放在 **com.spring.org** 包中,将其他控制器类放在不同的包中。如果我运行我的应用程序,则会收到以下错误消息:

HTTP状态500-Servlet appServlet的Servlet.init()抛出异常
_没有发现类型为[com.spring.org.service.SubscriberService]的合格Bean作为依赖项:预计至少有1个Bean可以作为此依赖项的自动装配候选…
.._

仅供参考:我在控制器中使用自动有线标注,如下所示:

@Autowired
private SubscriberService subService;

但是,如果我将所有类和接口都放在 **com.spring.org** 包中,那么我的应用程序就可以完美运行。

我尝试在servlet-context.xml文件中使用这些标记来解决问题,但是仍然无法正常工作:

<annotation-driven />
<context:annotation-config />
<context:component-scan base-package="com.spring.org.**" />
<context:component-scan base-package="com.spring.org.dao" />
<context:component-scan base-package="com.spring.org.model" />
<context:component-scan base-package="com.spring.org.service" />

我也只尝试了这个:

<context:component-scan base-package="com.spring.org" />

您可以在http://postimg.org/image/s6bnjccrn/上看到我的servlet-
context.xml文件的代码。

你能告诉我如何解决这个问题吗?

如果您需要查看其他文件,请告诉我。

更新资料

我的SubscriberService代码:

@Service
public interface SubscriberService {

 public void addSubscriber(Subscriber subscriber);
 public void updateSubscriber(Subscriber subscriber);
 public Subscriber getSubscriberById(int subId);
 public List<Subscriber> listSubs();
 public int removeSubscriber(int subId);

}

根本原因

org.springframework.beans.factory.BeanCreationException:创建名称为’homeController’的bean时出错:自动连接依赖项的注入失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.spring.service.SubscriberService
com.spring.org.HomeController.subService;
嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为[com.spring.service.SubscriberService]的合格Bean作为依赖项:期望至少有1个Bean可以作为此依赖项的自动装配候选。依赖项注释:{@
org.springframework.beans.factory.annotation.Autowired(required = true),@
org.springframework.beans.factory.annotation.Qualifier(value =)}
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

档案

如果将所有代码粘贴到此处,将很难遵循,因此,我将整个项目上传到了https://www.mediafire.com/?crxe7vt7uwyqwtl
。我正在使用Eclipse IDE。


问题答案:

你的结构应该是这样的

SubscriberService接口

package com.spring.org.service;

public interface SubscriberService {

}

SubscriberServiceImpl.java

package com.spring.org.service;

@Component
@Qualifier("Subscriber")
public class SubscriberServiceImpl implements SubscriberService {

}

“ SubscriberServiceImpl1”是一个组件,它实现了“ SubscriberService”。

SubscriberServiceImpl1.java

package com.spring.org.service;

@Component
@Qualifier("Subscriber1")
public class SubscriberServiceImpl1 implements SubscriberService {

}

我设置了一个Spring上下文,该上下文扫描这两个软件包中是否有标记为’@Component’的bean。

servlet-context.xml

<annotation-driven />
<context:annotation-config />
<context:component-scan base-package="com.spring"/>

HomeController.java

@Controller
public class HomeController {

    @Autowired
    @Qualifier("Subscriber")
    private SubscriberService subService;

}

从此 链接 参考。希望这能够帮到你....

编辑

根据您的包结构,您的 SubscriberServiceImpl 类位于 _com.spring.org.service_
下,
只需使用 com.spring 更改您的基本包,这将对您 有用

<context:component-scan base-package="com.spring"/>