bean 对象的延迟实例化,DI(依赖注入),组件扫描:

bean 对象的延迟实例化:
单例对象 默认是容器启动时 创建 可以通过bean标记的 lazy-init="true" 就可以让对象推迟实例化 只有用到这个对象时 才会创建对象

什么是 DI?
Dependence Injection(依赖注入 或者 依赖注射)
用来解决组件之间的装配问题

实现DI的方式:

  1. setter 注入
    一个组件装配值时 参考的是类型对应的set方法 格式如下:

    <bean id="" class="">  
     <property name="set方法去掉set之后首字母小写" value="值"></property>
    </bean>
    

    如果装配的是一个复杂的对象 则需要把value改成ref 只有八种基本类型 和对应的封装类 枚举 String 这些可以使用value 其他使用ref

  2. 构造器注入
    把上面的property 换成 constructor-arg
    只不过我们不但可以使用name=”构造方法参数名” 还可以使用index 代表参数的位置 编号从0开始

  3. 自动化注入
    在bean 标记中使用autowire属性可以完成自动化注入
    autowire 的取值有 byName byType constructor
    byName 参考的是类型中对应的set方法
    byType 参考的是类型中对应的成员变量类型 然后去容器中找类型匹配的组件 但是可能会找到多个 找到多个就崩溃
    constructor 参考的是构造方法 只要有一个参数无法装配成功 则终止后续装配 但不报错

组件扫描:

  1. 什么是组件扫描
    Component Scan 组件扫描
    它是Spring 提供的一套基于标注(注解)的技术
    目的是为了简化XML 的配置

  2. 实现组件扫描的步骤

    1. 建立一个项目 导入jar包(ioc aop) 并拷贝配置文件到src下
    2. 在配置文件中开启组件扫描
      <context:component-scan base-package="包名"/>>
      
    3. 建立一个类然后在类上打对应的标注
      @Repository  持久层标注 一般加载DAO上
      @Service     服务层标注
      @Controller  控制层标注
      @Component   通用层标注
      d.创建Spring 容器 从容器中获取对象 进行测试
      
  3. 和组件扫描相关的其他标注

     @Scope("singleton"||"prototype") 和对象作用域相关的标注
     @PostContruct 加在初始化方法上
     @PreDestroy  即将销毁对象时调用的方法
    
  4. 和DI相关的标注

    1. @Value
      它可以用在成员变量上 或者set方法上
      如果是简单值(八种基本类型和封装类 String 枚举) 可以直接使用@Value(“值”)
      但是如果是复杂对象的赋值 则需要使用Spring 的EL表达式赋值 从Spring容器中
      进行取值 取值的语法是 把之前的$ 换成# 即可

      1. @Autowired
        它可以用在成员变量 set方法 构造方法上
        它可以用来解决复杂值的装配问题的
        它优先使用类型进行匹配 如果类型有冲突 则会启用名字匹配进行装配
        它可以和@Qualifier 配合使用 @Qualifier可以指定查找的组件名 如果找不到则程序报错
        注意@Qualifier 不能用在构造方法上
        当使用@Qualifier 指定名字查找时 对组件的依赖 属于强依赖(找不到程序就报错) 可以使用@Autowired的属性 requried=false 来接触这种强依赖 就是让程序尽量的去查找组件 找不到也不报错

      2. @Resource
        它可以用在成员变量 set方法上
        它也是用来解决复杂值的装配问题
        它优先按照名字(参考的是set方法名 而不是参数的名字)进行匹配 如果名字不匹配 会启动类型进行匹配
        它是JDK 提供的标注
        可以通过 @Resource 的name 属性 指定查找的组件 如果找不到就报错 但是无法解除强依赖