软件编程
位置:首页>> 软件编程>> java编程>> spring配置不扫描service层的原因解答

spring配置不扫描service层的原因解答

作者:逸疆  发布时间:2022-03-24 16:35:02 

标签:spring,配置,不扫描,service层

spring配置不扫描service层原因

我将contoller给springmvc进行扫描,然后其余所有交给spring扫描

spring配置不扫描service层的原因解答

spring配置不扫描service层的原因解答

然后发现service层的EmployeeService并没有扫描到出现以下问题

spring配置不扫描service层的原因解答

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘springmvc.crud.service.EmployeeService’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)… 39 more

最终发现原因是spring配置文件里面context:exclude-filter是不要加use-default-filters的,而context:include-filter是需要加的

找了好久问题!!!

spring配置自动扫描原理介绍

Spring利用IOC容器将所有的bean进行有秩序的管理维护,而实际项目中不可能在xml文件中创建bean,而是利用了Spring的组件自动扫描机制,通过在classpath自动扫描的方式把组件纳入到Spring容器中。这大大减少了程序员在配置XML文件上的时间,使得配置文件显得干净,整洁,便于维护。

这种机制的工作步骤是:

1.配置需要扫描的类;

2.在需要被纳入Spring容器的类上加上相应的注解;

3.Spring在类路径下寻找标注了注解的类,并把这些类纳入Spring容器中管理。

它的作用是和在XML文件中使用节点配置组件是一样的。

自动扫描组件的使用

第一步:配置applicationContext.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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<!-- 打开Spring组件自动扫面,并配置要扫描的基本包 -->
<context:component-scan base-package="com.springtest"></context:component-scan>
</beans>

注:节点用于通知Spring容器扫描组件,base-package属性用于指定将要被扫描的组件所在的包名称。

在这里说明一下:context:component-scan有一个use-default-filters属性,默认为true,这就意味着会扫描指定包base-package下的全部的标有@Component@Service,@Repository的类,并注册成bean.

1. context:include-filter 指定扫描位置

2. context:exclude-filter 指定的不扫描

use-default-filters=&rdquo;true&rdquo;时,此时指定的include-filter不会起到作用,只有当

use-default-filters=&rdquo;false&rdquo;时,context:exclude-filter指定的不扫描,context:include-filter指定的扫描

第二步:为需要被扫描的类添加相应的注解

注解的类型有以下几种:

  • @Service 用于标注业务层组件;

  • @Repository 用于标注数据访问层组件;

  • @Controller 用于标注控制层组件(如:Struts中的action)

  • @Component 表示泛型组件,当组件不好归类的时候,我们可以使用这个组件进行注解。

第三步:当为类添加完成注解后,我们需要测试相应的组件是否被纳入Spring容器,所以我们需要测试组件是否被扫描

如下:

@Test
public void testAddUser()
{
UserBiz userBiz = (UserBiz)context.getBean("userBizImpl");
System.out.println(userBiz);
}

如果输出不为空,则说明测试类已经被扫描并且纳入了Spring容器。

细节问题总结

1.当我们进行测试时,用ApplicationContext对象的getBean()方法寻找组件。

在之前的配置文件中我们会用标签的id属性去定义,在使用注解后怎样获得组建的id呢?

在这种情况下,Spring会将被标注注解的类名拿到,然后再将该类名的第一个字母变为小写,放到getBean()方法中。如:UserBizImpl类的组件Id就会是userBizImpl,获取时为context.getBean(&ldquo;userBizImpl&rdquo;);

那么,我们在使用注解时可以自定义组件的Id吗?

当然可以。

我们需要在为相应的类添加注解时,在注解之后添加自定义的类名,例如:

@Service("userBiz")
public class UserBizImpl implements UserBiz {
……
}

当我们在获取该组件时,为context.getBean(&ldquo;userBiz);

2.在配置文件中我们可以对组件(bean)的作用域范围进行设置,它的默认值是单例模式,那么在添加注解的情况下,我们怎样设置组件的作用域范围呢?

我们可以直接在为类添加注解的同时,运用另一个注解@Scope(&ldquo;prototype&rdquo;)来设置,如下

@Service(“userBiz”)@Scope(“prototype”)
public class UserBizImpl implements UserBiz {
……
}

3.在使用注解时,为组件设置初始化和销毁方法

在添加注解的相应的类中,如果想初始化或销毁某个方法,我们可以直接在方法上添加注解,如下:

@PostConstruct
public void addItem() {
System.out.println("初始化方法");
}
@PreDestroy
public void testItem() {
System.out.println("释放资源");
}

4.在使用Spring自动扫描组件后,怎样进行依赖注入?

运用注解@Resource和@Autowired,并为依赖对象设置名称,例如:

@Resource(name="userDao")
private UserDAO userDao = null;

首先它会根据名称去找Spring自动扫描的并加入到Spring容器的组件(bean),如果有相同的名称,则进行依赖注入,如果没有相同的名称。则会根据类型区寻找组件。

来源:https://blog.csdn.net/qq_33793462/article/details/100299246

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com