spring2

目录

◆ Spring配置数据源
◆ Spring注解开发
◆ Spring整合Junit

Spring配置数据源

◆ 数据源(连接池)的作用
    数据源(连接池)是提高程序性能如出现的事先实例化数据源,初始化部分连接资源,使用连接资源时从数据源中获取,使用完毕后将连接资源归还给数据源。
    常见的数据源(连接池) :DBCP、C3P0、BoneCP、Druid等
    
◆ 数据源的开发步骤
    ①导入数据源的坐标和数据库驱动坐标
    ②创建数据源对象
    ③设置数据源的基本连接数据
    ④使用数据源获取连接资源和归还连接资源
    
◆ C3P0代码演示
◆ Druid代码演示
◆ 抽取jdbc.properties配置文件解耦合
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/test
    jdbc.user name=root
    jdbc.password=root
    
    @Test
    //测试手动创建c3p0数据源(加载properties配置文件)
    public void test 3() throws Exception{
        //读取配置文件
        ResourceBundlerb=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();
        connection.close();
    }

◆ spring配置数据源
    ● 1)导坐标
        
            org.springframework
            spring-context
            5.0.5.RELEASE
        
        
    ● 2)创建数据源对象
        因数据源对象时导入第三方jar包,这个Dao层是jar包提供好的
        
    ● 3)设置数据源的基本连接数据(创建配置文件)
        创建XML里面的spring config配置文件,在resources目录下
        
            /property>
            
            
        
        
        @Test
        //测试Spring容器产生数据源对象
        public void test 4() throws Exception{
            ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
            DataSource dataSource=app.getBean(DataSource.class);
            Connection connection=dataSource.getConnection();
            System.out.println(connection);
            connection.close();
        }

Spring注解开发

◆ Spring原始注解
    Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
    
● 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的销毁方法
● Spring注解开发时需要配组件扫描
    注意:
        使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
    
        
◆ Spring新注解
    使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
        非自定义的Bean的配置:
        加载properties文件的配置:
        组件扫描的配置:
        引入其他文件:
注解 说明
@Configuration 用于指定当前类是一个Spring配置类,当创建容器时会从该类上加载注解
@ComponentScan 用于指定Spring在初始化容器时要扫描的包。作用和在Spring的xml配置文件中的一样
@Bean 使用在方法上, 标注将该方法的返回值存储到Spring容器中
@PropertySource 用于加载.properties文件中的配置
@Import 用于导入其他配置类

全注解开发代码演示

public static void main(String[]args) {
    //ClassPathXmlApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml") ;
    ApplicationContext app=new AnnotationConfigApplicationContext(SpringCofiguration.class);
    UserService userService=app.getBean(UserService.class);
    userService.save();
}
package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;

/**
 * 该类是一个配置类,它的作用和bean.xml是一样的
 * spring中的新注解
 * Configuration
 *     作用:指定当前类是一个配置类
 *     细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
 * ComponentScan
 *      作用:用于通过注解指定spring在创建容器时要扫描的包
 *      属性:
 *          value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
 *                 我们使用此注解就等同于在xml中配置了:
 *                      
 *  Bean
 *      作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
 *      属性:
 *          name:用于指定bean的id。当不写时,默认值是当前方法的名称
 *      细节:
 *          当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。
 *          查找的方式和Autowired注解的作用是一样的
 *  Import
 *      作用:用于导入其他的配置类
 *      属性:
 *          value:用于指定其他配置类的字节码。
 *                  当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
 *  PropertySource
 *      作用:用于指定properties文件的位置
 *      属性:
 *          value:指定文件的名称和路径。
 *                  关键字:classpath,表示类路径下
 */
//@Configuration
@ComponentScan("com.itheima")
@Import(JdbcConfig.class)
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {
}
package config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;

import javax.sql.DataSource;

/**
 * 和spring连接数据库相关的配置类
 */
public class JdbcConfig {

    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    /**
     * 用于创建一个QueryRunner对象
     * @param dataSource
     * @return
     */
    @Bean(name="runner")
    @Scope("prototype")
    public QueryRunner createQueryRunner(@Qualifier("ds2") DataSource dataSource){
        return new QueryRunner(dataSource);
    }

    /**
     * 创建数据源对象
     * @return
     */
    @Bean(name="ds2")
    public DataSource createDataSource(){
        try {
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass(driver);
            ds.setJdbcUrl(url);
            ds.setUser(username);
            ds.setPassword(password);
            return ds;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }

    @Bean(name="ds1")
    public DataSource createDataSource1(){
        try {
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass(driver);
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/eesy02");
            ds.setUser(username);
            ds.setPassword(password);
            return ds;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}
Spring整合Junit
◆ 原始Junit测试Spring的问题
    在测试类中,每个测试方法都有以下两行代码:
    ApplicationContext ac = new ClassPathxmlApplicationContext("bean.xml");
    IAccountService as = ac.get Bean("accountService", IAccount Service.class);
    这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。
◆ Spring集成Junit步骤
    ①导入spring集成Junit的坐标
        
            org.springframework
            spring-test
            5.0.5.RELEASE 
        
    ②使用@Run with注解替换原来的运行期
    ③使用@ContextConfiguration指定配置文件或配置类
    ④使用@Autowired注入需要测试的对象
    ⑤创建测试方法进行测试
代码演示:
package com.itheima.test;

import com.itheima.domain.Account;
import com.itheima.service.IAccountService;
import config.SpringConfiguration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;

/**
 * 使用Junit单元测试:测试我们的配置
 * Spring整合junit的配置
 *      1、导入spring整合junit的jar(坐标)
 *      2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的@Runwith          
 *      3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置
 *          @ContextConfiguration
 *                  locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
 *                  classes:指定注解类所在地位置
 *   当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {

    @Autowired
    private IAccountService as = null;


    @Test
    public void testFindAll() {
        //3.执行方法
        List accounts = as.findAllAccount();
        for(Account account : accounts){
            System.out.println(account);
        }
    }
}

你可能感兴趣的:(spring2)