Spring框架学习02

Spring02

1.内容介绍

1.Spring配置数据源
2.Spring注解开发
3.Spring整合Junit

学习目标

1)能够知道数据源(连接池的作用)
2)能够完成Spring配置数据源
3)能够完成spring的IOC的注解代码
4)能够编写spring使用注解实现组件扫描
5)能够说出spring的IOC的相关注解的含义
6)能够实现spring整合Junit

2.Spring配置数据源

2.1.数据源(连接池)的作用

数据源(连接池)是提高程序性能如出现的
事先实例化数据源,初始化部分连接资源
使用连接资源时从数据源中获取
使用完毕后将连接资源归还给数据源

常见的数据源(连接池):
DBCP、C3P0、BoneCP、Druid

***以前频繁的 创建和 销毁 连接是非常的消耗服务器资源!

开发步骤
①导入数据源的坐标和数据库驱动坐标
②创建数据源对象
③设置数据源的基本连接数据
④使用数据源获取连接资源和归还连接资源

2.2.数据源的手动创建

2.2.1.导入坐标
<dependencies>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.32</version>
  </dependency>
  <dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>

</dependencies>
2.2.2.创建C3P0连接池
@Test
public void testC3P0() throws Exception {
    //创建数据源
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //设置数据库连接参数
    dataSource.setDriverClass("com.mysql.jdbc.Driver");                                     
	dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
    dataSource.setUser("root");
    dataSource.setPassword("root");
    //获得连接对象
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
}
2.2.3.创建Druid连接池
@Test
public void testDruid() throws Exception {
    //创建数据源
    DruidDataSource dataSource = new DruidDataSource();
    //设置数据库连接参数
    dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
    dataSource.setUrl("jdbc:mysql://localhost:3306/test");   
    dataSource.setUsername("root");
    dataSource.setPassword("root");
    //获得连接对象
    Connection connection = dataSource.getConnection();    
    System.out.println(connection);
}
2.2.4.抽取jdbc.properties配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
2.2.5.读取jdbc.properties配置文件创建连接池
@Test
public void testC3P0ByProperties() throws Exception {
    //加载类路径下的jdbc.properties
    ResourceBundle rb = ResourceBundle.getBundle("jdbc");
    ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
    dataSource.setDriverClass(rb.getString("jdbc.driver"));   
    dataSource.setJdbcUrl(rb.getString("jdbc.url")); 
    dataSource.setUser(rb.getString("jdbc.username")); 
    dataSource.setPassword(rb.getString("jdbc.password"));
    Connection connection = dataSource.getConnection();   
    System.out.println(connection);
}

目前所存在的问题:

在这里插入图片描述

2.3.Spring配置数据源

可以将DataSource的创建权交由Spring容器去完成

*DataSource有无参构造方法,而Spring默认就是通过无参构造方法实例化对象的
*DataSource要想使用需要通过set方法设置数据库连接信息,而Spring可以通过set方法进行字符串注入

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>
</bean>

测试从容器当中获取数据源

@Test
//测试Spring容器产生数据源对象
public void test4() throws Exception {
    ApplicationContext applicationContext = new    ClassPathXmlApplicationContext("applicationContext.xml");
    DataSource dataSource = (DataSource)  applicationContext.getBean("dataSource");
    Connection connection = dataSource.getConnection();
System.out.println(connection);
}

**两种数据源配置的区别:
在这里插入图片描述

2.4.抽取jdbc配置文件

applicationContext.xml加载jdbc.properties配置文件获得连接信息。
首先,需要引入context命名空间和约束路径:

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!--加载外部的properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"></property>
    <property name="jdbcUrl" value="${jdbc.url}"></property>
    <property name="user" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
</bean>

2.5.知识要点

Spring整合数据源连接池的思路
在这里插入图片描述

Spring容器加载properties文件
在这里插入图片描述

3.Spring注解开发

开启注解扫描
要想使用注解,必须在applicationContext.xml中添加一段配置开启注解扫描

<!--配置注解扫描,扫描指定包下的注解-->
<context:component-scan base-package="com.itheima"></context:component-scan>

注意: 如果要使用注解,需要导入context名称空间 ;

快速入门代码

在这里插入图片描述

3.1.Spring原始注解

Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率!
所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。

Spring原始注解主要是替代<Bean>的配置

注解 说明

@Component使用在类上用于实例化Bean
@Controller使用在web层类上用于实例化Bean
@Service使用在service层类上用于实例化Bean
@Repository使用在dao层类上用于实例化Bean
@Autowired使用在字段上用于根据类型依赖注入
@Qualifier结合@Autowired一起使用用于根据名称进行依赖注入
@Resource相当于@Autowired+@Qualifier,按照名称进行注入
@Value注入普通属性
@Scope标注Bean的作用范围
@PostConstruct使用在方法上标注该方法是Bean的初始化方法
@PreDestroy使用在方法上标注该方法是Bean的销毁方法
1)原始注解分类:
1.用于创建对象:作用和xml配置中的标签的作用是一样的 – ioc

