欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring配置不掃描service層的原因解答

 更新時(shí)間:2022年03月21日 10:06:26   作者:逸疆  
這篇文章主要介紹了spring配置不掃描service層的原因解答,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

spring配置不掃描service層原因

我將contoller給springmvc進(jìn)行掃描,然后其余所有交給spring掃描

然后發(fā)現(xiàn)service層的EmployeeService并沒有掃描到出現(xiàn)以下問題

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

最終發(fā)現(xiàn)原因是spring配置文件里面context:exclude-filter是不要加use-default-filters的,而context:include-filter是需要加的

找了好久問題?。?!

spring配置自動(dòng)掃描原理介紹

Spring利用IOC容器將所有的bean進(jìn)行有秩序的管理維護(hù),而實(shí)際項(xiàng)目中不可能在xml文件中創(chuàng)建bean,而是利用了Spring的組件自動(dòng)掃描機(jī)制,通過在classpath自動(dòng)掃描的方式把組件納入到Spring容器中。這大大減少了程序員在配置XML文件上的時(shí)間,使得配置文件顯得干凈,整潔,便于維護(hù)。

這種機(jī)制的工作步驟是:

1.配置需要掃描的類;

2.在需要被納入Spring容器的類上加上相應(yīng)的注解;

3.Spring在類路徑下尋找標(biāo)注了注解的類,并把這些類納入Spring容器中管理。

它的作用是和在XML文件中使用節(jié)點(diǎn)配置組件是一樣的。

自動(dòng)掃描組件的使用

第一步:配置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組件自動(dòng)掃面,并配置要掃描的基本包 -->
<context:component-scan base-package="com.springtest"></context:component-scan>
</beans>

注:節(jié)點(diǎn)用于通知Spring容器掃描組件,base-package屬性用于指定將要被掃描的組件所在的包名稱。

在這里說明一下:context:component-scan有一個(gè)use-default-filters屬性,默認(rèn)為true,這就意味著會(huì)掃描指定包base-package下的全部的標(biāo)有@Component@Service,@Repository的類,并注冊(cè)成bean.

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

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

use-default-filters=”true”時(shí),此時(shí)指定的include-filter不會(huì)起到作用,只有當(dāng)

use-default-filters=”false”時(shí),context:exclude-filter指定的不掃描,context:include-filter指定的掃描

第二步:為需要被掃描的類添加相應(yīng)的注解

注解的類型有以下幾種:

  • @Service 用于標(biāo)注業(yè)務(wù)層組件;
  • @Repository 用于標(biāo)注數(shù)據(jù)訪問層組件;
  • @Controller 用于標(biāo)注控制層組件(如:Struts中的action)
  • @Component 表示泛型組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)組件進(jìn)行注解。

第三步:當(dāng)為類添加完成注解后,我們需要測試相應(yīng)的組件是否被納入Spring容器,所以我們需要測試組件是否被掃描

如下:

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

如果輸出不為空,則說明測試類已經(jīng)被掃描并且納入了Spring容器。

細(xì)節(jié)問題總結(jié)

1.當(dāng)我們進(jìn)行測試時(shí),用ApplicationContext對(duì)象的getBean()方法尋找組件。

在之前的配置文件中我們會(huì)用標(biāo)簽的id屬性去定義,在使用注解后怎樣獲得組建的id呢?

在這種情況下,Spring會(huì)將被標(biāo)注注解的類名拿到,然后再將該類名的第一個(gè)字母變?yōu)樾?,放到getBean()方法中。如:UserBizImpl類的組件Id就會(huì)是userBizImpl,獲取時(shí)為context.getBean(“userBizImpl”);

那么,我們?cè)谑褂米⒔鈺r(shí)可以自定義組件的Id嗎?

當(dāng)然可以。

我們需要在為相應(yīng)的類添加注解時(shí),在注解之后添加自定義的類名,例如:

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

當(dāng)我們?cè)讷@取該組件時(shí),為context.getBean(“userBiz);

2.在配置文件中我們可以對(duì)組件(bean)的作用域范圍進(jìn)行設(shè)置,它的默認(rèn)值是單例模式,那么在添加注解的情況下,我們?cè)鯓釉O(shè)置組件的作用域范圍呢?

我們可以直接在為類添加注解的同時(shí),運(yùn)用另一個(gè)注解@Scope(“prototype”)來設(shè)置,如下

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

3.在使用注解時(shí),為組件設(shè)置初始化和銷毀方法

