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整合数据源连接池的思路
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注解替换原来的运行期
**注意:
-
如果使用注解配置,
@ContextConfiguration
应该指定配置类的字节码 — 全注解
@ContextConfiguration(classes = SpringConfig.class) -
如果使用配置文件,
@ContextConfiguration
应该指定配置文件的位置 xml方式
@ContextConfiguration(locations = “classpath:beans.xml”)
*使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上 (建议junit的4.12 和 spring的5.0.x匹配。