1.Spring配置数据源
1.1 数据源(连接池)的作用
首先先来复习数据源(连接池)
- 数据源(连接池)是提高程序性能如出现的
- 事先实例化数据源,初始化部分连接资源
- 使用连接资源时从数据源中获取
- 使用完毕后将连接资源归还给数据源
常见的数据源(连接池):DBCP、C3P0、BoneCP、Druid等
1.2 数据源的开发步骤
① 导入数据源的坐标和数据库驱动坐标
② 创建数据源对象
③ 设置数据源的基本连接数据
④ 使用数据源获取连接资源和归还连接资源
1.3 Spring配置数据源
可以将DataSource的创建权交由Spring来完成。
1.4 抽取jdbc配置文件
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<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.Spring注解开发
2.1 Spring原始注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
Spring原始注解主要是替代<Bean>
的配置
/*
* <bean id="UserService" class="service.Impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
* */
对比上面这一段原本在applicationContext.xml中配置的
@Component("userService") 行使了<bean></bean>的功能
@Autowired和@Qualifier("userDao")共同行使了<property></property>把userDao注入userService的功能
//@Component("userService")
@Service("userService")
public class UserServiceImpl implements UserService {
// @Autowired //按照数据类型从Spring容器中进行匹配的
// @Qualifier("userDao") //是按照id值从容器中进行匹配,但是注意此处@Qualifier要结合@Autowired一起使用
@Resource(name = "userDao") //Resource相当于@Qualifier + @Autowired
private UserDao userDao;
/* 如果使用注解开发方式,set方法可以不写 public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}*/
public void save() {
userDao.save();
}
}
注意:
使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
如果不在applicationContext.xml中配置这段话,会出现NoSuchBeanDefinitionException
<!--注解的组件扫描-->
<context:component-scan base-package="com.rarity"></context:component-scan>
2.2 Spring新注解
使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
非自定义的Bean的配置:<bean>
加载properties文件的配置:<context:property-placeholder>
组件扫描的配置:<context:component-scan>
引入其他文件:<import>
3.Spring集成Junit
3.1 原始Junit测试Spring的问题
在测试类中,每个测试方法都有以下两行代码:
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = ac.getBean("accountService",IAccountService.class);
当然,在我们学过全注解开发后,这两行代码已经变成了
ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);
这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。
3.2 上述问题解决思路
- 让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它
- 将需要进行测试Bean直接在测试类中进行注入
3.3 Spring集成Junit步骤
① 导入spring集成Junit的坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.4</version>
</dependency>
② 使用@Runwith注解替换原来的运行期
③ 使用@ContextConfiguration指定配置文件或配置类
④ 使用@Autowired注入需要测试的对象
⑤ 创建测试方法进行测试
@RunWith(SpringJUnit4ClassRunner.class)
我在使用classpath:applicationContext.xml也许是因为我的xml文件配置有问题,导致一直运行不出来,但是换了全注解开发的第二种就可以用了。
//@ContextConfiguration("classpath:applicationContext.xml")
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
@Autowired
private UserService userService;
@Autowired
private DataSource dataSource;
@Test
public void test1() throws SQLException {
userService.save();
System.out.println(dataSource.getConnection());
}
}