Spring笔记02

1. Spring整合连接池

1.1 Spring整合C3P0

  • 在工程中导入c3p0连接池需要的包com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

  • c3p0的硬编码方式

    @Test	//自己new对象,自己设置属性
    public void test() throws Exception {
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //设置驱动
    dataSource.setDriverClass("com.mysql.jdbc.Driver");
    //设置地址
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/hibernate");
    //设置用户名
    dataSource.setUser("root");
    //设置密码
    dataSource.setPassword("2626");
    //获取链接池连接对象
    Connection con = dataSource.getConnection();
    System.out.println(con);
    //com.mchange.v2.c3p0.impl.NewProxyConnection@26ba2a48
    }
  • Spring整合c3p0连接池

  • 配置文件

    <!-- c3p0 -->
    <bean id="C3P0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/hibernate"></property>
    <property name="user" value="root"></property>
    <property name="password" value="2626"></property>
    </bean>
  • 测试

    @Test	//Spring的IOC+DI替代以上硬编码的方式
    public void test2() throws SQLException {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    DataSource dataSource = (DataSource) context.getBean("C3P0");
    Connection con = dataSource.getConnection();
    System.out.println(con);
    //com.mchange.v2.c3p0.impl.NewProxyConnection@52aa2946
    }

1.2 Spring整合DBCP

  • 导入DBCP连接池需要的包com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar和com.springsource.org.apache.commons.pool-1.5.3.jar

  • DBCP硬编码方式

    @Test	//DBCP的硬编码方式
    public void test3() throws SQLException {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/hibernate");
    dataSource.setUsername("root");
    dataSource.setPassword("2626");
    Connection con = dataSource.getConnection();
    System.out.println(con);
    //jdbc:mysql://localhost:3306/hibernate, UserName=root@localhost, MySQL-AB JDBC Driver
    }
  • Spring整合DBCP

  • 配置文件

    <!-- DBCP -->
    <bean id="DBCP" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/hibernate"></property>
    <property name="username" value="root"></property>
    <property name="password" value="2626"></property>
    </bean>
  • 测试

    @Test
    public void test4() throws SQLException {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    DataSource dataSource = (DataSource) context.getBean("DBCP");
    Connection con = dataSource.getConnection();
    System.out.println(con);
    //jdbc:mysql://localhost:3306/hibernate, UserName=root@localhost, MySQL-AB JDBC Driver
    }

1.3 最终版

  • 最终版使用propertie配置文件,Spring加载properties文件

  • Spring提供了一个标签可以加载外部的properties文件内容

  • 导入context的名称空间和约束后,xml文件中才会有提示,这个约束在/spring-framework-4.2.4.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html中可以找到

    <?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"> <!-- bean definitions here -->
    </beans>
  • 导入约束后配置xml

    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    	<!-- DBCP -->
    <bean id="DBCP" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driver}"></property>
    <property name="url" value="${jdbc.url}"></property>
    <property name="username" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
    </bean>
  • 测试

    @Test
    public void test4() throws SQLException {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    DataSource dataSource = (DataSource) context.getBean("DBCP");
    Connection con = dataSource.getConnection();
    System.out.println(con);
    //jdbc:mysql://localhost:3306/hibernate, UserName=root@localhost, MySQL-AB JDBC Driver
    }
  • jdbc.properties配置文件可以配置不同的数据库,切换方便。

2. 基于注解的IOC配置

  • 注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置形式不一样。至于是使用xml还是注解,实际的开发过程中,每家公司有不同的习惯。

2.1 导包

  • 拷贝必备包到lib目录下。基于注解的配置中,需要加入一个aop的jar包。

2.2 配置文件

  • 基于注解的配置文件,导入约束时需要多导入一个context名称空间下的约束。约束的位置可以在约束的位置在:

    ​ ..\spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html中找到

    <?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 ">
    </beans>

