Spring_01快速入门、IoC控制反转、DI依赖注入、Mybatis整合

本文介绍了Spring框架的基础知识,包括Spring的作用、体系结构和核心特性IoC(控制反转)与DI(依赖注入)。通过实例详细讲解了bean的配置,如scope、init_method、destroy_method等属性的使用,并探讨了依赖注入的set和构造器注入方式。此外,还阐述了如何配置第三方bean以及Spring与Mybatis的整合步骤。
摘要由CSDN通过智能技术生成

Spring_01_快速入门、IoC控制反转、DI依赖注入、Mybatis整合

什么是Spring

是分层的JavaSE/EE应用full-stack轻量级开源框架

框架作用:
  • 提高开发效率
  • 增强可重用性
  • 提供编写规范
  • 节约维护成本
  • 解耦底层实现原理
体系结构
  • 底层是核心容器Core Container
  • 中间层技术
  • 应用层技术Data Access/Integration 、Web

在这里插入图片描述

IoC控制反转-Inverse of Control
  • Spring控制的资源全部放置在Spring容器中,该容器称为IoC容器

  • 它不是一个技术,而是一种思想。其作用是用于降低代码间的耦合。它的实现思想就是利用了工厂设计模式,把创建对象代码从具体类中剥离出去,交由工厂来完成,从而降低代码间的依赖关系。高内聚低耦合

  • 耦合(Coupling):代码书写过程中所使用技术的结合紧密度,用于衡量软件中各个模块之间的互联程度

  • 内聚(Cohesion):代码书写过程中单个模块内部各组成部分间的联系,用于衡量软件中各个功能模块内部的功能联系

入门案例
  • 步骤

    1.导入spring坐标
    2.编写service层接口与实现类
    3.创建spring配置文件
    4.配置Spring控制资源
    5.通过spring获取资源
    
  • 代码

pom.xml

<dependency> 
    <groupId>org.springframework</groupId> 		 		
    <artifactId>spring-context</artifactId> 											<version>5.1.9.RELEASE</version>
</dependency>

service层接口

public interface UserService{
  	void function();
  }

service层实现类

public class UserService implements UserService{
    public void function(){
        system.out.println("UserService is running...");
    }
}

spring配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       					 		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 									   https://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 创建spring控制资源-->
    <bean id="userService" class="com.service.UserServiceImpl">
    </bean>
</beans>

创建测试类,获取资源

public static void main(String[] args) {
	//2.加载配置文件
	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	//3.获取资源
	UserService userService = (UserService) ctx.getBean("userService");
	userService.function();
}
IoC配置
  • bean标签:定义spring中的资源,受此标签定义的资源将受到spring控制

  • scope属性:定义bean的作用范围

  • init_method,destroy-method属性:定义bean对象在初始化或销毁时完成的工作

  • factory-bean属性:定义bean对象的创建方式,使用静态工厂的形式创建,兼容早期遗留系统的升级工作

  • factory-bean,factory-method属性:定义bean对象的创建方式,使用实例工厂的形式创建,兼容早期遗留系统的升级工作

  • p属性:命名空间简化属性书写方式

      <bean
            id="userService"
            class="com.service.impl.UserServiceImpl"
            p:userDao-ref="userDao"
            p:bookDao-ref="bookDao"
            />
    
  • import标签:在当前配置文件中导入其他配置文件中的项

    <import resource="地址"/>
    
DI(Dependency Injection)依赖注入

定义:应用程序运行依赖的资源由Spring提供,资源进入应用程序的方式称为注入

两种方式:set注入和构造器注入

  • set注入

    property标签:使用set方法的形式为bean提供资源

    name属性:对应bean中的属性名,该属性需提供可访问的set方法

    value属性:设定非引用类型属性对应的值

    ref属性:蛇形引用类型属性对应bean的id,不能与value同时使用

    type属性:设定构造方法参数的类型,按类型匹配参数或进行类型校验

    index属性:设定构造方法参数的位置,用于按位置匹配参数,index值从0开始计数

  • 构造器注入

    constructor-arg标签:使用构造方法的形式为bean提供资源,兼容早期遗留系统的升级工作

    name属性:对应bean中的构造方法的参数名

    value:设定非引用类型构造方法参数对应的值

    ref:设定引用类型构造方法参数对应的值

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
        <!-- 导入外部properti文件 -->
        <context:property-placeholder location="classpath:data.properties"/>
        <bean id="test" class="com.domain.TestDataProps">
            <property name="username" value="${spring.username}"/>
            <property name="password" value="${pwd}"/>
        </bean>
        <!-- 1.创建spring控制的资源 id是唯一标识(可随意取值,与getBean的参数一致),name定义别名(定义多个用逗号分开),class是要控制的接口实现类-->
        <bean id="userService" name="user1,user2" class="com.service.impl.UserServiceImpl"/>
        <!-- scope用于控制bean创建后的对象是否是单例的 默认是单例singleton  prototype非单例
        单例:饿汉式
        双例:使用类时加载-->
        <!--当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次-->
        <!--当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行-->
        <bean id="userService2" scope="prototype" class="com.service.impl.UserServiceImpl"/>
        <!-- 当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次
        当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建
        时均执行一次
        -->
        <bean id="ceshi"
              scope="prototype"
              class="com.service.impl.UserServiceImpl"
              init-method="init"
              destroy-method="destroy"
        />
        <!-- 静态工厂调用方法-->
        <bean id="userService3" class="com.factory.UserServiceFactory" factory-method="getService1"/>
    
        <!-- 实例工厂调用方法-->
        <bean id="factoryBean" class="com.ifactory.UserServiceFactory"/>
        <bean id="userService4" factory-bean="factoryBean" factory-method="getService2"/>
    
        <!-- set注入 -->
        <bean id="helloworld" class="com.service.servlet">
            <property name="name" value="ojbk"/>
            <property name="us" ref="userService"/>
        </bean>
        
        <!-- 使用构造器注入 -->
        <bean id="stu" class="com.domain.Student">
            <constructor-arg name="age" value="21"/>
            <constructor-arg name="name" value="gg"/>
        </bean>
    
    </beans>
    

    集合数据类型注入

    <bean id="userService" class="com.service.impl.UserServiceImpl">
            <property name="userDao" ref="userDao"/>
            <property name="bookDao" ref="bookDao"/>
        </bean>
    
        <bean id="bookDao" class="com.dao.impl.BookDaoImpl">
            <!-- list -->
            <property name="al">
                <list>
                    <value>ssss</value>
                    <value>66666</value>
                </list>
            </property>
            <!-- props -->
            <property name="properties">
                <props>
                    <prop key="name">aaa</prop>
                    <prop key="value">666666</prop>
                </props>
            </property>
            <!-- array -->
            <property name="arr">
                <array>
                    <value>123456</value>
                    <value>66666</value>
                </array>
            </property>
            <!-- set -->
            <property name="hs">
                <set>
                    <value>abs</value>
                    <value>66666</value>
                </set>
            </property>
            <!-- map -->
            <property name="hm">
                <map>
                    <entry key="name" value="abx"/>
                    <entry key="value" value="6666666666"/>
                </map>
            </property>
        </bean>
    
