Spring框架:第六章:注解功能

8.1、注解配置Dao、Service、Controller組件
實(shí)驗(yàn)32:通過注解分別創(chuàng)建Dao、Service、Controller★
Spring配置bean的常用注解有
@Controller 配置web層的組件
@Service 配置Service層的組件
@Repository 配置Dao層的組件
@Component 除了web層、service層、dao層之外的組件。
@Scope 配置作用域

bean對象

/**
 *  @Component 等價(jià)于<br/>
 *  <bean id="book" class="com.pojo.Book" />
 */
@Component
public class Book {}

/**
 *  @Repository 等價(jià)于<br/>
 *  <bean id="bookDao" class="com.dao.BookDao" />
 */
@Repository
public class BookDao {}

/**
 *  @Service 等價(jià)于<br/>
 *  <bean id="bookService" class="com.service.BookService" />
 */
@Service
public class BookService {}

/**
 *  @Controller 等價(jià)于<br/>
 *  <bean id="bookServlet" class="com.controller.BookServlet" />
 */
@Controller
public class BookServlet {}

   

8.2、指定掃描包時(shí)的過濾內(nèi)容
實(shí)驗(yàn)33:使用context:include-filter指定掃描包時(shí)要包含的類
實(shí)驗(yàn)34:使用context:exclude-filter指定掃描包時(shí)不包含的類
<context:include-filter /> 設(shè)置包含的內(nèi)容
注意:通常需要與use-default-filters屬性配合使用才能夠達(dá)到“僅包含某些組件”這樣的效果。即:通過將use-default-filters屬性設(shè)置為false,
<context:exclude-filter />設(shè)置排除的內(nèi)容

annotation com.XxxAnnotation
過濾所有標(biāo)注了XxxAnnotation的類。這個(gè)規(guī)則根據(jù)目標(biāo)組件是否標(biāo)注了指定類型的注解進(jìn)行過濾
assignable com.BaseXxx
過濾所有BaseXxx類的子類。這個(gè)規(guī)則根據(jù)目標(biāo)組件是否是指定類型的子類的方式進(jìn)行過濾。

applicationContext.xml 中配置的內(nèi)容如下

<!-- use-default-filters="false" 設(shè)置取消默認(rèn)包含規(guī)則 -->
<context:component-scan base-package="com" use-default-filters="false">
    <!-- context:include-filter 設(shè)置包含的內(nèi)容 -->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <!-- context:exclude-filter 設(shè)置排除的內(nèi)容 -->
    <context:exclude-filter type="assignable" expression="com.atguigu.service.BookService"/>
</context:component-scan>

 

以上配置會(huì)包含所有@Service注解的類。排除com.service.BookService類

包掃描的排除示例:

<!--
    context:component-scan 包掃描
        base-package 設(shè)置你要掃描的包,以子包
        base-package="com" 表示Spring會(huì)掃描com包,以及它所有子包都會(huì)掃描
 -->
<context:component-scan base-package="com">
    <!--
        context:exclude-filter 排除某些類
            type="annotation"表示按注解進(jìn)行排除
            expression 按哪些注解
     -->
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <!-- 表示按類進(jìn)行過濾,排除 -->
    <context:exclude-filter type="assignable" expression="com.dao.BookDao"/>
</context:component-scan>

  

包掃描的包含示例:

<!--
    context:component-scan 包掃描
        base-package 設(shè)置你要掃描的包,以子包
        base-package="com" 表示Spring會(huì)掃描com包,以及它所有子包都會(huì)掃描
        
    use-default-filters="false"禁用默認(rèn)的包掃描包含規(guī)則
    包掃描自定義包含規(guī)則一定要結(jié)合 use-default-filters="false" 一起使用
 -->
<context:component-scan base-package="com" use-default-filters="false">        
    <!--
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        按照注解的形式配置包含掃描規(guī)則
     -->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <context:include-filter type="assignable" expression="com.atguigu.dao.BookDao"/>
</context:component-scan>

 

8.3、使用注解@Autowired自動(dòng)裝配
實(shí)驗(yàn)35:使用@Autowired注解實(shí)現(xiàn)根據(jù)類型實(shí)現(xiàn)自動(dòng)裝配★

@Autowired 注解 會(huì)自動(dòng)的根據(jù)標(biāo)注的對象類型在Spring容器中查找相對應(yīng)的類。如果找到,就自動(dòng)裝配。
使用@Autowired注解,不需要get/set方法

public class BookService {
    /**
     * @Autowired 配置自動(dòng)注入
     *     1、先按類型進(jìn)行查找然后注入。
     */
    @Autowired
    private BookDao bookDao;

    @Override
    public String toString() {
        return "BookService [bookDao=" + bookDao + "]";
    }

}

