Spring注解开发管理第三方bean及依赖注入及Spring整合MyBatis、整合JUnit

262 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

目录

一、第三方bean管理

使用@bean配置第三方bean

使用独立的配置类管理第三方bean

方式一:导入式

方式二:扫描式

二、第三方bean依赖注入

简单类型依赖注入

引用类型依赖注入

四、XML配置比对注解配置

五、Spring整合Mybatis思路分析

MyBatis程序核心对象分析:

整合MyBatis分析:

六、Spring整合Mybatis

七、Spring整合JUnit


一、第三方bean管理

使用@bean配置第三方bean

@Configuration
public class SpringConfig {

    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("root");
        return ds;
    }
}

使用独立的配置类管理第三方bean

public class JdbcConfig {
   
    //@Bean修饰的方法,形参根据类型自动装配
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
        ds.setUsername("root");
        ds.setPassword("root");
        return ds;
    }
}

将独立的配置类加入核心配置

方式一:导入式

public class JdbcConfig {
   
    //@Bean修饰的方法,形参根据类型自动装配
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        //相关配置
        return ds;
    }
}

使用 @Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式

@Configuration
//@Import:导入配置信息
@Import({JdbcConfig.class})
public class SpringConfig {
}

将独立的配置类加入核心配置

方式二:扫描式

@Configuration
public class JdbcConfig {

    @Bean
    public DataSource dataSource(BookDao bookDao){
        DruidDataSource ds = new DruidDataSource();
        //相关配置
        return ds;
    }
}

使用 @ComponentScan注解扫描配置类所在的包,加载对应的配置类信息

@Configuration
@ComponentScan("com.itheima.config","com.itheima.service","com.itheima.dao")
public class SpringConfig {
}

不推荐使用扫描式进行管理,隐藏性太强,不利于后期管理。

二、第三方bean依赖注入

简单类型依赖注入

public class JdbcConfig {
    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/spring_db")
    private String url;
    @Value("root")
    private String userName;
    @Value("root")
    private String password;
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}

引用类型依赖注入

@Bean
public DataSource dataSource(BookService bookService){
     System.out.println(bookService);
     DruidDataSource ds = new DruidDataSource();
     //属性设置
     return ds;
}

引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象。

四、XML配置比对注解配置

功能XML配置注解
定义beanbean标签● id属性● class属性@Component● @Controller @Service● @Repository**@ComponentScan**
设置依赖注入setter注入(set方法)● 引用/简单构造器注入(构造方法)● 引用/简单自动装配@Autowired● @Qualifier@Value
配置第三方beanbean标签静态工厂、实例工厂、FactoryBean@Bean
作用范围● scope属性@Scope
生命周期标准接口● init-method● destroy-method@PostConstructor@PreDestroy

红色标注部分经常写。

 五、Spring整合Mybatis思路分析

MyBatis程序核心对象分析:

初始化SqlSessionFactory

// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml.bak");
// 3. 创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

获取连接,获取实现

// 4. 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5. 执行SqlSession对象执行查询,获取结果User
AccountDao accountDao = sqlSession.getMapper(AccountDao.class);

获取数据层接口

Account ac = accountDao.findById(2);
System.out.println(ac);

关闭连接

// 6. 释放资源
sqlSession.close();

整合MyBatis分析:

初始化属性数据

<configuration>
    <properties resource="jdbc.properties"></properties>

初始化类型别名

    <typeAliases>
        <package name="com.itheima.domain"/>
    </typeAliases>

初始化dataSource

    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>

初始化映射配置

    <mappers>
        <package name="com.itheima.dao"></package>
    </mappers>
</configuration>

六、Spring整合Mybatis

导入Spring整合Mybatis相关的坐标

    <!--spring操作数据库有关的坐标-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <!--mybatis与spring整合用的坐标-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>

SpringConfig配置类:

@Configuration
@ComponentScan("com.itheima")
//@PropertySource:加载类路径jdbc.properties文件
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}

整合MyBatis要有两个bean需要配置:

SqlSessionFactoryBean

MapperScannerConfigurer

整合MyBatis的MybatisConfig配置类:

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class MybatisConfig {
    //定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setTypeAliasesPackage("com.itheima.domain");
        ssfb.setDataSource(dataSource);
        return ssfb;
    }
    //定义bean,返回MapperScannerConfigurer对象
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.itheima.dao");
        return msc;
    }
}

整合图例:

 七、Spring整合JUnit

导入spring整合junit用的坐标

    <!--junit坐标-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!--spring整合junit用的坐标-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

AccountServiceTest测试类:

使用Spring整合Junit专用的类加载器

import com.itheima.config.SpringConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//设置类运行器
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring环境对应的配置类
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {
    //支持自动装配注入bean
    @Autowired
    private AccountService accountService;

    @Test
    public void testFindById(){
        System.out.println(accountService.findById(1));
    }

    @Test
    public void testFindAll(){
        System.out.println(accountService.findAll());
    }
}

​ ​