• Spring-IOC


    底层实现原理

    工厂+反射+配置文件

    IOC和DI

    控制反转(Inversion of Control),简称IOC;依赖注入(Dependency Injection),简称DI。其实他们是对同一概念的不同角度的描述。

    • IOC是一种设计思想,举个鲜明的例子,传统的应用程序在类内部创建依赖对象,就像是我们直接找女朋友;有了IOC容器后,由容器创建和查找相应的依赖对象并注入,就像是有了婚介所,由婚介所根据我们的要求推荐给我们适合的对象。
    • 在Spring中,对象无需自己查找或创建与其所关联的其他对象。相反,容器负责把需要相互协作的对象引用赋予各个对象。
    • IOC将原本在程序中创建对象的控制权交给Spring框架管理,这就是控制反转。
    • 属性通过Spring配置文件写入,这就是依赖注入。
    • Spring通过反射来实现程序运行中动态向某个对象提供其依赖的其他对象。

    使用Spring装配bean

    创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入的本质。以下介绍配置Spring容器的三种方式。

    1.基于注解方式装配bean

    使用组件扫描(默认不开启)和自动装配实现Spring的自动化配置。

    • 开启组件扫描的方式
      • 使用XML来启用组件扫描,可以使用Spring context命名空间的<context:component-scan>元素,其含有base-package属性
      • 使用Java配置类启用组件扫描,使用@ComponentScan注解
    • 相关注解:
      • @Component,在类上添加此注解,表明该类会作为组件类,并告知Spring要为这个类创建bean。不常用,推荐使用以下注解代替:
        • @Controller,应用在表现层
        • @Service,应用在业务层
        • @Repository,应用在数据访问层
      • @ComponentScan,在配置类上添加此注解,表明启用组件扫描,查找带有@Component注解的类。默认Spring会扫描与配置类相同的包,
      • @Autowired,同@Inject注解,在构造器或者setter方法或其他需要的方法上添加此注解,声明要进行自动装配,自动装配时在Spring应用上下文中寻找匹配某个bean需求的其他bean。
      • @Resource,@AutoWired、@Qualifier 都用来注入对象。其中@Resource可以以 name(默认) 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。@Resources是JDK提供的注解,而@Autowired是Spring提供的注解。推荐以名称方式注入,因为按类型注入,如果不同包内有同名的类会报错找不到。
    • 为组件扫描的bean命名
      Spring应用上下文中所有的bean都会给定一个ID,默认将类名的第一个字母变为小写作为ID。有三种方式命名:
      • 通过@ComponentScan的value属性中指明包的名称(同@Named注解)
      • 通过basePackages属性进行配置多个基础包,使用String类型配置,不安全
      • 更安全一些,使用basePackageClasses属性设置组件类。

    2.基于Java方式装配bean

    有时不能使用自动化配置,比如装配第三方库中的组件到你的应用中,这时可以考虑显式配置。在进行显式配置时,有两种可选方案: Java和XML。JavaConfig是更好的方案,因为它更为强大、类型安全并且对重构友好。具体步骤如下:

    • 创建配置类
      在类上添加@Configuration注解来表明这是配置类。
    • 声明简单的bean
      在方法上添加@Bean注解,告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。
      默认情况下,bean的ID与带有@Bean注解的方法名是一样的,重命名可以使用name属性。
    • 初始化bean
      声明bean的方法需要创建并返回bean。默认情况下,Spring中的bean都是单例的。返回的对象可以使用其他的bean,使用构造器方法或者setter方法或者对象引用作为参数来产生需要返回的bean。

    3.基于XML文件方式装配bean

    推荐使用前两种方案来配置Spring,使用xml来维护已有的XML配置。创建和管理Spring XML配置文件可以使用Spring Tool Suite工具。使用步骤如下:

    • 创建XML文件
      在Spring Tool Suite的菜单中,选 择File>New>Spring Bean Configuration File,能够创建Spring XML配置文件,并且可以选择可用的配置命名空间。
    • 声明一个简单的bean
      使用<bean>元素声明一个bean,类似于@Bean注解。当Spring发现这个<bean>元素时,它将会调用类的默认构造器来创建bean。而在JavaConfig配置方式中,可以自由选择一个方法进行配置。这是xml配置的一个缺点。
      在class属性中使用全限定域名指定创建这个bean的类,最好使用id属性来命名而不是默认命名。bean的类型使用字符串的形式设置在了class属性中,有时我们不能保证设置给class属性的值是真正的类,比如修改了类名,这是xml配置的另一个缺点。
    • 初始化bean
      • 使用构造器注入方法,有两种方案:
        • 使用<constructor-arg>元素
          使用ref属性引用其他bean的ID;
          使用value属性引用字面量;
          使用<list>子元素下的<value><ref>子元素来注入集合,这里list为对应的集合
        • 使用Spring 3.0所引入的c-命名空间(需要在xml头部引入c命名空间及其模式)
          <bean>元素中使用c:cd-ref属性引用其他bean;
          使用c:cd属性引用字面量;(cd为构造器参数名,可以换成参数索引_n)
      • 使用setter注入方法
        • 使用<property>元素为属性的setter方法所提供的功能与<constructor-arg>元素为构造器所提供的功能是一样的。
        • 使用p-命名空间(需要在xml头部引入p命名空间及其模式),p-命名空间中属性所遵循的命名约定与c-命名空间中的属性类似。
          使用Spring util-命名空间(需要在xml头部引入util-命名空间及其模式)的<util:list>元素及其<value>子元素来引入集合

    使用Spring获取bean

    1.通过xml文件获取

    		AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    		((Tom) context.getBean("tom")).say();
    		context.close();
    

    2.通过配置类获取

    		AbstractApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class);
    		((Jerry) context2.getBean("jerry")).say();
    		context2.close();
    

    Spring IOC实战测试

    • 创建普通Java项目,将以下几个基本jar包复制到src目录下,选中jar包右键-Build Path-Add to Build Path。
    • 测试配置类装配bean
      • 创建Java类
      • 使用@Configuration注解创建配置类
        • 使用@Bean注解在配置类中装配bean
        • 或者使用@ComponentScan开启注解扫描并在Java类中使用@Component注解声明为组件类来装配bean
      • 创建测试类,通过配置类获取bean,调用类的方法
    • 测试xml文件装配bean
      • 创建Java类
      • 创建xml文件,并开启组件扫描;使用bean标签装配bean
      • 创建测试类,通过xml文件获取bean,调用类的方法
  • 相关阅读:
    MongoDB安装与启动
    Mac node.js express-generator脚手架安装
    AJAX状态值与状态码
    博客园 Markdown编辑器简要教程
    高效、可维护、组件化的CSS
    如何在mac上运行vue项目
    前端chrome调试
    Light of future-冲刺集合
    团队作业第六次—事后诸葛亮
    Light of future-冲刺总结
  • 原文地址:https://www.cnblogs.com/pycrab/p/9463817.html
Copyright © 2020-2023  润新知