在添加注解的相應(yīng)的類中,如果想初始化或銷毀某個(gè)方法,我們可以直接在方法上添加注解,如下:

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

4.在使用Spring自動(dòng)掃描組件后,怎樣進(jìn)行依賴注入?

運(yùn)用注解@Resource和@Autowired,并為依賴對(duì)象設(shè)置名稱,例如:

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

首先它會(huì)根據(jù)名稱去找Spring自動(dòng)掃描的并加入到Spring容器的組件(bean),如果有相同的名稱,則進(jìn)行依賴注入,如果沒有相同的名稱。則會(huì)根據(jù)類型區(qū)尋找組件。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中this和super關(guān)鍵字的使用詳解

    Java中this和super關(guān)鍵字的使用詳解

    super?代表父類的存儲(chǔ)空間標(biāo)識(shí)(可以理解為父親的引用)。?this代表當(dāng)前對(duì)象的引用(誰調(diào)用就代表誰)。本文將通過簡單的示例介紹二者的使用與區(qū)別,需要的可以了解一下
    2022-10-10
  • java異步編程之一文看完其異步函數(shù)表

    java異步編程之一文看完其異步函數(shù)表

    這篇文章主要為大家介紹了java異步編程之一文看完其異步函數(shù)表示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Mybatis plus的自動(dòng)填充與樂觀鎖的實(shí)例詳解(springboot)

    Mybatis plus的自動(dòng)填充與樂觀鎖的實(shí)例詳解(springboot)

    這篇文章主要介紹了Mybatis plus的自動(dòng)填充與樂觀鎖的實(shí)例詳解(springboot),本文給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀

    Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀

    這篇文章主要介紹了Java的非阻塞隊(duì)列ConcurrentLinkedQueue解讀,在并發(fā)編程中,有時(shí)候需要使用線程安全的隊(duì)列,如果要實(shí)現(xiàn)一個(gè)線程安全的隊(duì)列有兩種方式:一種是使用阻塞算法,另一種是使用非阻塞算法,需要的朋友可以參考下
    2023-12-12
  • idea常用的18個(gè)設(shè)置(程序員必不可少)

    idea常用的18個(gè)設(shè)置(程序員必不可少)

    這篇文章主要給大家介紹了關(guān)于idea常用的18個(gè)設(shè)置,這些對(duì)程序員們來說必不可少,idea開發(fā)常用基本且非常實(shí)用的配置,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Java中啟動(dòng)線程start和run的兩種方法

    Java中啟動(dòng)線程start和run的兩種方法

    start()方法它的作用是啟動(dòng)一個(gè)新線程,run()就和普通的成員方法一樣,可以被重復(fù)調(diào)用。接下來通過本文給大家分享Java中啟動(dòng)線程start和run的兩種方法,需要的朋友參考下吧
    2017-11-11
  • java使用FastJson解析Json數(shù)據(jù)

    java使用FastJson解析Json數(shù)據(jù)

    本篇文章主要介紹了java使用FastJson解析Json數(shù)據(jù),fastjson 是一個(gè)性能極好的用 Java 語言實(shí)現(xiàn)的 JSON 解析器和生成器,有興趣的可以了解一下。
    2017-02-02
  • Javaweb動(dòng)態(tài)開發(fā)最重要的Servlet詳解

    Javaweb動(dòng)態(tài)開發(fā)最重要的Servlet詳解

    動(dòng)態(tài)web的核心是Servlet,由tomcat解析并執(zhí)行,本質(zhì)是Java中的一個(gè)類(面向?qū)ο螅┻@個(gè)類的功能十分強(qiáng)大幾乎可以完成全部功能,在Java規(guī)范中只有Servlet實(shí)現(xiàn)類實(shí)例化的對(duì)象才能被瀏覽器訪問,所以掌握Servlet具有重要意義
    2022-08-08
  • Java動(dòng)態(tài)加載類示例詳解

    Java動(dòng)態(tài)加載類示例詳解

    這篇文章主要給大家介紹了關(guān)于Java動(dòng)態(tài)加載類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)(Run-Time Data Areas)

    Java JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)(Run-Time Data Areas)

    運(yùn)行時(shí)數(shù)據(jù)區(qū),是java虛擬機(jī)定義的在程序執(zhí)行期間使用的各種運(yùn)行時(shí)的數(shù)據(jù)區(qū),通過JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)圖例給大家展示的很詳細(xì),對(duì)JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2021-06-06

最新評(píng)論