@Component
@Controller
@Service
@Repository
作用: 使我们的三层架构的对象,更加清晰, 使开发更规范,符合三层架构!

2.用于注入数据:作用和xml配置中的标签中的标签作用一样

注解放在成员变量上;
@Autowired – 自动按照类型注入;(如果有多个同类型,那么将按照变量名来搜寻)
@Qualifier — 经常结合@Autowired, 增强@Autowired,注入对象的名称与对象做映射,变量名可以任意取;
@Resource – @Resource = @Autowired + @Qualifier ; 注意:@Resource要求jdk8
----------------------上面三个 引用数据类型赋值;
@Value – 用于给属性赋值; – 用于基本数据类型 + string ;

在这里插入图片描述

3.用于改变作用范围:作用和xml配置中的标签的scope属性的作用一样

@Scope – 注解放在类上;单例 多例

4.生命周期相关 (了解):作用和xml配置中的标签的init-method和destroy-method属性的作用是一样的

@PostConstruct – 注解放在方法上;初始化对象时执行
@PreDestroy – 注解放在方法上;对象销毁时执行
;

3.2.Spring新注解(目前了解)

使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:

非自定义的Bean的配置:
加载properties文件的配置:context:property-placeholder
组件扫描的配置:context:component-scan
引入其他文件:

注解说明
@Configuration用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan用于指定 Spring 在初始化容器时要扫描的包 ,作用和在 Spring 的 xml 配置文件中的 <context:component-scan base-package=“com.itheima”/>一样
@Bean使用在方法上,标注将该方法的返回值存储到 Spring 容器中
@PropertySource用于加载.properties 文件中的配置
@Import用于导入其他配置类
3.2.1. @Configuration注解

作用:
用于指定当前类是一个spring配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration注解的类.class)。它的作用和bean.xml是一样的。当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
就是指定当前类作为一个配置类,在创建容器时作为参数传入! (就是替代applicationContext.xml)

属性:
value:用于指定配置类的字节码

3.2.2. @ComponentScan注解

作用:
用于指定spring在初始化容器时要扫描的包。作用和在spring的xml配置文件中的: <context:component-scan base-package="com.itheima"/>是一样的。
属性:
basePackages:用于指定要扫描的包。和该注解中的value属性作用一样。
@ComponentScan(“com.itheima”) 或者 @ComponentScan(basePackages = “com.itheima”)
相当于替代:

3.2.3. @Bean注解

@Bean:用于把当前方法的返回值作为bean对象存入spring的ioc容器中,他的name属性用于指定bean的id。当不写时,默认值是当前方法的名称

@bean 和 @component 区别是什么?
@bean注解 — 写在方法上, 方法的返回值存入spring容器;
@component – 写在类上, 给当前类创建对象,存入spring容器中!

3.2.4. @Import注解 (了解即可)

@Import用于导入其他的配置类

3.2.5. @PropertySource注解(了解)

作用:
@PropertySource用于加载.properties文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到properties配置文件中,就可以使用此注解指定properties配置文件的位置。
属性:
value[]:用于指定properties文件位置。如果是在类路径下,需要写上classpath

**spring开发的配置:

1.纯xml: – bean的管理 + 数据的注入 + 数据源配置; 都要写配置文件, 随着项目的推进, dao/service配置会越来越多;

2.半注解+ 半xml: — 数据源使用xml; bean的管理交给注解,数据的注入交给注解; — 最简化的方式

3.纯注解: — 虽然没有xml了, 但是程序员需要写的代码,实际上变多了, 多写了一些配置类!

4.Spring整合Junit (理解)

4.1.原始Junit测试Spring的问题

在测试类中,每个测试方法都有以下两行代码:
在这里插入图片描述
这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。

4.2.上述问题解决思路

让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它
将需要进行测试Bean直接在测试类中进行注入

4.3.Spring集成Junit步骤

①导入spring集成Junit的坐标
②使用@Runwith注解替换原来的运行期
③使用@ContextConfiguration指定配置文件或配置类
④使用@Autowired注入需要测试的对象
⑤创建测试方法进行测试

4.4.Spring集成Junit代码实现

①导入spring集成Junit的坐标

<!--此处需要注意的是,spring5 及以上版本要求 junit 的版本必须是 4.12 及以上-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

②使用@Runwith注解替换原来的运行期
在这里插入图片描述

**注意:

  1. 如果使用注解配置, @ContextConfiguration 应该指定配置类的字节码 — 全注解
    @ContextConfiguration(classes = SpringConfig.class)

  2. 如果使用配置文件,@ContextConfiguration 应该指定配置文件的位置 xml方式
    @ContextConfiguration(locations = “classpath:beans.xml”)

*使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上 (建议junit的4.12 和 spring的5.0.x匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值