spring配置不扫描service层的原因解答
作者:逸疆 发布时间:2022-03-24 16:35:02
spring配置不扫描service层原因
我将contoller给springmvc进行扫描,然后其余所有交给spring扫描
然后发现service层的EmployeeService并没有扫描到出现以下问题
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=”true”时,此时指定的include-filter不会起到作用,只有当
use-default-filters=”false”时,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(“userBizImpl”);
那么,我们在使用注解时可以自定义组件的Id吗?
当然可以。
我们需要在为相应的类添加注解时,在注解之后添加自定义的类名,例如:
@Service("userBiz")
public class UserBizImpl implements UserBiz {
……
}
当我们在获取该组件时,为context.getBean(“userBiz);
2.在配置文件中我们可以对组件(bean)的作用域范围进行设置,它的默认值是单例模式,那么在添加注解的情况下,我们怎样设置组件的作用域范围呢?
我们可以直接在为类添加注解的同时,运用另一个注解@Scope(“prototype”)来设置,如下
@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
猜你喜欢
- java 中HttpClient传输xml字符串实例详解介绍:我现在有一个对象page,需要将page对象转换为xml格式并以binary方
- 使用YZMHelper帮助类即可using System;using System.Web;using System.Drawing;usi
- 概述对于多线程程序来说,生产者和消费者模型是非常经典的模型。更加准确的说,应该叫“生产者-消费者-仓库模型”。离开了仓库,生产者、消费者就缺
- 前言使用过SpringBoot的都应该知道,一个SpringBoot 项目就是由一个一个 Starter 组成的,一个 Starter 代表
- Spark Streaming算子开发实例transform算子开发transform操作应用在DStream上时,可以用于执行任意的RDD
- 将脚本挂在要判断声音是否播放完毕的物体上using System.Collections;using UnityEngine;using U
- 之前看到过一个数字进度条,一直想写,今天就把这个实现下,想起来也是很简单的,先看下实现的效果:思路:绘制2根线 绘制进度条的文字,不断的改变
- 我们平时在开发系统时,一般我们的系统工程会被分为多个模块,一个原因是方便协同开发,系统间解耦,另外一个很重要的原因是:别的系统需要依赖我们系
- 目录前言步入正题类的加载过程:1.加载2.验证3.准备4.解析5.初始化类加载器源码总结前言学生时代应抱着问题去学习一门语言,例如:在学习j
- 这篇文章主要介绍了Maven打包jar生成javadoc文件和source文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作
- 登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象。本例中如果有注释不详细的地方,详见其它博客。功能介绍:简单的登录注册系统,
- ArrayList实现班级信息管理系统,供大家参考,具体内容如下代码如下:import java.util.*;public class D
- package com.cq2022.zago.base.util;import java.io.FileReader;import jav
- 一键格式化代碼: Ctrl+Alt+L注意:如果按Ctrl+Shift+F在win10上会出现字体的简繁转换,再重复按键一次就可以转换回来a
- 我们已经有文章向你描述如何使用<include />标签来重用和共享你的布局代码。这篇文章将向你阐述<merge />
- 延伸:以后除了可以为实体类注入属性,还可以为配置类注入相关的配置信息1.编写实体类@Component@ConfigurationPrope
- /** * 进行BigDecimal对象的加减乘除,四舍五入等运算的工具类 * * @author Marydon * @createTi
- 循环依赖定义循环依赖就 循环引用,就是两个或多个 bean 相互之间的持有对方,比如 CircleA 引用 CircleB , Circle
- 一、引言在前面的文章中,我们是使用“锁”的方式实现了线程间的通信,这种通信方式比较笨重。除了锁之外,
- 在应用登陆页面我们需要填写用户名和密码。当填写这些信息的时候,软键盘会遮挡登陆按钮,这使得用户体验较差,所以今天就来解决这个问题1:登陆布局