Ioc和注解开发

news/2024/6/18 4:47:53 标签: mysql, 数据库, java, spring

文章目录

  • Ioc和注解开发
  • 1. Spring配置数据源
    • 1.1 数据源(连接池)的作用
    • 1.2 数据源的开发步骤
    • 1.3 数据源的手动创建
    • 1.4 Spring配置数据源
    • 1.5 抽取jdbc配置文件
  • 2.Spring注解开发
    • 2.1Spring原始注解
    • 2.2Spring新注解
  • 3.Spring集成Junit
    • 3.1 原始Junit测试Spring的问题
    • 3.2上述问题解决思路
    • 3.3 Spring集成Junit步骤
    • 3.4 Spring集成Junit代码实现
    • 3.5 知识要点

Ioc和注解开发

1. Spring配置数据源

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

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

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

1.2 数据源的开发步骤

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

②创建数据源对象

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

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

1.3 数据源的手动创建

①导入c3p0和druid的坐标和导入mysql数据库驱动坐标

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

②创建C3P0连接池

java">@Test
public void test1() throws Exception {
    //创建数据源
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //设置数据库连接参数
    dataSource.setDriverClass("com.mysql.jdbc.Driver");
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db1");
    dataSource.setUser("root");
    dataSource.setPassword("1234");
    //获得连接对象
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
    connection.close();
}
output: com.mchange.v2.c3p0.impl.NewProxyConnection@3b81a1bc

③创建Druid连接池

java">@Test
public void test2()throws Exception{
    //创建数据源
    DruidDataSource dataSource = new DruidDataSource();
    //设置数据库连接参数
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/db1");
    dataSource.setUsername("root");
    dataSource.setPassword("1234");
    //获取连接对象
    DruidPooledConnection connection = dataSource.getConnection();
    System.out.println(connection);
    //释放资源
    connection.close();
}

③提取jdbc.properties配置文件

jdbc.driver:com.mysql.jdbc.Driver
jdbc.url:jdbc:mysql://localhost:3306/db1
jdbc.username:root
jdbc.password:1234

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

配置

xmlns:cotext="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

 <cotext:property-placeholder location="classpath:jdbc.properties"/>
java">@Test
public void testC3P0ByProperties()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();
}
output:com.mchange.v2.c3p0.impl.NewProxyConnection@64616ca2

1.4 Spring配置数据源

可以将DataSource的创建权交由Spring容器去完成

  • DataSource有无参构造方法,而Spring默认就是通过无参构造方法实例化对象的
  • DataSource要想使用需要通过set方法设置数据库连接信息,而Spring可以通过set方法进行字符串注入
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/db1"/>
    <property name="username" value="root"/>
    <property name="password" value="1234"/>
</bean>

测试从容器中获取数据源

java">@Test
public void test4() throws Exception {
    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    DruidDataSource dataSource = app.getBean(DruidDataSource.class);
    DruidPooledConnection connection = dataSource.getConnection();
    System.out.println(connection);
    connection.close();
}
output:com.mysql.jdbc.JDBC4Connection@2893de87

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

<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

2.Spring注解开发

2.1Spring原始注解

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

文件可以简化配置,提高开发效率。

Spring原始注解主要是替代的配置

在这里插入图片描述

注意:

使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean

需要进行扫描以便识别使用注解配置的类、字段和方法。

<!-- 用来扫描注解通俗的说就是告诉Spring这些是Spring的注解-->
    <context:component-scan base-package="com.cs"/>
  • 使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化。
java">//<bean id="userDao" class="com.cs.dao.impl.UserDaoImpl"></bean>
//@Component("userDao")
@Repository("userDao")
@Scope("singleton")
//@Scope("prototype")
public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("save runnung....");
    }
}
  • 使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化

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

  • 使用@Value进行字符串的注入

  • 使用@Scope标注Bean的范围

  • 使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法

java">//<bean id="userService" class="com.cs.service.impl.UserServiceImpl">
//@Component("userService")
@Service("userService")
public class UserServiceImpl implements UserService {
    @Value("${jdbc.driver}")
    private String name;
    //  <property name="userDao" ref="userDao"></property>
//    @Autowired
//    @Qualifier("userDao")
    @Resource(name = "userDao")
    private UserDao userDao;

    @PostConstruct
    public void init(){
        System.out.println("初始化执行。。。");
    }
    @PreDestroy
    public void destory(){
        System.out.println("销毁执行。。。");
    }

    public void save() {
        System.out.println(name);
        userDao.save();
    }
}

2.2Spring新注解

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

在这里插入图片描述