8.4、多個(gè)同類型的bean如何自動(dòng)裝配
實(shí)驗(yàn)36:如果資源類型的bean不止一個(gè),默認(rèn)根據(jù)@Autowired注解標(biāo)記的成員變量名作為id查找bean,進(jìn)行裝配★

/**
 *  @Repository 等價(jià)于<br/>
 *  <bean id="bookDao" class="com.dao.BookDao" scope="singleton"/>
 */
@Repository
public class BookDao {}

/**
 *  @Repository 等價(jià)于<br/>
 *  <bean id="bookDao" class="com.dao.BookDao" scope="singleton"/>
 */
@Repository
public class BookDaoExt extends BookDao{}


/**
 * @Service 等價(jià)于<br/>
 * <bean id="bookService" class="com.service.BookService" />
 */
@Service("bookService")
// @Scope("singleton") // 表示單例===不寫也一樣
@Scope("prototype") // 表示多例
public class BookService {
    /**
     * @Autowired 配置自動(dòng)注入
     *     1、先按類型進(jìn)行查找然后注入。<br/>
     *  2、如果按類型查找找到多個(gè),接著做屬性名做為id接著查找注入。
     */
    @Autowired
    private BookDao bookDao;

    @Override
    public String toString() {
        return "BookService [bookDao=" + bookDao + "]";
    }

}

8.5、使用@Qualifier裝配指定id的bean對象
實(shí)驗(yàn)37:如果根據(jù)成員變量名作為id還是找不到bean,可以使用@Qualifier注解明確指定目標(biāo)bean的id★

@Service("bookService") // <bean id="bs" class="com.service.BookService" />
// @Scope("singleton") // 表示單例===不寫也一樣
@Scope("prototype") // 表示多例
public class BookService {
    /**
     * @Autowired 配置自動(dòng)注入
     *     1、先按類型進(jìn)行查找然后注入。<br/>
     *  2、如果按類型查找找到多個(gè),接著做屬性名做為id接著查找注入。
     *  @Qualifier("bookDao") 可以設(shè)定按照指定的id來進(jìn)行查找并注入
     */
    @Qualifier("bookDaoExt")
    @Autowired
    private BookDao bookDao2;

    @Override
    public String toString() {
        return "BookService [bookDao=" + bookDao2 + "]";
    }

}

8.6、@Autowired注解的required屬性作用
實(shí)驗(yàn)39:@Autowired注解的required屬性指定某個(gè)屬性允許不被設(shè)置

/**
 * @Autowired 配置自動(dòng)注入
 *     1、先按類型進(jìn)行查找然后注入。<br/>
 *  2、如果按類型查找找到多個(gè),接著做屬性名做為id接著查找注入。
 *  @Qualifier("bookDao") 可以設(shè)定按照指定的id來進(jìn)行查找并注入
 *  @Autowired(required=true) 表示必須找到一個(gè)相應(yīng)的bean對象注入值。如果找不到,就報(bào)錯(cuò)。
 *      如果required=false表示找不到bean對象注入,就值為null
 */
@Qualifier("bookDaoExt2")
@Autowired(required=false)
private BookDao bookDao2;

 

8.7、@Autowired和@Qualifier在方法上的使用。
實(shí)驗(yàn)38:在方法的形參位置使用@Qualifier注解

/**
 * 加入@Autowired的方法在bean對象創(chuàng)建出來之后,就會(huì)自動(dòng)的調(diào)用<br/>
 * 加了@Autowired的方法中的參數(shù),會(huì)自動(dòng)的到spring IOC容器中去按類型查找并注入<br/>
 * 如果按類型查找,找到多個(gè)。就把參數(shù)名做為id接著查找并注入。
 */
@Autowired
public void abc(@Qualifier("bookDao")BookDao bookDaoExt2) {
    System.out.println("這是加了@Autowired的方法...bookDao ==>> " + bookDaoExt2);
}

8.8、泛型注入(了解內(nèi)容)
實(shí)驗(yàn)40:測試泛型依賴注入★


9、Spring的專有測試(了解內(nèi)容)
@ContextConfiguration
@RunWith

/**
 * 怎么樣使用Spring整合Junit的測試(Spring把容器加入到了測試的上下文)
 *
 */
// 告訴測試,Spring 容器的配置文件在哪
@ContextConfiguration(locations="classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)// 表示使用整合了Spring IOC容器的測試類進(jìn)行測試
public class SpringTest2 {

    @Autowired
    BookService bookService;
    
    @Autowired
    UserService userService;
    
    @Test
    public void test1() throws Exception {
        bookService.saveEntity(new Book());
        System.out.println("=========================");
        userService.saveEntity(new User());
    }
    
}