【Spring篇】IOC

文章详细介绍了Spring框架的两大核心概念——IOC(控制反转)和AOP(面向切面编程)。IOC通过Bean管理降低了代码的耦合度,包括BeanFactory和ApplicationContext的使用。此外,文章还讨论了Bean的创建、属性注入、生命周期以及自动装配机制,同时提到了基于注解的bean管理方式。
摘要由CSDN通过智能技术生成

Spring的俩大核心实现:IOC和AOP


前言

框架的本质就是为了简化开发,IOC很大程度上证明了这一真理

IOC容器

1. IOC(Inversion Of Control)

  1. 控制反转

    • 把创建对象和对象间的调用全部交给spring的ioc容器进行管理(Bean标签)
    • 不需要手动创建对象和手动调用方法,减低了代码的耦合度
    • 程序------高内聚,低耦合
  2. 使用IOC的目的:降低耦合度

    • java----》new

      ------改变地址就得重新编译运行,消耗成本高

2. IOC底层原理

  1. xml解

    解析配置文件中配置的对象

  2. 工厂模式

    不在本类中直接通过new关键字创建对象,

    而是通过工厂类中的静态方法创建对象,

    然后进行返回,目的是降低耦合度

  3. 反射

    通过反射创建对象,降低耦合度

3. IOC的实现

  1. IOC思想基于IOC容器完成,IOC容器底层就是对象工厂

    简单理解,IOC容器就是用来存放对象

    IOC容器会把对象封装成一个又一个的Bean

  2. Spring提供IOC容器实现的两种方式

    • 二者创建对象的时期不同,功能不同
    1. BeanFactory:
    • IOC容器的基本实现,是Spring内部使用的接口,不提供给开发人员
      使用加载配置文件的时候,不创建对象,获取对象的时候才创建对象
    1. ApplicationContext:
    • BeanFactory接口的子接口,提供更多更强大的功能,一般提供给开
      发人员使用,加载配置文件的时候就会创建相应的对象

4. Bean管理

  1. 概述

    • 在Spring中,对象被封装成了Bean

    • Bean管理包括俩个操作:**创建对象 **和 注入属性

  2. 基于XML文件的方式

    • 创建对象

      • bean标签,添加属性(id—对象名,class–全类名),默认调用无参构造方法
    • 注入属性
      DI:依赖注入
      (1)set方法
      property标签----name 属性名称,value属性值
      (2)有参构造
      bean标签—constructor-org标签 name value属性
      (3)p名称注入

	//添加名称空间

     xmlns:p="http://www.springframework.org/school/p"

     使用名称空间:<bean id="book" class="全类名" p:name="属性名" p:value="属性值"></bean>

(4)注入空值

使用null标签
(5)注入特殊符号
实体符号
cdate使用在value标签内部
<![CDATE[<<>>]]>

  • 注入对象

    • 按书写bean的位置分:

    • 外部bean:
      property标签的属性ref

  • 内部bean:
    对象作为类的属性,在property标签内部嵌套bean标签
    级联赋值:
    同时向多个关联的类中的属性进行赋值

    内部bean和外部bean
    mp.ename,需要提供get方法

注入集合类型属性

  • 在property标签内部嵌套下面标签,来实现

array-----value
list------value
set------value
map----key / value

  • 往集合中注入对象
    利用ref标签的bean属性------填写id值

  • 将往集合注入属性的操作进行提取

  • 使用util名称空间

  • <util:list id=“bookList”>

  • Spring中的两种bean:

普通Bean
xml文件中定义的类型与ioc容器返回的类型一致

工厂Bean(FactoryBean)

  • xml配置文件中定义的类型可以与返回的类型不一致

    • Bean的作用域(scope)

俩个:单实例和多实例

默认单实例:singleton

  • 加载配置文件的时候,就会创建对象

    • 多实例:prototype

不是在加载配置文件的时候创建对象
而是在获取对象getBean方法的时候创建对象

  1. Bean的生命周期

    1. Bean指的就是对象,所以Bean的生命周期就是从对象创建对象销毁的过程

    2. Bean生命周期

      • 需要在Bean标签中进行配置:初始化方法 / 销毁方法
      <bean id="book" class="com.nuesoft.springdemo2.Book" init-method="innitMethod" destroy-method="destroyMethod">
          <property name="bname" value="九阳真经"></property>
      </bean>
    
    1. 通过构造器创建Bean实例

    2. 为Bean的属性赋值

    3. 调用Bean的初始化方法

    4. 使用Bean(获取对象)

    5. 当容器关闭时,调用Bean的销毁方法

    6. Bean的后置处理器

    • 配置后置处理器,在执初始化方法的前后执行
    • 写一个后置处理器的类,实现BeanPostProcessor接口,重写接口中的抽象方法
         public class MyBeanPost implements BeanPostProcessor {
             @Override
             public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                 System.out.println("在初始化之后执行的方法");
                 return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
             }
         
             @Override
             public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                 System.out.println("在初始化之前执行的方法");
                 return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
         
             }
         }
          ```

   - 在核心配置文件中配置后置处理器

```xml
         </bean>
             <bean id="mybean" class="com.nuesoft.springdemo2.MyBeanPost"></bean>
         </beans>
         ```

4. Bean**自动装配**

   - Bean标签的属性autowried

 ```xml
   <bean id="emp" class="com.nuesoft.springdemo2.Emp" autowire="byType">
   </bean>

(1)根据名称注入属性
byName
(2)根据类型注入属性

​ byType

​ 不推荐使用,同一个类型的属性可能会有多个,

​ 此时就不知道拿哪一个给他赋值

(3)引入外部配置文件

  • 编写外部属性文件

  • 利用名称空间context

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
    	   xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd                           ">
    

    value属性值用表达式:${}

  • 外部属性文件,用键值对表示

  1. 基于注解实现bean管理

    1. 什么是注解:
      (1) 注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,…)
      (2) 作用域:类上面、方法上面、属性上面
      (3) 目的:简化XML操作

    2. Spring针对Bean管理中创建对象提供的注解
      @Component----普通类
      @Service-------业务逻辑层
      @Controller-------控制层
      @Repository------dao层
      四个注解功能相同,都是用来创建bean对象

      ​ 标识不同的类

      ​ 需要开启组件扫描

    3. 指定扫描的内容用centext名称空间来实现

      1. 扫描的内容

        use-default-filter=“false”
        context:include-filter

      2. 不扫描的内容
        context:exclude-filter

    4. 用注解方式注入属性
      @Autowired:根据属性类型进行自动装配
      @Qualifier:根据属性名称进行注入,要和@Autowired一起使用
      @Resource:既可以根据属性类型又可以根据名称注入
      @Value:注入普通类型属性

    5. 完全注解开发—基于SpringBoot

      • 配置类替代配置文件
      • @ComponentScan(basePackages={“”,“”})开启组件扫描
      • @Configuration—作为配置类
      • 测试类:
        • 加载配置类:AnnotationConfigApplicationContext(Xxx.class)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小B学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值