在这里插入图片描述

  • @Configuration

  • @ComponentScan

  • @Import

java">//标志该类是核心配置类
@Configuration
@ComponentScan
@Import({DataSouceConfiguration.class})
public class SpringConfiguration {

}
  • @PropertySource

  • @value

  • @Bean

java">package com.cs.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.ComponentScan;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;
import java.sql.Connection;

//    <context:component-scan base-package="com.cs"/>
@ComponentScan("com.cs")
//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")
public class DataSouceConfiguration {
    @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 Exception {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        Connection connection = dataSource.getConnection();
        connection.close();
        return dataSource;
    }
}

3.Spring集成Junit

3.1 原始Junit测试Spring的问题

在测试类中,每个测试方法都有以下两行代码:

java">ApplicationContext app = newClassPathXmlApplicationContext("bean.xml");
IAccountServiceas = app.getBean("accountService",IAccountService.class);

这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。

3.2上述问题解决思路

  • 让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它

  • 将需要进行测试Bean直接在测试类中进行注入

3.3 Spring集成Junit步骤

①导入spring集成Junit的坐标

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

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

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

⑤创建测试方法进行测试

3.4 Spring集成Junit代码实现

①导入spring集成Junit的坐标

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

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

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

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

⑤创建测试方法进行测试

java">@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration("classpath:applicationContext.xml")//省略了value
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {

    @Autowired
    private UserService userService;

    @Autowired
    private DataSource dataSource;


    @Test
    public void test() throws SQLException {
        System.out.println(dataSource.getConnection());
        userService.save();
    }
}

3.5 知识要点

Spring集成Junit步骤

①导入spring集成Junit的坐标

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

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

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

⑤创建测试方法进行测试


http://www.niftyadmin.cn/n/1367836.html

相关文章

Spring MVC拦截器与异常处理机制

文章目录1. SpringMVC拦截器1.1 拦截器&#xff08;interceptor&#xff09;的作用1.2 拦截器和过滤器的区别1.3 拦截器的快速入门1.4 多拦截器操作1.5 拦截器方法说明2. SpringMVC异常处理2.1 异常处理的思路2.2 异常处理的两种方式2.3 简单的异常处理器SimpleMappingExceptin…

Result Maps collection does not contain value

今天做mybatis时碰到这个问题&#xff0c;主要是mapper配置文件中的resultType误写成resultMap了 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"user…

Error creating document instance

报错代码&#xff1a; Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 36; columnNumber: 17; 元素类型为 “configuration” 的内容必须匹配 “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapper…

Linux(一)

文章目录Linux本文内容1. 前言1.1 什么是Linux1.2 为什么要学Linux1.3 学完Linux能干什么2. Linux简介2.1 主流操作系统2.2 Linux发展历史2.3 Linux系统版本3. Linux安装3.1 安装方式介绍3.2 安装VMware3.3 安装Linux3.4 网卡设置3.5 安装SSH连接工具3.5.1 SSH连接工具介绍3.5.…

初识Nginx

文章目录4. Nginx-概述4.1 介绍4.2 下载和安装4.2.1 下载4.2.2 安装4.3 目录结构5. Nginx-命令5.1 常用命令5.2 环境变量配置6. Nginx-应用6.1 配置文件结构6.2 部署静态资源6.2.1 介绍6.2.2 测试6.3 反向代理6.3.1 概念介绍6.3.2 测试6.4 负载均衡6.4.1 概念介绍6.4.2 测试6.4…

Nacos配置、Feign、Gateway

文章目录1.Nacos配置管理统一配置管理配置自动刷新多环境配置共享Nacos集群搭建2. http客户端FeignFeign介绍定义和使用Feign客户端自定义Feign的配置Feign的性能优化Feign的最佳实践3.统一网关Gateway搭建网关服务路由断言工厂Route Predicate Factory路由过滤器 GatewayFilte…

review之并发篇

文章目录并发篇1. 线程状态2. 线程池3. wait vs sleep4. lock vs synchronized5. volatile6. 悲观锁 vs 乐观锁7. Hashtable vs ConcurrentHashMap8. ThreadLocal并发篇 1. 线程状态 要求 掌握 Java 线程六种状态掌握 Java 线程状态转换能理解五种状态与六种状态两种说法的区…

review之虚拟机篇

文章目录虚拟机篇1. JVM 内存结构2. JVM 内存参数3. JVM 垃圾回收4. 内存溢出5. 类加载6. 四种引用7. finalize虚拟机篇 1. JVM 内存结构 要求 掌握 JVM 内存结构划分尤其要知道方法区、永久代、元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代…