• 第七章 Spring依赖注入(注解方式)与整合MyBatis


    1.Spring注解方式

            不需要在spring配置文件中定义bean标签,而是直接在需要spring管理的对象类型上加一个特定注解。

    @Component(通用注解)

    @Service(业务层注解)

    @Reository(数据访问层)

    @Controller(控制层)

     

             查看代码可以看到,就是给通用注解 @Component 起别名。

    1.1 spring的注解使用

    ①代码里面的特殊标记,使用注解可以完成特定功能;

    ②注解写法 @注解名(属性名 = 属性值)

    ③注解可以使用在类上面,方法上面和属性上面;

    ④使用注解时,对象属性可以没有setter。 

    1.2 spring注解需要的包

    spring-beans

    spring-context

    spring-core

    spring-aop 

     

             早些版本可能需要单独导入 spring-aop 。

    1.3 注解使用过程

     ①导包,创建类;

    ②spring配置文件,引入约束(使用相应的标签会自动引入);

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

     ③配置注解扫描,一般写父级包名:

    1. <context:component-scan base-package="com.entity">
    2. context:component-scan>

    1.4 创建对象的注解

            四个注解功能是一样的,只是为了让注解类本身的用途清晰。

    1.5 创建对象特殊限制

    @Scope(value = "singleton")  单例

    @Scope(value = "prototype") 多例

    @Lazy(value = false) 懒加载

    @PostConstruct 初始化函数

    @PreDestory 销毁函数

     1.6 注入属性的注解

    1.6.1 @Autowired

            自动注入,根据类型(不是定义的变量名) 查找对应类型的对象;

            当自动注入bean时,先根据类型去匹配,匹配到多个类型时,再按照属性名取匹配;如果匹配不到,则查看是否配置( required = true),如果没有配置或者配置的是true,就代表必须注入,就抛出异常。

    1. @Autowired(required = false)
    2. public Hobby hobby;

    代码中的 Hobby 是一个抽象类,且没有被继承,如果没有配置(required = false),则会报异常:

            No qualifying bean of type 'com.entity.Hobby' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

     1.6.2 @Qualifier(value = "对象名")

            用于 @AutoWired 自动装配时,如果有多个同类型对象,则需要用改注解指定注入 Bean的名称。

    1.6.3 @Resource(name = "对象名")

            使用对象名做依据进行注入,name属性是在类上的注解配置的名字,再按类型进行注入。

    @Resource 相当于 @Autowired 也是用来进行自动化注入的;

    @Resource 是 Java 自带的,@Autowired 是 spring 写好的。

    1. @Resource(name = "cat",type = Department.class)
    2. public Department department;
    1. @Component("department")
    2. public class Cat extends Pet{
    3. @Override
    4. public void show() {
    5. System.out.println("一只猫!");
    6. }
    7. }
    8. @Component("cat")
    9. public class Department {
    10. @Value("开发")
    11. private String name;
    12. @Override
    13. public String toString() {
    14. return "Department{" +
    15. "name='" + name + '\'' +
    16. '}';
    17. }

    @Resource的匹配顺序:

    ①没有属性设置时(@Resource),会按照  变量名 (department) 去匹配,此时会匹配到 Cat,但是类型错误,抛出异常;

    ②设置了name 属性(@Resource(name = "cat")),此时会按照 name 属性(cat)去匹配,可以匹配到 Department , 不会抛异常;

    ③ 设置了 name 和 type 属性(上述代码所示),如果 name 属性匹配到 bean(id 是唯一的,如 Cat 设置了 department 其他的就不能设置了) 但是类型不正确,会直接报错;如果 name 没有匹配上,会接着按照 变量名 department 去匹配,如果匹配不上才会按照类型 type 去匹配;

    ④ 只设置了 type 属性,相当于是 name 属性没有匹配上,会先按照 department 即变量名去匹配,如果此时匹配到了 Cat 会直接报错,匹配不上才会按照 type 去匹配。

    1.6.4 @Value("值") 

            给属性设置值。

    1.6.5 测试

    1. @Component("xx")
    2. @Scope(value = "prototype")
    3. @Lazy(value = false)
    4. public class Driver {
    5. @Value("张三")
    6. private String name;
    7. @Autowired
    8. private Car car;
    9. @Autowired
    10. @Qualifier(value = "dog")
    11. public Pet pet;
    12. @Autowired(required = false)
    13. public Hobby hobby;
    14. @Resource(type = Department.class)
    15. public Department q;
    16. @Override
    17. public String toString() {
    18. return "Driver{" +
    19. "name='" + name + '\'' +
    20. ", car=" + car +
    21. ", pet=" + pet +
    22. ", hobby=" + hobby +
    23. ", department=" + q +
    24. '}';
    25. }
    26. }
    1. public abstract class Pet {
    2. protected String name;
    3. public void show(){
    4. }
    5. }
    6. @Component
    7. public class Cat extends Pet{
    8. @Override
    9. public void show() {
    10. System.out.println("一只猫!");
    11. }
    12. }
    13. @Component
    14. public class Dog extends Pet{
    15. @Override
    16. public void show() {
    17. System.out.println("一只狗");
    18. }
    19. }
    1. public abstract class Hobby {
    2. }
    1. @Component
    2. public class Car {
    3. @Value("五菱")
    4. private String name;
    5. @Value("30")
    6. private Integer price;
    7. @Override
    8. public String toString() {
    9. return "Car{" +
    10. "name='" + name + '\'' +
    11. ", price=" + price +
    12. '}';
    13. }
    14. }
    1. ApplicationContext ac = new ClassPathXmlApplicationContext("spring-1.xml");
    2. Driver driver = ac.getBean("xx", Driver.class);
    3. System.out.println(driver);
    4. driver.pet.show();

    2. Spring整合MyBatis

            pom.xml 文件引入依赖:

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>com.wengroupId>
    7. <artifactId>spring-mybatisartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <properties>
    10. <maven.compiler.source>8maven.compiler.source>
    11. <maven.compiler.target>8maven.compiler.target>
    12. <spring.version>5.3.14spring.version>
    13. <commons-dbcp.version>1.4commons-dbcp.version>
    14. <mybatis.version>3.4.6mybatis.version>
    15. <mybatis-spring.version>1.3.3mybatis-spring.version>
    16. <mysql-connector-java.version>8.0.11mysql-connector-java.version>
    17. properties>
    18. <dependencies>
    19. <dependency>
    20. <groupId>org.springframeworkgroupId>
    21. <artifactId>spring-contextartifactId>
    22. <version>${spring.version}version>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframeworkgroupId>
    26. <artifactId>spring-jdbcartifactId>
    27. <version>${spring.version}version>
    28. dependency>
    29. <dependency>
    30. <groupId>commons-dbcpgroupId>
    31. <artifactId>commons-dbcpartifactId>
    32. <version>${commons-dbcp.version}version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.mybatisgroupId>
    36. <artifactId>mybatisartifactId>
    37. <version>${mybatis.version}version>
    38. dependency>
    39. <dependency>
    40. <groupId>mysqlgroupId>
    41. <artifactId>mysql-connector-javaartifactId>
    42. <version>${mysql-connector-java.version}version>
    43. dependency>
    44. <dependency>
    45. <groupId>org.mybatisgroupId>
    46. <artifactId>mybatis-springartifactId>
    47. <version>${mybatis-spring.version}version>
    48. dependency>
    49. <dependency>
    50. <groupId>com.github.pagehelpergroupId>
    51. <artifactId>pagehelperartifactId>
    52. <version>5.3.0version>
    53. dependency>
    54. <dependency>
    55. <groupId>com.github.abel533groupId>
    56. <artifactId>mapperartifactId>
    57. <version>3.0.1version>
    58. dependency>
    59. dependencies>
    60. project>

            使用spring整合mybatis主要是通过spring管理mybatis的一下内容:

    ①数据库连接池配置;

    ②SqlSessionFactory对象;

    ③Mapper接口配置;

    ④插件配置也可以放到spring配置中。

     spring配置:

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. 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">
    6. <context:property-placeholder location="db.properties"/>
    7. <bean id = "ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    8. <property name="driverClassName" value="${jdbc.driver}"/>
    9. <property name="url" value="${jdbc.url}"/>
    10. <property name="username" value="${jdbc.userName}"/>
    11. <property name="password" value="${jdbc.password}"/>
    12. bean>
    13. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    14. <property name="dataSource" ref="ds"/>
    15. <property name="typeAliasesPackage" value="com.entity"/>
    16. <property name="configLocation" value="classpath:Mybatis-config.xml"/>
    17. <property name="mapperLocations" value="classpath:com/mapper/GoodsMapper.xml"/>
    18. bean>
    19. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    20. <property name="basePackage" value="com.mapper"/>
    21. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    22. bean>
    23. beans>

    mybatis配置文件:

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <settings>
    7. <setting name="logImpl" value="STDOUT_LOGGING"/>
    8. <setting name="mapUnderscoreToCamelCase" value="true"/>
    9. <setting name="cacheEnabled" value="true"/>
    10. <setting name="lazyLoadingEnabled" value="false"/>
    11. <setting name="aggressiveLazyLoading" value="false"/>
    12. settings>
    13. <plugins>
    14. <plugin interceptor="com.github.pagehelper.PageInterceptor">
    15. <property name="offsetAsPageNum" value="true"/>
    16. <property name="rowBoundsWithCount" value="true"/>
    17. <property name="reasonable" value="true"/>
    18. plugin>
    19. <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
    20. <property name="mappers" value="com.github.abel533.mapper.Mapper"/>
    21. plugin>
    22. plugins>
    23. configuration>

    测试:

    1. ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
    2. ac.getBean(GoodsMapper.class).goodsList().forEach(System.out::println);

  • 相关阅读:
    OSI网络模型与TCP/IP协议
    mybatis-plus报错:Invalid bound statement (not found)
    【Linux】自制shell
    【RocketMQ生产者发送消息的三种方式:发送同步消息、异步消息、单向消息&案例实战&详细学习流程】
    Class ZipArchive not found,安装zip扩展
    《算法设计与分析》教学上机实验报告
    缓存技术(缓存穿透,缓存雪崩,缓存击穿)
    CSS之标准流(普通流)、浮动以及清除浮动的方法
    RecId
    2022-2028全球及中国弹簧测试系统行业研究及十四五规划分析报告
  • 原文地址:https://blog.csdn.net/m0_71674778/article/details/126465497