第七章 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

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

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

    </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,就代表必须注入,就抛出异常。

    @Autowired(required = false)
    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 写好的。

    @Resource(name = "cat",type = Department.class)
    public Department department;
@Component("department")
public class Cat extends Pet{
    @Override
    public void show() {
        System.out.println("一只猫!");
    }
}

@Component("cat")
public class Department {
    @Value("开发")
    private String name;

    @Override
    public String toString() {
        return "Department{" +
                "name='" + name + '\'' +
                '}';
    }

@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 测试

@Component("xx")
@Scope(value = "prototype")
@Lazy(value = false)
public class Driver {
    @Value("张三")
    private String name;

    @Autowired
    private Car car;

    @Autowired
    @Qualifier(value = "dog")
    public Pet pet;

    @Autowired(required = false)
    public Hobby hobby;

    @Resource(type = Department.class)
    public Department q;

    @Override
    public String toString() {
        return "Driver{" +
                "name='" + name + '\'' +
                ", car=" + car +
                ", pet=" + pet +
                ", hobby=" + hobby +
                ", department=" + q +
                '}';
    }
}
public abstract class Pet {
    protected String name;
    public void show(){
    }
}

@Component
public class Cat extends Pet{
    @Override
    public void show() {
        System.out.println("一只猫!");
    }
}

@Component
public class Dog extends Pet{
    @Override
    public void show() {
        System.out.println("一只狗");
    }
}
public abstract class Hobby {
}
@Component
public class Car {
    @Value("五菱")
    private String name;
    @Value("30")
    private Integer price;

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring-1.xml");
        Driver driver = ac.getBean("xx", Driver.class);
        System.out.println(driver);
        driver.pet.show();

2. Spring整合MyBatis

        pom.xml 文件引入依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wen</groupId>
    <artifactId>spring-mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring.version>5.3.14</spring.version>
        <commons-dbcp.version>1.4</commons-dbcp.version>
        <mybatis.version>3.4.6</mybatis.version>
        <mybatis-spring.version>1.3.3</mybatis-spring.version>
        <mysql-connector-java.version>8.0.11</mysql-connector-java.version>
    </properties>
    <dependencies>
        <!--引入spring基础模块-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- dbcp 连接池-->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>${commons-dbcp.version}</version>
        </dependency>
        <!-- mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!-- mysql驱动类 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java.version}</version>
        </dependency>
        <!--mybatis spring 整合-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring.version}</version>
        </dependency>
        <!-- mybatis分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.0</version>
        </dependency>
        <!--mybatis通用mapper插件-->
        <dependency>
            <groupId>com.github.abel533</groupId>
            <artifactId>mapper</artifactId>
            <version>3.0.1</version>
        </dependency>
    </dependencies>
</project>

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

①数据库连接池配置;

②SqlSessionFactory对象;

③Mapper接口配置;

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

 spring配置:

<?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">

    <!--引用数据库配置文件-->
    <context:property-placeholder location="db.properties"/>
    <!--配置数据库连接池-->
    <bean id = "ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <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>
    <!--定义bean来创建MyBatis的SqlSessionFactory对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--配置数据库连接池-->
        <property name="dataSource" ref="ds"/>
        <!--配置数据实体别名-->
        <property name="typeAliasesPackage" value="com.entity"/>
        <!--配置MyBatis主文件路径-->
        <property name="configLocation" value="classpath:Mybatis-config.xml"/>
        <!--配置mapper文件路径-->
        <property name="mapperLocations" value="classpath:com/mapper/GoodsMapper.xml"/>
    </bean>

    <!--配置mapper接口扫描-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
</beans>

mybatis配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--<setting name="logImpl" value="LOG4J"/>-->
        <!--下划线转小驼峰-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
        <!--配置懒加载-->
        <setting name="lazyLoadingEnabled" value="false"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="offsetAsPageNum" value="true"/>
            <!--配置数据库方言 4.0版本以后不用写-->
            <!--<property name="helperDialect" value="mysql"/>-->
            <!--是否做count查询-->
            <property name="rowBoundsWithCount" value="true"/>
            <!--合理化分页-->
            <property name="reasonable" value="true"/>
        </plugin>

        <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
            <!--主键自增回写方法,默认值MYSQL -->
            <!--<property name="IDENTITY" value="MYSQL" />-->
            <!--通用Mapper默认接口,我们定义的Mapper需要实现该接口 -->
            <property name="mappers" value="com.github.abel533.mapper.Mapper"/>
        </plugin>
        <!--<plugin interceptor="com.interceptor.MyPageInterceptor">
            <property name="start" value="1"/>
            <property name="end" value="3"/>
        </plugin>-->
    </plugins>

</configuration>

测试:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值