2.3 开启注解扫描器

  • 在配置文件中开启注解扫描器

    <!-- 开启注解扫描器
    com.itzhouq:包含自己以及自己下面的所有子包
    -->
    <context:component-scan base-package="com.itzhouq"></context:component-scan>
  • 告知Spring框架,在读取配置文件,创建容器时,依据注解创建对象,并存入容器中

2.4 使用注解

  • 要创建UserDaoImpl对象,在类上使用@Component注解。只要定义在类上,那么注解扫描器只要一扫描到就会创建该类的实例对象,放入Spring容器中。

    package com.itzhouq.daoImpl;
    
    import org.springframework.stereotype.Component;
    
    import com.itzhouq.dao.UserDao;
    
    @Component("userDao")	//<bean id="userDao" class="com.itzhouq.daoImpl.UserDaoImpl"></bean>
    public class UserDaoImpl implements UserDao{ @Override
    public void save() {
    System.out.println("操作数据库,保存用户的数据");
    }
    }
  • 要创建的对象UserServiceImpl,在类上使用注解,在属性上使用注解

  • @value("属性值"):定义在属性字段上,针对的是基本数据类型和String类型。如果使用了这个注解,该属性的set方法可以省略不写。

  • @Autowired:定义在属性字段上,针对的是对象类型。自动按照类型注入,当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注解的对象变量名作为bean的id,在Spring容器查找,找到了也可以注入成功,找不到就报错。

  • @Qualifier("对象属性id"):定义在属性字段上。在自动按照类型注入的基础上,再按照Bean的id注入。他在给字段注入时,不能独立使用,必须和@Autowired一起使用。但是给方法参数注入时,可以独立使用。

    package com.itzhouq.serviceImpl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component; import com.itzhouq.dao.UserDao;
    import com.itzhouq.daoImpl.UserDaoImpl;
    import com.itzhouq.service.UserService; @Component("userService") //<bean id="UserService" class="com.itzhouq.serviceImpl.UserServiceImpl">
    public class UserServiceImpl implements UserService {
    @Value("要开始访问dao了") //<property name="name" value="要开始访问dao了"></property>
    private String name; //使用注解,可以不需要set方法,相当于直接赋值 @Autowired //对象类型:自动去Spring容器中找有没有该类型(UserDao)的实例对象 如果有直接赋值
    @Qualifier("userDao")
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
    } @Override
    public void save() {
    System.out.println(name);
    //调用dao
    userDao.save();
    }
    }
  • 测试

    @Test
    public void test() {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService = (UserService) context.getBean("userService");
    userService.save();
    //要开始访问dao了
    //操作数据库,保存用户的数据
    }

2.5了解的几个注解

  • @Scope("singleton") / @Scope("prototype"):定义在类上,用于指定该类是单实例还是多实例

    • 一般action/web层为多实例,service和dao层为单实例
  • @PostConstruct:定义在方法上,用于配置初始化方法
  • @PreDestroy:定义在方法上,用于配置销毁的方法

3. Spring整合JUnit

3.1 导入包

  • spring-aop-4.2.4.RELEASE.jar
  • spring-test-4.2.4.RELEASE.jar
  • junit.jar

3.2 编写测试类

package com.itzhouq.test;

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 com.itzhouq.service.UserService; //1. 告诉Spring配置文件的位置
//2. 告诉Spring谁去加载配置文件
@ContextConfiguration(value="classpath:applicationContext.xml")
@RunWith(value=SpringJUnit4ClassRunner.class)
public class SpringJunit {
@Autowired
private UserService userService; @Test
public void test() {
userService.save();
// 要开始访问dao了
// 操作数据库,保存用户的数据
}
}

3.3 注解

  • 使用@RunWith注解替换原有运行器
  • 使用@ContextConfiguration指定spring配置文件的位置
  • 使用@Autowired给测试类中的变量注入数据

