您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關spring配置不掃描service層的原因是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
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利用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),如果有相同的名稱,則進行依賴注入,如果沒有相同的名稱。則會根據類型區尋找組件。
關于“spring配置不掃描service層的原因是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。