SqEl表达式

为bean注入属性值,如:#{10},#{baenId}

value=“EL表达式",所有属性值不区分是否引用类型,统一使用value赋值

第三方bean的配置方式
<!--加载druid资源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc://localhost:3306/spring_db"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <!--配置service作为spring的bean,注入dao-->
    <bean id="accountService" class="com.service.impl.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
    </bean>

    <!--spring整合mybatis后控制的创建连接用的对象-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.domain"/>
    </bean>

    <!--加载mybatis映射配置的扫描,将其作为spring的bean进行管理-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.dao"/>
    </bean>
Mybatis整合

坐标导入pom.xml

 <dependencies>
     <!-- Mybatis坐标 -->
     <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.3</version>
    </dependency>
     <!-- MySQL坐标 -->
     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.47</version>
     </dependency>
     <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis-spring</artifactId>
         <version>1.3.0</version>
     </dependency>
     <!-- Spring坐标 -->
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>5.1.9.RELEASE</version>
     </dependency>
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jdbc</artifactId>
         <version>5.1.9.RELEASE</version>
     </dependency>
     <!-- Druid坐标 -->
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid</artifactId>
         <version>1.1.16</version>
     </dependency>

</dependencies>

properties配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db
jdbc.username=root
jdbc.password=root

Spring配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!--加载perperties配置文件的信息-->
    <context:property-placeholder location="classpath:*.properties"/>

    <!--加载druid资源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--配置service作为spring的bean,注入dao-->
    <bean id="accountService" class="com.service.impl.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"/>
    </bean>

    <!--spring整合mybatis后控制的创建连接用的对象-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.domain"/>
    </bean>

    <!--加载mybatis映射配置的扫描,将其作为spring的bean进行管理-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.dao"/>
    </bean>



</beans>

AccountDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.AccountDao">

    <!--配置根据id查询-->
    <select id="findById" resultType="account" parameterType="int">
        select * from account where id = #{id}
    </select>

    <!--配置查询所有-->
    <select id="findAll" resultType="account">
        select * from account
    </select>

    <!--配置保存-->
    <insert id="save" parameterType="account">
        insert into account(name,money)values(#{name},#{money})
    </insert>

    <!--配置删除-->
    <delete id="delete" parameterType="int">
        delete from account where id = #{id}
    </delete>

    <!--配置更新-->
    <update id="update" parameterType="account">
        update account set name=#{name},money=#{money} where id=#{id}
    </update>
</mapper>

AcountDao

package com.dao;

import com.domain.Account;

import java.util.List;

public interface AccountDao {

    void save(Account account);

    void delete(Integer id);

    void update(Account account);

    List<Account> findAll();

    Account findById(Integer id);
}

Account

package com.domain;

import java.io.Serializable;

public class Account implements Serializable {

    private Integer id;
    private String name;
    private Double money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

AccountService

package com.service;

import com.domain.Account;

import java.util.List;

public interface AccountService {

    void save(Account account);

    void delete(Integer id);

    void update(Account account);

    List<Account> findAll();

    Account findById(Integer id);

}

AccountServiceImpl

package com.service.impl;


import com.dao.AccountDao;
import com.domain.Account;
import com.service.AccountService;

import java.util.List;

public class AccountServiceImpl implements AccountService {

    private AccountDao accountDao;

    public void setAccountDao(AccountDao accountDao) {
        this.accountDao = accountDao;
    }

    public void save(Account account) {
        accountDao.save(account);
    }

    public void update(Account account){
        accountDao.update(account);
    }

    public void delete(Integer id) {
        accountDao.delete(id);
    }

    public Account findById(Integer id) {
        return accountDao.findById(id);
    }

    public List<Account> findAll() {
        return accountDao.findAll();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值