Spring (2)—配置数据源、注解开发、集成Junit和web环境

22 篇文章 0 订阅

目录

一、Spring配置数据源

1.1 数据源(连接池)的作用

1.2 数据源的开发步骤

1.3 数据源的手动创建

1.4 Spring配置数据源

1.5 抽取jdbc配置文件

二、Spring注解开发

2.1 Spring原始注解

2.2 Spring新注解

三、Spring集成Junit

3.1 原始Junit测试Spring的问题

3.2 Spring集成Junit步骤

3.3 代码实现

四、Spring集成web环境

4.1 ApplicationContext应用上下文获取方式

4.2 Spring提供获取应用上下文的工具

4.3 代码实现


一、Spring配置数据源

1.1 数据源(连接池)的作用

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

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

1.2 数据源的开发步骤

①导入数据源的坐标和数据库驱动坐标

②创建数据源对象

③设置数据源的基本连接数据

④使用数据源获取连接资源和归还连接资源

1.3 数据源的手动创建

①导入C3P0和Druid的坐标以及导入mysql数据库驱动坐标

        <!-- C3P0连接池 -->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

②创建C3P0连接池和Druid连接池

    @Test
    //测试手动创建C3P0数据源
    public void test1() throws Exception {
        //创建数据源
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //设置数据库连接参数
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db01");
        dataSource.setUser("root");
        dataSource.setPassword("XXXXX");
        //获得连接对象
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }

    @Test
    //测试手动创建druid数据源
    public void test2() throws Exception {
        //创建数据源
        DruidDataSource dataSource = new DruidDataSource();
        //设置数据库连接参数
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/db01");
        dataSource.setUsername("root");
        dataSource.setPassword("XXXXX");
        //获得连接对象
        DruidPooledConnection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }

③提取jdbc.properties配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db01
jdbc.username=root
jdbc.password=XXXXX

④ 读取jdbc.properties配置文件创建连接池

    @Test
    //测试手动创建c3p0数据源(加载配置文件形式)
    public void test3() throws Exception {
        //加载类路径下的jdbc.properties
        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 connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }

1.4 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/db01"/>
        <property name="user" value="root"/>
        <property name="password" value="XXXXX"/>
    </bean>

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

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

②Spring容器加载外部的properties文件

<context:property-placeholder location="xx.properties"/>
<property name="" value="${key}"/>
<?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: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/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--加载外部的properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--抽取jdbc配置文件-->
    <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>

二、Spring注解开发

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

2.1 Spring原始注解

  • Spring原始注解主要是替代的配置
注解说明
@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.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法
<!--注解的组件扫描-->
<context:component-scan base-package="com.learn"></context:component-scan>
  • 使用案例

(1)使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化

//@Component("userDao")
@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("save running... ...");
    }
}

(2)使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化

         使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入

//@Component("userService")
@Service("userService")
public class UserServiceImpl implements UserService {
    //@Autowired //按照数据类型从Spring容器中进行匹配(从Spring容器中找一个UserDao的Bean然后注入到userDao里)
    //@Qualifier("userDao") //按照id值从Spring容器中进行匹配的,但是主要此处@Qualifier结合@Autowired一起使用
    @Resource(name="userDao") //相当于@Qualifier + @Autowired
    private UserDao userDao;
    @Override
    public void save() {
    userDao.save();
    }
}

(3)使用@Value进行字符串的注入

@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Value("注入普通数据")
    private String str;
    @Value("${jdbc.driver}")
    private String driver;
    @Override
    public void save() {
        System.out.println(str);
        System.out.println(driver);
        System.out.println("save running... ...");
    }
}

(4)使用@Scope标注Bean的范围

//@Scope("prototype")
@Scope("singleton")
public class UserDaoImpl implements UserDao {
    //此处省略代码
}

(5)使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法

@PostConstruct
public void init(){
    System.out.println("初始化方法....");
}
@PreDestroy
public void destroy(){
    System.out.println("销毁方法.....");
}

