Spring框架的IoC

1.什么是Spring

  • Spring是分层的Java SE/EE应用 full-stack(全栈)轻量级开源框架,以IoC(Inversion of Controll控制反转,用于解耦)和AOP(Aspect oriented Programming,面向切面编程,本质是动态代理,不修改源码的情况下进行功能增强)为内核

2.IoC和AOP两大核心思想

  • IoC:Inversion of Control,控制反转。是指 把创建对象的控制权交给框架:要想得到一个对象,由原来的主动创建对象,变成自己被动接收 框架创建的对象。
  • 作用:用于降低程序间的耦合性

3.入门Spring

  1. 准备环境(创建maven项目,导入依赖)在这里插入图片描述

  2. 创建目录结构(以数据库Account表为例)
    在这里插入图片描述

  3. 创建Spring核心配置文件(命名随意,通常applicationContext.xml)
    在这里插入图片描述

  4. 编写各个类(查询表中所有数据为例)
    体现IOC的核心思想,不再以new生成对象,可以避免编译期依赖,通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    图中涉及到的QueryRunner对象封装了jdbc的代码,开发dao层代码的简单框架。与JdbcTemplate功能相似。需要导入依赖
    在这里插入图片描述
    使用方法:

    1. 创建DBUtils的核心类QueryRunner对象
      - 构造方法:QueryRunner(DataSource ds)
    2. 使用QueryRunner的方法操作数据库,常用方法有
      - 执行DML语句:update(sql, params),返回int表示影响行数
      - 执行DQL语句:query(sql, ResultSetHandler rh,params)
      • 返回值由ResultHandler的实现类对象决定
        - BeanHandler:返回一个JavaBean对象
        - BeanListHandler:返回一个JavaBean集合
        - ScalarHandler:返回一个值
  5. 编写测试类
    在这里插入图片描述

  • 3.1从Spring容器里得到bean对象,

    ApplicationContext的实现类:
    1. ClassPathXmlApplicationContext
      - 是从类加载路径里,加载xml配置文件的
      - 什么是类加载路径:代码编译之后的那个classes文件夹
      - 开发中可以认为Maven项目的:Java文件夹、resources文件夹,都是类加载路径
    2. AnnotationConfigApplicationContext
      - 用注解配置Spring时,通过此类加载配置类创建Spring容器,它用于读取类上的注解配置
ApplicationContext app = new ClassPathXmlApplicationContext("核心配置文件名.xml"); 
ApplicationContext app = new AnnotationConfigApplicationContext(核心配置类.class);
  • getBean()方法
    ApplicationContext提供了多种getBean方法的重载,常用的如下:
    在这里插入图片描述
Object bean = app.getBean("唯一标识");//需要强转
对应类型 对象名= app.getBean("唯一标识", javabean.class类型)//无需强转
  1. 编写核心配置文件
    在这里插入图片描述
  • 3.2 bean标签的基本配置(一个bean标签称为一个statement)

    • 基本属性: id:唯一标识、class:bean的全限定类名
      通过对应的bean标签对应的id获取对应的对象
  • 3.3 bean的三种实例化方式

  1. 无参构造方法实例化:让Spring调用bean的无参构造,生成bean实例对象
    <bean id="accountDao" class="com.Xxxx.dao.impl.AccountDaoImpl"></bean>

  2. 工厂静态方法实例化:让Spring调用一个工厂类的静态方法,得到一个bean实例对象,假设在com.Xxxx包下创建factory(工厂包),创建一个StaticFactory工厂类

public class StaticFactory{
    public static AccountDao createAccountDao(){
        return new AccountDaoImpl();
    }
}

核心配置文件:

<bean id="accountDao" class="com.Xxxx.factory.StaticFactory" 
      factory-method="createAccountDao"></bean>
  1. 工厂非静态方法实例化:让Spring调用一个工厂的非静态方法,得到一个bean实例对象,假设在com.Xxxx包下创建factory(工厂包),创建一个InstanceFactory工厂类
<!-- 先配置工厂 -->
<bean id="instanceFactory" class="com.Xxxx.factory.InstanceFactory"></bean>

<!-- 再配置AccountDao -->
<bean id="accountDao" factory-bean="instanceFactory" factory-method="createAccountDao"></bean>
  • 3.4 三种(DI)依赖注入方式(相当给变量赋值)

  1. set方法注入在类中提供需要注入的成员的set方法,在配置文件中注入属性的值
<bean id="" class="">
	<property name="属性名" value="属性值"></property>
    <property name="属性名" ref="bean的id"></property>
</bean>
  • property标签:用在bean标签内部,表示要给某一属性注入数据
    • name:属性名称
    • value:要注入的属性值,注入简单类型值
    • ref:要注入的属性值,注入其它bean对象
  1. 构造方法注入在类中提供构造方法,通过构造方法给成员变量注入值
