Spring学习核心之一 IOC

Spring概念

Spring是轻量级的开源的JavaEE的框架,可以解决企业应用开发的复杂性(框架的特征)
Spring核心:

  • IOC: 反向控制,把创建对象的过程交给spring(减低耦合度)
  • AOP:面向切面,不修改源代码进行功能增强
    (Aop将横向关注点从它们所影响的对象中分离出来,而IOC的依赖注入是将应用程序对象从彼此中分离出来)

下面来具体说一下IOC:

一.IOC底层原理

  • xml解析、工厂模式(降低耦合度)、反射
    在这里插入图片描述

二.IOC接口

Spring提供IOC容器实现的两个方式(两个接口)

  • BeanFactory:IOC容器基本实现,是Spring内部的接口,不提供给开发人员使用
  • ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般有开发人员使用

不同之处:BeanFactory加载配置文件时不会创建对象,在获取对象使用时才会创建对象 。ApplicationContext加载配置文件时就会把在配置文件中的对象创建

ApplicationContext接口实现:

  • FileSystemXmlApplicationContext:该容器从XML文件中加载已被定义的bean. 需要xml文件的完整路径(从磁盘开始的路径)
  • ClassPathXmlApplicationContext:该容器从XML文件中加载已被定义的bean. 只需要正确配置ClassPath环境变量即可 ,只需要xml文件的包路径。

三.IOC操作Bean管理

bean管理指的时两个操作:Spring创建对象,Spring注入属性

基于xml创建对象:

  • 在Spring配置文件中(.xml)通过bean标签,标签里面添加属性,实现对象创建
    属性: id:唯一标识 class: 类全路径(包类路径) name:唯一标识,可以含有特殊字符
  • 创建对象的时候,默认执行无参构造函数完成对象创建()

基于xml方式注入属性(依赖注入,就是注入属性):

  • 第一种注入方式:使用set方法注入
    1)创建类,定义属性和相对应的set方法
    2)在Spring配置文件配置对象创建,配置属性注入 ,在<bean>标签中使用<property name="属性名" value="属性值"> </property>标签完成属性注入

  • 第二种方式:使用有参构造输入
    1)创建类,定义属性和相对应的有参数构造方法
    2)在Spring配置文件进行配置,在<bean>标签中使用<constructor-arg name="属性名" value="属性值"></constructor-arg>标签来完成属性注入

  • 第三种注入方式:p名称空间注入 1) 添加p名称空间在配置文件中
    在这里插入图片描述2) 进行属性注入,在bean标签里面进行操作 ,直接p:属性名= “属性值”在这里插入图片描述

xml方式注入其他类型属性:

  • 字面值
    null
    在这里插入图片描述
    属性值包含特殊符号
    1)使用转义字符:如<>为&lt;&gt
    2)将含有特殊字符的内容写到CDATA中 <![CDATA[含特殊符号的内容]]>
    在这里插入图片描述

注入属性

  • 外部bean
    a.创建两个类service类和dao类
    b.在service中调用dao里面的方法
    c.在Spring配置文件中配置 value换为ref 外部再创建一个dao对象
    在这里插入图片描述
    在这里插入图片描述
  • 内部bean
    一对多关系:部门和员工
    a.创建 Emp和Dept类
    b.根据两者之间关系,在Emp类中使用对象形式表示部门
    c.设置Spring配置文件 设置对象属性 注入内部bean(嵌套)
    <property/>或<constructor-arg/>元素中的<bean/>元素被称为内部bean 在这里插入图片描述
    在这里插入图片描述
  • 级联
    在这里插入图片描述

注入数据、集合
在这里插入图片描述
在这里插入图片描述

  • 在集合里面设置对象的值
    在<list>标签中,将<value>标签换成<ref>标签,该标签中设置bean的属性值就是,再另外创建集合中设置的对象的bean对象,设置对象的值,的id属性的值。
    在这里插入图片描述
  • 把集合注入部分提取出来
    在Spring配置文件中引入名称空间util,把提取部分写在util标签中
    在这里插入图片描述

Spring的两种bean

一种是普通bean,另一种是工厂bean(FactoryBean)内置的

  • 普通bean:在配置文件中定义bean类型就是返回类型

  • 工厂bean:在配置文件中定义bean类型可以和返回类型不一样
    1)创建类,让这个类作为工厂bean,实现接口FactoryBean
    2)实现接口里面的方法,在实现的方法中定义返回的bean类型
    在第一个方法中定义返回的bean类型
    在这里插入图片描述在这里插入图片描述

四.Spring Bean的作用域

在Spring配置文件中定义一个bean,scope属性确定bean的作用域:singleton(默认)、prototype、request、session

  • singleton,单实例对象,Ioc容器中只会存在一个共享的bean实例,在加载spring配置文件时就会创建单实例对象。
    在这里插入图片描述在这里插入图片描述

  • prototype,多实例对象,每次调用bean时,都返回一个新的实例,每次调用getBean()时,创建多实例对象。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

xml自动装配
Spring自动装配:不使用<property> 和<constructor-arg>元素的情况下自动装配bean之间的关系。

  • bean的auto-wire属性实现,
    默认 no(不使用自动装配)
    byname 由属性名自动装配
    byType 有属性类型自动装配,但如果存在不止一个该类型的bean,则无法识别,就会报错在这里插入图片描述

IOC操作Bean管理注解方式
1.什么是注解:

  • 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
  • 使用注解,注解作用在类上,方法上,属性上面
  • 使用注解的目的:简化xml配置

2 . Spring针对Bean管理中创建对象提供注解
四个:(这四个注解功能是一样的,都可以用来创建bean实例)

  • @Component
  • @Service
  • @Controller
  • @Repository

3 .基于注解方式实现对象创建

  • 引入依赖
  • 开启组件扫描
    使用context名称空间 ,base-package属性
    如果扫描多个包,多个包可以用逗号隔开
    还可以直接扫描包上层目录
<context:component-scan base-package="扫描的包"/>  
  • 创建类,在类上边添加创建对象注释
    @Component(value="") (四个注释使用哪一个都可以)
    注释 相当于使用bean标签
    value的属性值相当于bean标签中的id值
    在注解中value值可以省略不写,默认值是类名,首字母小写

  • 开启扫描中的配置细节(组件扫描配置)
    在<context:component-scan >标签中 use-default-filters属性值设置为false,不使用默认配置filter(扫描包中所有类),自己配置filter
    context:include-filter type=“annotation”,设置扫描那些内容
    expression=“org.springframework.stereotype.Component” ,扫描只含有注释类型为Component的类
    若是context:exclude-filter,则是扫描不包括注释类型为Component的类的其他所有类
    在这里插入图片描述

基于注释方式实现属性注入

  • 1)Autowired:根据属性类型进行自动装配。可以应用到bean属性的setter方法,非setter方法,构造函数和属性
    把service 和dao层对象创建:在service和dao类添加创建对象注释。
    把service注入dao层:在service类中添加dao类型属性,在属性上面使用注释
    在这里插入图片描述
  • 2)@Qualifier:根据属性名称进行注入。该注释的使用需要和@autoWired一起使用。通过指定确切的将被连线的bean,可以用来删除混乱(当一个接口有多个实现类的话,此时如果只根据属性类型匹配,电脑不知道具体匹配哪一个属性注入,就会引起混乱,导致报错)。
    在这里插入图片描述
  • 3)@Resource:可以根据类型注入,可以根据属性名称注入 -->该注释不是Spring中的,一般不太建议使用
    直接使用是根据属性类型注入,含有value属性的是根据属性名称注入
    在这里插入图片描述
  • 4)@Value:注入普通类型属性(上边三个都是对象类型注入)在这里插入图片描述
  • 5)完全注解开发 @Comfiguration @ComponentScan(basePackages = {“包名”})
    删掉bean文件,创建配置类,替代xml文件
    编写测试类,使用的Spring接口不同
    在这里插入图片描述
    在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值