IOC 注解管理bean(注解加扫描和扫描组件)

  注解管理bean功能分析

    标记与扫描

      注解的作用

       ①注解

           和 XML 配置文件一样,注解本身并不能执行,

            注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,

          然后针对这个位置按照注解标记的功能来执行具体操作。

     本质上:所有一切的操作都是 Java 代码来完成的,XML 和注解只是告诉框架中的 Java 代码如何执行。

 

        举例:元旦联欢会要布置教室,蓝色的地方贴上元旦快乐四个字,

                    红色的地方贴上拉花,黄色的地方贴上气球。

                  班长做了所有标记,同学们来完成具体工作。墙上的标记相当于我们在代码中使用的注解,

                  后面同学们做的工作,相当于框架的具体操作。

 

       ②扫描

             Spring 为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,来进行检测。

               然后根据注解进行后续操作。

 

   注解管理bean(注解和扫描)

 

          @Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字。

           对于Spring使用IOC容器管理这些组件来说没有区别,也就是语法层面没有区别。

          所以@Controller、@Service、@Repository这三个注解只是给开发人员看的,

          让我们能够便于分辨组件的作用。

    注意:虽然它们本质上一样,但是为了代码的可读性,为了程序结构严谨我们肯定不能随便胡乱标记。

 

    1 . 使用@Component注解标记的普通组件

 

    2 . 使用@Controller注解标记的控制器组件

          这个组件就是我们在三层架构中表述层里面,使用的控制器。

        以前是Servlet,以后我们将会使用Controller来代替Servlet。

package com.atguigu.spring.controller;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
}

     3 . 使用@Service注解标记的业务逻辑组件

           这个组件就是我们在三层架构中使用的业务逻辑组件。

package com.atguigu.spring.service.imp;

import com.atguigu.spring.service.UserService;
import org.springframework.stereotype.Service;
import javax.swing.plaf.UIResource;

@Service
public class UserServiceImpl implements UserService {
}

     4 . 使用@Repository注解标记的持久化层组件

            这个组件就是我们以前用的Dao类,但是以后我们整合了Mybatis,

           这里就变成了Mapper接口,而Mapper接口是由Mybatis和Spring的整合包负责扫描的。

          是Mybatis和Spring的整合包来完成,将来由Mybatis负责扫描,

       也不使用@Repository注解。package com.atguigu.spring.dao.impl;

import com.atguigu.spring.dao.UserDao;
import org.springframework.stereotype.Repository;

@Repository
public class UserDaoImpl implements UserDao {
}

    xml文件进行扫描

<!--为什么扫描:类上加上注解,spring不知道就白搭,所以一定要spring知道哪些类加了注解,加了什么注解-->
<!-- 扫描组件 -->
<!-- 通过包来扫描的,包下面所有类进行扫描 -->
   <context:component-scan base-package="com.atguigu.spring"></context:component-scan>
 /**
    * @Component:将类标识为普通组件:就是把当前加上注解这个类作为一个bean被IOC管理
    * @Controller:将类标识为控制层组件
    * @Service:将类标识为业务层组件
    * @Repository:将类标识为持久层组件
    * 可以将扫描的包下面加上注解这些类作为主键(就是在ioc有了当前加上注解这个类所对应的bean对象)
    * 注意:功能一样都是将有一个类标识为组件,但是含义不一样
    */
   @Test
   public void test(){
       ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
       UserController bean = ioc.getBean(UserController.class);
       System.out.println(bean);
       UserService bean1 = ioc.getBean(UserService.class);
       System.out.println(bean1);
       UserDao bean2 = ioc.getBean(UserDao.class);
       System.out.println(bean2);

 

    注解管理bean(扫描组件)

        指定要排除的组件:

<!-- 
以后ssm整合的时候,spring和springMVC是放在一块使用的,而springMVC扫描的是控制层
                  spring扫描的是除控制层以外的所有组件
                  如果spring和springMVC都扫描了,一个组件扫描多次,
                  现在做的就是springMVC扫描控制层,spring其余组件进行扫描
            怎么做;在扫描组件标签里面有两个子标签
         第一种方法:
             context:exclude-filter:排除扫描,(不扫描谁)也是用的比较多
                   type(排除扫描的方式):"annotation/ assignable"
                      annotation:根据注解类型进行排除(常用)
                      assignable:根据类的类型进行排除
                   expression: 需要设置排除的注解的全类名/设置排除类的全类名  
-->
<context:component-scan base-package="com.atguigu.spring" >
       <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
   </context:component-scan>

       仅扫描指定组件:

<context:component-scan base-package="com.atguigu.spring" use-default-filters="false">
       <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
   </context:component-scan>
<!--
   第二中方法:
             context:include-filter:包含对某些组件扫描(只扫描谁)
             为什么没效果:因为默认情况下会把包下面这些所有的类都进行扫描
             注意:需要在context:component-scan标签中设置use-default-filters="false"
                   默认值true,所设置的包下所有的类都需要扫描,可以使用排除扫描
                   设置为false,所设置的包下所有的类不需要扫描,此时可以使用包含排除扫描
-->

            通过注解加扫描配置的bean的id默认值为类的小驼峰,类名首字母为小写的结果

             可以通过标识组件的注解的value属性值设置bean的自定义id

       例如:@Controller("controller")

 

posted @ 2022-11-15 21:18  zjw_rp  阅读(71)  评论(0)    收藏  举报