Spring配置数据源
1.1数据源(连接池)的作用
- 数据源是提高程序性能出现的
- 事先实例化数据源,从初始化部分连接资源
- 使用连接资源时从数据源中获取
- 使用完毕后连接资源归还给数据源
常见的数据源(连接池):DBCP、C3P0、BoneCp、Druid等
1.2数据源开发步骤
1.导入数据源的坐标和数据库驱动坐标
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</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.1.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
2.创建数据源对象
c3p0版
ComboPooledDataSource dataSource = new ComboPooledDataSource();
druid版
DruidDataSource dataSource = new DruidDataSource();
3.设计数据源的基本连接数据
//c3p0
dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://47.113.150.96/BookMarkstwo");
dataSource.setUser("root");
dataSource.setPassword("123456");
//druid
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://47.113.150.96/BookMarkstwo");
dataSource.setUsername("root");
dataSource.setPassword("123456");
4.使用数据源获取连接资源和归还连接资源
//c3p0和druid一致
Connection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
1.3抽取jdbc.properties文件
创建一个jdbc.properties
文件,用于存放数据库连接信息
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://47.113.150.96/BookMarkstwo
jdbc.username=root
jdbc.password=123456
@Test
//加载配置文件形式
public void test3() throws SQLException, PropertyVetoException {
//读取配置文件
ResourceBundle rb = ResourceBundle.getBundle("jdbc");
String driver = rb.getString("jdbc.driver");
String url = rb.getString("jdbc.url");
String username = rb.getString("jdbc.username");
String password = rb.getString("jdbc.password");
//创建数据源对象 设置连接参数
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
Connection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
}
1.4Spring配置数据源
C390版
配置文件配置
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://47.113.150.96/BookMarkstwo">
</property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>
@Test
//测试Spring容器产生数据源对象
public void test4() throws SQLException {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource = app.getBean(DataSource.class);
Connection conn = dataSource.getConnection();
System.out.println(conn);
conn.close();
}
1.5抽取jdbc配置文件
applicationContext.xml加载jdbc,.properties配置文件获取连接信息。
首先,需要引入context命名空间和约束路径
- 命名空间:
xmlns:context="http://www.springframework.org/schema/context"
- 约束路径 "
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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>
</beans>
Spring注解开发
Spring原始注解
代替xml配置,提高开发效率,注解方式set方法可以省略不写。
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层上用于实例化Bean |
@Service | 使用在service层上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Qualifier | 结合@Autowired一起使用于根据名称依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称依赖注入 |
@value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
@PostConstruct | 使用在方法上标志该方法是Bean的初始化方法 |
@PreDestroy | 使用在方法上标注该方法是Bean的销毁方法 |
使用注解开发时,需要在applicationContext中配置
在UserDaoImpl类中添加@Component("userDao")
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("save running....");
}
}
在UserServiceImpl类中添加@Component("userService")
,在内部写上
@Autowired 按照数据类型从Spring中进行匹配 @Qualifier("userDao") 是按照id值从容器中进行匹配的
@Component("userService")
public class UserServiceImpl implements UserService {
//<property name="userDao" ref="userDao"></property>
@Autowired //按照数据类型从Spring中进行匹配
@Qualifier("userDao") //是按照id值从容器中进行匹配的
//注解方式set方法可以省略不写
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
@Override
public void save() {
userDao.save();
}
}
最后在xml文件中配置组件扫描
<context:component-scan base-package="com.zy"/>
注解详解
可以把UserDaoImpl层中添加@Component("userDao")
改成@Repository("userDao")
UserServiceImpl类中添加@Component("userService")
改成@Service("userService")
UserServiceImpl类中的
@Autowired
@Qualifier("userDao")
可以改成
@Resource(name="userDao")
@Value("${jdbc.driver}")
可以读取xml中配置好的Properties中的值
@Value("${jdbc.driver}")
private String driver;
@Scope("prototype")
可以配置成多例模式
@Scope("prototype")
public class UserServiceImpl implements UserService{}
容器的初始化和销毁方法用PostConstruct
、PreDestroy
@PostConstruct
public void init(){
System.out.println("Service对象的初始化方法");
}
@PreDestroy
public void destroy(){
System.out.println("Service对象的销毁方法");
}
Spring新注解
使用上面的注解还不能全部替代xml配置文件
- 非自定义的Bean的配置:
- 加载properties文件的配置:context:property-placeholder
- 组件扫描的配置:context:component-scan
- 引入其他文件
注解 | 说明 |
---|---|
@Configuration | 用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解 |
@ComponentScan | 用于指定Spring在初始化容器时要扫描的包,作用和在Spring的xml配置文件中的<context:component-scan base-package="com.zy"/>一样 |
@Bean | 使用在方法上,标注该方法的返回值存储在Spring容器中 |
@PropetySource | 用于加载properties文件中的配置 |
@import | 用于导入其他配置类 |
在com.名字下面创建一个config.SpringConfiguration
注解配置类
//标注该类是Spring类的核心配置类
@Configuration
@ComponentScan("com.zy")
//导入其他模块
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
}
然后创建DataSourceConfiguration
注解配置类
//指定数据源文件路径
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
//Spring会将当前方法的返回值以指定名称存储到Spring容器中
@Bean("dataSource")
public DataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
Spring整合Junit
原始Junit测试Spring的问题
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml")
IAccountService as = ac.getBean("accountService",IAccountService.class)
这两行代码是获取容器,如果不写,会提示空指针。
上述问题解决思路
- 让Spring Junit负责创建Spring容器,但是需要配置文件的名称告诉它
- 将需要进行测试Bean直接在测试类中注入
Spring集成Junit步骤
①导入Spring集成Junit坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.25</version>
</dependency>
②使用@Runwith注解替换原来的运行期
@RunWith(SpringJUnit4ClassRunner.class)
③使用@ContextConfiguration指定配置文件或配置类
@ContextConfiguration("classpath:applicationContext.xml")
或者
@ContextConfiguration(classes = {SpringConfiguration.class})
④使用@Autowired注入需要测试的对象
@Autowired
private UserService userService;
⑤创建测试方法进行测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringJunitTest {
@Autowired
private UserService userService;
@Test
public void test1(){
userService.save();
}
}
Spring单元测试
首先导入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
然后在src目录创建test文件夹,在test下创建com.名字.Test
类
目录如图所示: