暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring IOC的基本流程和使用

小青菜的技术博客 2021-04-12
1434

1. Spring IOC的使用

1.1 使用流程

  • 声明组件

  • 组件扫描和组件注册

  • 组件注入

1.2 按照实现方式分为两类:

  • 注解(如@Autowired)

  • 配置文件(如xml)

1.3 四种依赖注入方式

  • Setter方法注入

  • 构造器注入

  • 静态工厂的方法注入

  • 实例工厂的方法注入

2. 不同实现方式的使用

  • XML驱动的IoC容器使用的是ClassPathXmlApplicationContext读取xml内bean信息

  • 注解驱动的IoC容器使用的是AnnotationConfigApplicationContext读取Java类中的bean信息

2.1 声明组件

2.1.1 @Bean与@Configuration配置使用

  • @Bean作用在方法上

    @Configuration
    public class DemoConfiguration {
    @Bean
    public Person person() {
    return new Person();
    }
    }
    复制

    2.1.2 xml配置bean

      <bean id="person" class="com.jyp.bean.Person"></bean>
      复制

      2.1.3 @Component、@Controller、@service、@Repository

      • 都作用在类上

      • @Component注解,泛指组件,它可以被Spring容器识别,启动Spring后,会自动把它转成容器管理的Bean。

      • Spring提供了3个功能基本和@Component等效的注解,分别对应于用于对DAO,Service,和Controller进行注解。它们底层也是通过@Component实现的

        • @Repository 用于对DAO实现类进行注解。

        • @Service 用于对业务层注解

        • @Constroller用于对控制层注解

      2.2 组件扫描与组件注册

      2.2.1 注解@ComponentScan或XML配置的context:omponent-scan标签

      • 主要用来扫描带有@Component注解的类

        • 也可以扫描@Controller、@service、@Repository、@Configuration,原因是这些注解底层也是通过@Component注解实现的

      • 注意: 

        • 如果不指定扫描路径, 则默认扫描本类所在包及所有子包下带有@Component的组件

        @ComponentScan("com.jyp.bean")
        复制
          <context:component-scan base-package="com.jyp.bean"/>
          复制

          2.2.2 @ImportResource并声明配置文件的路径

          • 需在配置类上标注 @ImportResource 并声明配置文件的路径

          • 主要指定扫描xml方式配置的Bean

            @Configuration
            @ImportResource("classpath:annotation/demo-beans.xml")
            public class ImportXmlAnnotationConfiguration {
            }
            复制

            2.3 组件注入

            2.3.1 Setter方法注入

            • setter注入是使用最广泛的注入机制,也是最简单的IOC机制之一

            • 可以在没有依赖项的情况下创建对象,然后可以通过调用setter来提供依赖项。

            • 在各种情况下都很有用

            2.3.1.1 注解注入:

            • @Autowired

              • @Autowired是由spring提供

              • 可以对成员变量、方法以及构造函数进行注释

              • 默认是按照类型装配注入的,如果想按照名称来注入,则需要结合@Qualifier一起使用,@Qualifier("XXX") 中的 XX是 Bean 的名称

              • 每个类可以有很多个构造器,但是在使用@Autowired的时候,有且只能有一个构造器能够被标记为required=true(注:required的默认值为false)

            • @Resource

              • @Resource注解由J2EE提供

              • 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

              • 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

              • 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

              • 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

            • 注意:

              • id默认是类的名字(首字母小写),如果在添加@Component到类上的时候,指定了@Component的名称,就必须用指定的名称

            2.3.1.2 配置文件注入

              public class UserService {
              private UserDao userDao;
              public void login() {
              userDao.login();
              }
              }
              复制


                <bean name="userService" class="com.jyp.service.UserService">
                <property name="userDao" ref="userDao" >
                </bean>
                <bean name="userDao" class="com.jyp.dao.UserDao"></bean>
                复制

                2.3.2 构造方法注入

                • 特点:

                  • 组件声明一个或一组构造函数,并将其依赖项作为参数。

                  • 在组件实例化时由IOC容器将依赖项传递给组件。

                  • 使用构造函数注入的一个显而易见的结果是:如果没有依赖项,就不能创建对象;因此必须有依赖项。

                • 注意:

                  • 使用组件之前必须拥有一个依赖类的实例

                  • 构造函数注入有助于实现不可变对象的使用。

                2.3.2.1 注解注入:

                • @Autowired、@Resource

                2.3.2.2 配置文件注入

                  public class UserService {
                  private UserDao userDao;
                  public UserService(UserDao userDao) {
                  this.userDao = userDao;
                  }

                  public void login() {
                  userDao.login();
                  }
                  }
                  复制
                    <bean name="userService" class="com.obob.service.UserService">
                    <constructor-arg index="0" ref="userDao"></constructor-arg>
                    </bean>
                    <bean name="userDao" class="com.obob.dao.UserDao"></bean>
                    复制

                    2.3.3 总结

                    • 除了这两种常用的注入方式,还有其他的注入方式,如:静态工厂的方法注入、 实例工厂的方法注入,可以参考:https://blog.csdn.net/zhaohong_bo/article/details/89916494



                    文章转载自小青菜的技术博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论