Spring笔记02_注解_IOC的更多相关文章

  1. Spring笔记04_AOP注解开发_模板_事务

    目录 1. Spring基于AspectJ的注解的AOP开发 1. 1 SpringAOP的注解入门 1.2 Spring的AOP的注解通知类型 1.2.1 @Before:前置通知 1.2.2 @A ...

  2. Spring笔记13--SSH--全注解开发

    SSH全注解开发: (1) 在Action类中添加注解,实现Struts2的注解开发(@NameSpace.@ParentPackage.@Action...) package com.tongji. ...

  3. spring笔记--通过注解(annotation)配置Bean

    Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基 ...

  4. spring笔记-@Primary注解

    1.问题 当一个接口有2个不同实现时,使用@Autowired注解时会报org.springframework.beans.factory.NoUniqueBeanDefinitionExceptio ...

  5. Spring学习笔记--使用注解装配

    使用@Autowired注解 从Spring2.5开始,最有趣的一种装配Spring Bean的方式是使用注解自动装配Bean的属性.Spring默认禁用注解装配,最简单的启用方式是使用Spring的 ...

  6. Spring笔记(5) - 声明式事务@EnableTransactionManagement注解源码分析

    一.背景 前面详解了实现Spring事务的两种方式的不同实现:编程式事务和声明式事务,对于配置都使用到了xml配置,今天介绍Spring事务的注解开发,例如下面例子: 配置类:注册数据源.JDBC模板 ...

  7. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

  8. 学习笔记_J2EE_SpringMVC_03_注解配置_@RequestMapping用法

    @RequestMappingde的用法 摘要: 主要介绍注解@RequestMapping的用法 一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMappi ...

  9. Spring笔记01_下载_概述_监听器

    目录 Spring笔记01 1.Spring介绍 1.1 Spring概述 1.2 Spring好处 1.3 Spring结构体系 1.4 在项目中的架构 1.5 程序的耦合和解耦 2. Spring ...

随机推荐

  1. 分割字节流为G,MB,KB的算法

    String HumanReadableFilesize(double size) { var units = new[] { "B", "KB", " ...

  2. tensorflow-线性函数训练例子一

    import tensorflow as tfimport numpy as np #create datax_data = np.random.rand(100).astype(np.float32 ...

  3. node环境使用multer搭建一个图片接收服务器

    为了测试图片上传插件的上传功能是否好用,最近尝试搭建了一个接收图片的服务器,因为图片上传的编码格式是form-data,所以我选择使用express+multer,实现过程中发现有几个需要注意的地方, ...

  4. ASP.NET MVC 中读取项目文件的路径

    MVC中获取某一文件的路径,来进行诸如读取写入等操作. 例:我要读取的文件是新生模板.doc,它在如下位置. 获取它的全路径:string path = HttpContext.Current.Ser ...

  5. Node.js(day6)

    初始化准备工作 初始化目录 nmp init -y 安装基本的第三方插件 express npm install express --save art-template npm install art ...

  6. [SQL]LeetCode183. 从不订购的客户 | Customers Who Never Order

    Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...

  7. [Swift]LeetCode390. 消除游戏 | Elimination Game

    There is a list of sorted integers from 1 to n. Starting from left to right, remove the first number ...

  8. Linux 下源码编译FFMEG

    目录 1. 安装依赖关系 2. 源码安装 yasm 3. 源码安装 NASM 4. 源码安装libx264 5. 源码安装x265 6. 源码安装 libmp3lame 7. 源码安装 libopus ...

  9. Oracle视图(和Mysq一样l)

    本章内容: Oracle视图介绍与创建.Oracle视图的查询与修改.Oracle的复杂视图 1. Oracle视图介绍与创建 (1)了解常见的数据库对象都有哪些 (2)了解什么是视图以及为什么要使用 ...

  10. scala的break和continue

    scala 是没有 continue 的,但是包含 break,可以用 break 构造出 continue 的效果 这里用到了库: import scala.util.control.Breaks. ...