<bean id="" class="">
	<constructor-arg name="构造参数名称" value="构造参数的值"></constructor-arg>
    <constructor-arg name="构造参数名称" ref="bean的id"></constructor-arg>
</bean>
  • name:构造参数的名称
  • value:要注入的值,注入简单类型值
  • ref:要注入的值,注入其它bean对象
  1. p名称空间注入(本质仍然是set方法,不作介绍)
  • 3.5 读取jdbc.properties文件

在这里插入图片描述

  • 准备一个properties文件放在resources里:jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver //驱动
jdbc.url=jdbc:mysql:///spring //数据库名
jdbc.username=root //数据库账号
jdbc.password=root //数据库密码
  • 使用<context:property-placeholder location="classpath:jdbc.properties"/>需要导入Context命名空间在这里插入图片描述
<beans
       xmlns:名称空间="http://www.springframework.org/schema/名称空间"
       xsi:scehmaLocation="
          http://www.springframework.org/schema/名称空间
         http://www.springframework.org/schema/名称空间/spring-名称空间.xsd">
</beans>
  • 读取jdbc.properties中的文件使用${配置文件中的key获取对应的值}
    在这里插入图片描述

  • 3.6 分模块提供配置文件

在大型项目开发中,如果把所有的配置都写在一个配置文件applicationContext.xml中,会导致:

  • 配置文件过于臃肿
  • 不利于分模块开发,不利于模块之间的解耦

Spring提供了分模块配置的方式,即:每个模块提供一个配置文件,在核心配置文件中引入模块配置:

<import resource="applicationContext-xx.xml"/>
<import resource="applicationContext-yy.xml"/>
  • 将负责数据库的配置放入applicationContext.xml文件中
    在这里插入图片描述
  • 操作导入
    在这里插入图片描述
    在这里插入图片描述

4.基于注解的IoC(原始注解,重点)

在这里插入图片描述
在这里插入图片描述

  • 以上例环境为例,进行注解开发

  • 编写类

    • 在这里插入图片描述
    • 在这里插入图片描述
  • @Component:类级别的一个注解,用于声明一个bean,使用不多

  • value属性:bean的唯一标识。如果不配置,默认以首字母小写的变量名为id

  • @Controller, @Service, @Repository,作用和@Component完全一样,但更加的语义化,使用更多

  • @Controller:用于web层的bean

  • @Service:用于Service层的bean

  • @Reposiroty:用于dao层的bean


  • @Autowired用于注入bean对象(byType注入)
  • 按依赖类型,从Spring容器中查找要注入的bean对象
    • 如果找到一个,直接注入
    • 如果找到多个,则以变量名为id,查找bean对象并注入
    • 如果找不到,抛异常
  • @Qualifier:是按id注入,但必须和@Autowired配合使用

绝大多数情况下,只要使用@Autowired注解注入即可

注解注入时,不需要set方法了

在这里插入图片描述

  • 核心配置文件

    • 在这里插入图片描述
      在这里插入图片描述
  • 运行测试

    在这里插入图片描述

5.纯注解开发IoC(新注解)

5.1.注解介绍

在这里插入图片描述

  • @Configuration把一个Java类声明为核心配置类
    • 加上Java类上,这个Java类就成为了Spring的核心配置类,用于代替applicationContext.xml
  • 是@Component的衍生注解,所以:核心配置类也是bean,里边可以注入依赖
  • @ComponentScan配置组件注解扫描
    • basePackages属性:指定扫描的基本包
  • @PropertySource用于加载properties文件
    • value属性:指定propertis文件的路径,从类加载路径里加载
    • @Import用于导入其它配置类
    • Spring允许提供多个配置类(模块化配置),在核心配置类里加载其它配置类
    • 相当于xml中的标签
  • @Value:注入简单类型值,例如:基本数据类型和String

  • @Bean注解方法级别的注解
  • 用于把方法返回值声明成为一个bean,作用相当于 < bean >标签
  • 可以用在任意bean对象的方法中,但是通常用在@Configuration标记的核心配置类中
  • @Bean注解的属性
    • value属性:bean的id。如果不设置,那么方法名就是bean的id
      在这里插入图片描述
  • @Bean的依赖注入
    • @Bean注解的方法可以有任意参数,这些参数即是bean所需要的依赖
      在这里插入图片描述

5.2.配置核心类代码

在这里插入图片描述

5.3.测试代码

Spring整合Junit

  • 作用:在单元测试类里,就可以使用Spring的注解,注入依赖。不需要再自己创建容器获取对象
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 使用步骤
1. 在pom.xml文件中增加依赖:spring-test 和 junit
2. 修改单元测试类
   1. 在单元测试类上增加注解:@RunWith(SpringJunit4ClassRunner.class)
      目的:使用Spring的单元测试运行器,替换Junit原生的运行器
   2. 在单元测试类上增加注解:@ContextConfiguration()
      目的:指定配置文件或配置类

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值