2.2 Spring新注解

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

  • 非自定义的Bean的配置:<bean>
  • 加载properties文件的配置:<context:property-placeholder>
  • 组件扫描的配置:<context:component-scan>
  • 引入其他文件:<import>
注解说明
@Configuration用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan

用于指定 Spring 在初始化容器时要扫描的包。

作用和在 Spring 的 xml 配置文件中的

<context:component-san base-package="com.learn"/>一样

@Bean使用在方法上,标注将该方法的返回值存储到 Spring 容器中
@PropertySource用于加载.properties 文件中的配置
@Import用于导入其他配置类
  • 使用案例

(1)@PropertySource

         @value

@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;

(2)@Bean

@Bean(name="dataSource") //Spring会将当前方法的返回值以指定名称存储到Spring容器中
public DataSource getDataSource() throws PropertyVetoException {
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setDriverClass(driver);
    dataSource.setJdbcUrl(url);
    dataSource.setUser(username);
    dataSource.setPassword(password);
    return dataSource;
}

(3)测试加载核心配置类创建Spring容器

@Test
public void testAnnoConfiguration() throws Exception {
    ApplicationContext applicationContext = new 
    AnnotationConfigApplicationContext(SpringConfiguration.class);
    UserService userService = (UserService) applicationContext.getBean("userService");
    userService.save();
    DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
}
  • 完整代码,如下:

①总配置

package com.learn.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.sun.javafx.beans.IDProperty;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;


@Configuration //标志该类是Spring的核心配置类

//<context:component-scan base-package="com.learn"/>
@ComponentScan("com.learn")

//<import resource=""/>
@Import({DataSourceConfiguration.class})

public class SpringConfiguration {

}

②分配置

package com.learn.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;


//<context:property-placeholder location="classpath:jdbc.properties"/>
@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;

    @Bean("dataSource") //Spring会将当前方法的返回值以指定名称存储到Spring容器中
    public DataSource getDataSource() throws PropertyVetoException {
        //创建数据源
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //设置数据库连接参数
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}

③测试类

package com.learn.web;

import com.learn.config.SpringConfiguration;
import com.learn.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 咕咕猫
 * @version 1.0
 */
public class UserController {
    public static void main(String[] args) {
        ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        UserService userService = app.getBean(UserService.class);
        userService.save();
    }
}

三、Spring集成Junit

3.1 原始Junit测试Spring的问题

解决思路

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

3.2 Spring集成Junit步骤

①导入Spring集成Junit的坐标

②使用@Runwith注解替换原来的运行器

③使用@ContextConfiguration指定配置文件或配置类

④使用@Autowired注入需要测试的对象

⑤创建测试方法进行测试

3.3 代码实现

①导入Spring集成Junit的坐标

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

②使用@Runwith注解替换原来的运行器

@RunWith(SpringJUnit4ClassRunner.class)
public class SpringJunitTest {
}

③使用@ContextConfiguration指定配置文件或配置类

@RunWith(SpringJUnit4ClassRunner.class)

//加载spring核心配置文件
//@ContextConfiguration(value = {"classpath:applicationContext.xml"})

//加载spring核心配置类
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
}

④使用@Autowired注入需要测试的对象

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
    @Autowired
    private UserService userService;
}

⑤创建测试方法进行测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
    @Autowired
    private UserService userService;
    @Test
    public void testUserService(){
        userService.save();
    }
}

四、Spring集成web环境

4.1 ApplicationContext应用上下文获取方式

        应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) ,这样的弊端是配置文件加载多次,应用上下文对象创建多次。

        在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。

4.2 Spring提供获取应用上下文的工具

        Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。

  • Spring集成web环境步骤

① 在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标)

② 使用WebApplicationContextUtils获得应用上下文对象ApplicationContext

4.3 代码实现

(1)导入Spring集成web的坐标

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>

(2)配置ContextLoaderListener监听器

    <!--全局初始化参数-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!--配置监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

(3)通过工具获得应用上下文对象

        ServletContext servletContext = this.getServletContext();
        WebApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        UserService userService = app.getBean("id");
        userService.save();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值