首页 > 编程语言 > 详细

Spring01:IOC

时间:2021-05-26 15:03:20      阅读:14      评论:0      收藏:0      [点我收藏+]

Spring01 IOC

1.概述

Spring 是轻量级的开源的 JavaEE 框架

解决企业应用开发的复杂性

核心部分:IOC 和 Aop

  • IOC:控制反转,把创建对象过程交给 Spring 进行管理
  • Aop:面向切面,不修改源代码进行功能增强

Spring 特点

方便解耦,简化开发

  • Aop 编程支持
  • 方便程序测试
  • 方便和其他框架进行整合
  • 方便进行事务操作
  • 降低 API 开发难度

Spring模块

技术分享图片

2.IOC

控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理

耦合度降低

2.1 原理

xml解析 工厂模式 反射

  • 配置文件
  • 解析 String classValue = 解析得到属性
  • 工厂类中反射创建对象 Class.forName(classValue);

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

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

  • BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
    • 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
  • ApplicationContext:BeanFactory 接口的子接口,一般用于开发
    • 加载配置文件时候就会把在配置文件对象进行创建
    • ApplicationContext 接口有实现类:
      • FileSystemXmlApplicationContext 对应文件全路径
      • ClassPathXmlApplicationContext 对应类中路径

2.2 Bean管理

Spring 创建对象 + Spirng 注入属性

操作方式:

2.2.1 基于 xml

  • spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建

    • id 属性:唯一标识;class 属性:类全路径(包类路径)
    • 创建对象时,默认执行无参构造方法
  • xml 方式注入属性依赖注入DI,创建对象的注入属性

    • 使用set方法注入:类中定义set方法,并在配置文件中配置
    <!-- set 方法注入属性-->
    <bean id="user" class="com.fremont.spring.User">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
    </bean>
    
    • 有参构造注入:类中定义有参构造,配置文件
    <!--有参数构造注入属性--> 
    <bean id="orders" class="com.atguigu.spring5.Orders">
        <constructor-arg name="oname" value="电脑"></constructor-arg>
        <constructor-arg name="address" value="China"></constructor-arg>
    </bean>
    
    • p名称空间注入:简化基于 xml 配置方式

      添加 p 名称空间在配置文件中

    <bean id="book" class="com.atguigu.spring5.Book" p:bname="九阳神功" 
    p:bauthor="无名氏"></bean>
    
    • 注入其他类型属性:

    1、字面量

    <!--null 值--> 
    <property name="address">
        <null/>
    </property>
    <!--属性值包含特殊符号
     1 把<>进行转义 &lt; &gt;
     2 把带特殊符号内容写到 CDATA-->
    <property name="address">
        <value><![CDATA[<<南京>>]]></value>
    </property>
    

    2、注入属性-外部 bean

    service 调用 dao 里面的方法

    <!--service 和 dao 对象创建--> 
    <bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>
    <bean id="userService" class="com.atguigu.spring5.service.UserService">
        <!--注入 userDao 对象
    		name 属性:类里面属性名称
    		ref 属性:创建 userDao 对象 bean 标签 id 值
     	-->
     	<property name="userDao" ref="userDaoImpl"></property>
    </bean> 
    

    3、注入属性-内部 bean

    对象类型属性

    <!--外部 bean--> 
    <bean id="emp" class="com.atguigu.spring5.bean.Emp">
    	<!--设置两个普通属性-->
        <property name="ename" value="lucy"></property>
     	<property name="gender" value="女"></property>
     	<!--设置对象类型属性,内部bean-->
     	<property name="dept">
     		<bean id="dept" class="com.atguigu.spring5.bean.Dept">
     			<property name="dname" value="安保部"></property>
     		</bean>
     	</property>
    </bean>
    

    4、注入属性-级联赋值

    <!--1-级联赋值--> 
    <bean id="emp" class="com.atguigu.spring5.bean.Emp">
     	<!--设置两个普通属性-->
     	<property name="ename" value="lucy"></property>
     	<property name="gender" value="女"></property>
     	<!--级联赋值-->
     	<property name="dept" ref="dept"></property>
    </bean> 
    <bean id="dept" class="com.atguigu.spring5.bean.Dept">
     	<property name="dname" value="财务部"></property>
    </bean>
    <!--2-级联赋值-->
    <bean id="emp" class="com.atguigu.spring5.bean.Emp">
     	<!--设置两个普通属性-->
     	<property name="ename" value="lucy"></property>
     	<property name="gender" value="女"></property>
     	<!--级联赋值-->
     	<property name="dept" ref="dept"></property>
     	<property name="dept.dname" value="技术部"></property>
    </bean> 
    

    5、注入集合

    生成对应set方法

    <!--1 集合类型属性注入--> 
    <bean id="stu" class="com.atguigu.spring5.collectiontype.Stu">
     	<!--数组类型属性注入-->
     	<property name="courses">
     		<array>
     			<value>java 课程</value>
     			<value>数据库课程</value>
     		</array>
     	</property>
     	<!--list 类型属性注入-->
     	<property name="list">
     		<list>
                <value>张三</value>
     			<value>小三</value>
     		</list>
     	</property>
     	<!--map 类型属性注入-->
     	<property name="maps">
     		<map>
     			<entry key="JAVA" value="java"></entry>
    		 	<entry key="PHP" value="php"></entry>
     		</map>
     	</property>
    	 <!--set 类型属性注入-->
    	<property name="sets">
     		<set>
     			<value>MySQL</value>
     			<value>Redis</value>
     		</set>
     	</property>
    </bean>
    

    集合里面设置对象类型值

    <!--创建多个 course 对象--> 
    <bean id="course1" class="com.atguigu.spring5.collectiontype.Course">
     	<property name="cname" value="Spring5 框架"></property>
    </bean> 
    <bean id="course2" class="com.atguigu.spring5.collectiontype.Course">
     	<property name="cname" value="MyBatis 框架"></property>
    </bean>
    <!--注入 list 集合类型,值是对象--> 
    <property name="courseList">
     	<list>
     		<ref bean="course1"></ref>
     		<ref bean="course2"></ref>
     	</list>
    </property>
    

    提取集合注入部分:引入名称空间 util

    xmlns:util="http://www.springframework.org/schema/util"

    <!--1 提取 list 集合类型属性注入--> 
    <util:list id="bookList">
     	<value>易筋经</value>
     	<value>九阴真经</value>
     	<value>九阳神功</value>
    </util:list>
    <!--2 提取 list 集合类型属性注入使用--> 
    <bean id="book" class="com.atguigu.spring5.collectiontype.Book">
     	<property name="list" ref="bookList"></property>
    </bean>
    
  • 操作Bean:

    • 普通Bean:中定义 bean 类型就是返回类型

    • 工厂Bean:定义 bean 类型可以和返回类型不一样

      • 工厂 bean,实现接口 FactoryBean
      • 实现的方法中定义返回的 bean 类型
    • Bean作用域:bean 标签里面有属性(scope)用于设置单实例还是多实例

      • 默认singleton,单实例对象,加载spring配置文件时创建单实例对象
      • prototype,多实例对象,调用getBean 方法时创建多实例对象
    • Bean生命周期:从创建到销毁

      • 无参构造器创建 bean 实例
      • 调用 set 属性设置、bean 引用
      • 调用bean初始化
      • 对象获取
      • 容器关闭时调用 bean销毁方法
    • Bean 的后置处理器:初始化前后处理实例

      创建后置处理器 MyBeanPost,实现接口 BeanPostProcessor

      配置后置处理器:

      • 构造器创建 bean 实例
      • 调用 set 属性设置、bean 引用
      • bean 实例传递 bean 后置处理器postProcessBeforeInitialization
      • bean 的初始化
      • bean 实例传递 bean 后置处理器postProcessAfterInitialization
      • 对象获取
      • 容器关闭时调用 bean销毁方法
    • xml自动装配:指定装配规则

      <!--实现自动装配
       bean 标签属性 autowire,配置自动装配
       autowire 属性常用两个值:
       	byName 根据属性名称注入 ,注入值 bean 的 id 值和类属性名称一样
      	byType 根据属性类型注入
      -->
      <bean id="emp" class="com.spring5.autowire.Emp" autowire="byName"></bean> 
      <bean id="dept" class="com.spring5.autowire.Dept"></bean>
      
    • 外部属性文件

      先建立 jdbc.properties

      引入 context 名称空间

      xmlns:context="http://www.springframework.org/schema/context"

      xsi:schemaLocation中加入:

      http://www.springframework.org/schema/context

      http://www.springframework.org/schema/context/spring-context.xsd

      <!-- 配置 Druid 连接池 -->
      <!--引入外部属性文件--> 
      <context:property-placeholder location="classpath:jdbc.properties"/>
      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
      <!-- dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
      	set方法注入
      -->
      <!-- 获取properties文件内容,根据key获取,使用spring表达式获取 -->
      	<property name="driverClassName" value="${jdbc.driverclass}"></property>
      	<property name="url" value="${jdbc.url}"></property>
      	<property name="username" value="${jdbc.username}"></property>
      	<property name="password" value="${jdbc.password}"></property>
      </bean>
      

2.2.2 基于注解

注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)

注解作用在类上面,方法上面,属性上面;简化 xml 配置

  • 引入依赖:spring-aop-5.2.6.RELEASE.JAR

  • 开启组件扫描:

    <!--先添加
    xmlns:context="http://www.springframework.org/schema/context"
    在xsi:schemaLocation中添加:
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    -->
    
    <!--开启组件扫描
     1 如果扫描多个包,多个包使用逗号隔开
     2 扫描包上层目录
    -->
    
    <!--use-default-filters="false" 表示现在不使用默认 filter,自己配置 filter-->
    <context:component-scan base-package="com.atguigu,com.xxx"
    use-default-filters="false">
        
        <!--context:include-filter ,设置扫描哪些内容-->
    	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        
        <!--context:exclude-filter: 设置哪些内容不进行扫描-->
        <context:exclude-filter type="annotation" 
    expression="org.springframework.stereotype.Component"/>
        
    </context:component-scan>
    
  • 添加创建对象注解

    创建对象、创建 bean 实例提供注解 :

    @Component @Service @Controller @Repository

  • 注解方式实现属性注入

    • @Autowired:根据属性类型进行自动装配
    • @Qualifier:根据名称value值进行注入;和@Autowired 一起使用
    • @Resource:根据类型/根据名称注入 设置name值
    • @Value:注入普通类型属性 把value值注入属性
  • 完全注解开发

    创建配置类,替代 xml 配置文件

    @Configuration//作为配置类,替代 xml 配置文件
    @ComponentScan(basePackages = {"com.fremont"})
    public class SpringConfig {
    
    }
    //在测试中加载
    ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    

Spring01:IOC

原文:https://www.cnblogs.com/fremontxutheultimate/p/14801511.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!