1.项目结构

2.基于xml配置的项目

<1>账户的业务层接口及其实现类

IAccountService.java

package lucky.service;

import lucky.domain.Account;

import java.util.List;

/**
* 账户的业务层接口
*/
public interface IAccountService {
/**
* 查询所有
* @return
*/
List<Account> queryAllAccount(); /**
* 查询一个
* @return
*/
Account queryAccountById(Integer accountId); /**
* 保存账户
* @param account
*/
void saveAccount(Account account); /**
* 更新账户信息
* @param account
*/
void updateAccount(Account account); /**
* 删除用户
* @param accountId
*/
void deleteAccount(Integer accountId);
}

AccountServiceImpl.java

package lucky.service.impl;

import lucky.dao.IAccountDao;
import lucky.domain.Account;
import lucky.service.IAccountService; import java.util.List; public class AccountServiceImpl implements IAccountService { private IAccountDao accountDao; public void setAccountDao(IAccountDao accountDao) {
this.accountDao = accountDao;
} public List<Account> queryAllAccount() {
return accountDao.queryAllAccount();
} public Account queryAccountById(Integer accountId) {
return accountDao.queryAccountById(accountId);
} public void saveAccount(Account account) {
accountDao.saveAccount(account);
} public void updateAccount(Account account) {
accountDao.updateAccount(account);
} public void deleteAccount(Integer accountId) {
accountDao.deleteAccount(accountId);
}
}

<2>账户的持久层接口及其实现类

IAccountDao.java

package lucky.dao;

import lucky.domain.Account;
import java.util.List; /**
* 账户的持久层接口
*/
public interface IAccountDao {
/**
* 查询所有
* @return
*/
List<Account> queryAllAccount(); /**
* 查询一个
* @return
*/
Account queryAccountById(Integer accountId); /**
* 保存账户
* @param account
*/
void saveAccount(Account account); /**
* 更新账户信息
* @param account
*/
void updateAccount(Account account); /**
* 删除用户
* @param accountId
*/
void deleteAccount(Integer accountId);
}

IAccountDaoImpl.java

package lucky.dao.impl;

import lucky.dao.IAccountDao;
import lucky.domain.Account;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler; import java.sql.SQLException;
import java.util.List; /**
* 账户的持久层实现类
*/
public class IAccountDaoImpl implements IAccountDao { private QueryRunner runner; public void setRunner(QueryRunner runner) {
this.runner = runner;
} public List<Account> queryAllAccount() {
try {
return runner.query("select * from account",new BeanListHandler<Account>(Account.class));
} catch (SQLException e) {
throw new RuntimeException(e);
}
} public Account queryAccountById(Integer accountId) {
try {
return runner.query("select * from account where id=?",new BeanHandler<Account>(Account.class),accountId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
} public void saveAccount(Account account) {
try {
runner.update("insert into account(name,money)values(?,?)",account.getName(),account.getMoney());
} catch (SQLException e) {
throw new RuntimeException(e);
}
} public void updateAccount(Account account) {
try {
runner.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
} catch (SQLException e) {
throw new RuntimeException(e);
}
} public void deleteAccount(Integer accountId) {
try {
runner.update("delete from account where id=?",accountId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

<3>数据库表account对应的Account.java

package lucky.domain;

import java.io.Serializable;

public class Account implements Serializable {
private Integer id;
private String name;
private Float money; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Float getMoney() {
return money;
} public void setMoney(Float money) {
this.money = money;
} @Override
public String toString() {
return "Account{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}

<4>bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!-- 配置Service -->
<!--创建AccountServiceImpl这个类的bean对象-->
<bean id="accountService" class="lucky.service.impl.AccountServiceImpl">
<!-- 使用set方法,注入dao -->
<property name="accountDao" ref="accountDao"></property>
</bean> <!--配置Dao对象-->
<bean id="accountDao" class="lucky.dao.impl.IAccountDaoImpl">
<!-- 使用set方法,注入QueryRunner -->
<property name="runner" ref="runner"></property>
</bean> <!--配置QueryRunner-->
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
<!--使用构造函数注入,注入数据源-->
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean> <!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--连接数据库的必备信息-->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring"></property>
<property name="user" value="root"></property>
<property name="password" value="plj824"></property>
</bean>
</beans>

<5>测试类

import lucky.domain.Account;
import lucky.service.IAccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; public class AccountServiceTest {
@Test
public void testQueryAllAccount(){
//1.获取容器
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2.得到业务层对象
IAccountService as= (IAccountService) ac.getBean("accountService");
//3.执行方法
List<Account> accounts = as.queryAllAccount();
for (Account account : accounts) {
System.out.println(account);
}
} @Test
public void testQueryAccountById(){
//1.获取容器
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2.得到业务层对象
IAccountService as= (IAccountService) ac.getBean("accountService");
//3.执行方法
Account account1 = as.queryAccountById(1);
System.out.println(account1);
} @Test
public void testSaveAccount(){
//1.获取容器
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2.得到业务层对象
IAccountService as= (IAccountService) ac.getBean("accountService");
//3.执行方法
Account account=new Account();
account.setName("lucky");
account.setMoney(1000f);
as.saveAccount(account); } @Test
public void testUpdateAccount(){
//1.获取容器
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2.得到业务层对象
IAccountService as= (IAccountService) ac.getBean("accountService");
//3.执行方法
Account account1 = as.queryAccountById(1);
account1.setMoney(2000f);
as.updateAccount(account1);
} @Test
public void testDeleteAccount(){
//1.获取容器
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
//2.得到业务层对象
IAccountService as= (IAccountService) ac.getBean("accountService");
//3.执行方法
as.deleteAccount(4);
}
}

效果图:

数据库表:

testQueryAllAccount()测试输出:

testQueryAccountById()

2.基于部分注解配置的项目(一定程度上还是要使用xml配置,自己写的类用注解,jar包的类用xml配置)

<1>修改IAccountDaoImpl.java

package lucky.dao.impl;

import lucky.dao.IAccountDao;
import lucky.domain.Account;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import java.sql.SQLException;
import java.util.List; /**
* 账户的持久层实现类
*/
@Repository("accountDao")
public class IAccountDaoImpl implements IAccountDao {
@Autowired
private QueryRunner runner; public List<Account> queryAllAccount() {
try {
return runner.query("select * from account",new BeanListHandler<Account>(Account.class));
} catch (SQLException e) {
throw new RuntimeException(e);
}
} public Account queryAccountById(Integer accountId) {
try {
return runner.query("select * from account where id=?",new BeanHandler<Account>(Account.class),accountId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
} public void saveAccount(Account account) {
try {
runner.update("insert into account(name,money)values(?,?)",account.getName(),account.getMoney());
} catch (SQLException e) {
throw new RuntimeException(e);
}
} public void updateAccount(Account account) {
try {
runner.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
} catch (SQLException e) {
throw new RuntimeException(e);
}
} public void deleteAccount(Integer accountId) {
try {
runner.update("delete from account where id=?",accountId);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

<2>AccountServiceImpl.java

package lucky.service.impl;

import lucky.dao.IAccountDao;
import lucky.domain.Account;
import lucky.service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.List; @Service("accountService")
public class AccountServiceImpl implements IAccountService { @Autowired
private IAccountDao accountDao; public List<Account> queryAllAccount() {
return accountDao.queryAllAccount();
} public Account queryAccountById(Integer accountId) {
return accountDao.queryAccountById(accountId);
} public void saveAccount(Account account) {
accountDao.saveAccount(account);
} public void updateAccount(Account account) {
accountDao.updateAccount(account);
} public void deleteAccount(Integer accountId) {
accountDao.deleteAccount(accountId);
}
}

<3>修改bean.xml

<?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"> <!--告知spring在创建容器是要扫描的包-->
<context:component-scan base-package="lucky"></context:component-scan> <!--配置QueryRunner-->
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
<!--使用构造函数注入,注入数据源-->
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean> <!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--连接数据库的必备信息-->
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring"></property>
<property name="user" value="root"></property>
<property name="password" value="plj824"></property>
</bean>
</beans>

3.基于纯注解配置的项目

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

<1>项目结构

<2>在java包下创建名为config的包

SpringConfiguration.java为主配置类

package config;

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

JdbcConfig.java

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/mybatis");
ds.setUser(username);
ds.setPassword(password);
return ds;
}catch (Exception e){
throw new RuntimeException(e);
}
}
}

jdbcConfig.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=plj824

此时,没有bean.xml文件了。

10 Spring框架--基于注解和xml的配置的应用案例的更多相关文章

  1. 10 Spring框架--基于注解的IOC配置

    1.工程环境搭建 2.基于注解的IOC配置 IOC注解的分类 (1)用于创建对象的 他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的@Component: 作用: ...

  2. SpringMVC4 + Spring + MyBatis3 基于注解的最简配置

    本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建. 1. web.xml 我们知道springmvc是基于Servlet: Dispatc ...

  3. Spring中基于注解的IOC(二):案例与总结

    2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...

  4. Spring框架——基于XML/注解开发

    IoC的实现方式有两种:XML配置文件.基于注解. MVC开发模式: Controller层 Service层 Repository层 Controller层调用Service,Service调用Re ...

  5. Spring基于注解和XML混合方式的使用

    首先要明白,基于注解和XML两种方式的实现功能是一样的,只是两种不同的配置方式. 一.IoC配置 1.配置xml 在使用注解与xml结合的方式配置IoC之前,首先要引入context标签: xmlns ...

  6. spring mvc 基于注解的使用总结

    本文转自http://blog.csdn.net/lufeng20/article/details/7598801 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sprin ...

  7. Spring:基于注解的Spring MVC

    什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...

  8. Spring+MyBatis纯注解零XML整合(4)

    不得不说,利用XML作为配置文件是一个非常好的想法,它可以轻松地实现配置集中化,而且修改之后无需再次编译.然而,由于大多数情况下开发者基本都会拿到程序的源码,加之对于各种XML配置文件一般情况下也只有 ...

  9. 10.Spring——框架的AOP

    1.Spring 框架的 AOP 2.Spring 中基于 AOP 的 XML架构 3.Spring 中基于 AOP 的 @AspectJ 1.Spring 框架的 AOP Spring 框架的一个关 ...

随机推荐

  1. linux ssh tunnel

    ssh -qTfnN -D 7070 ape@192.168.1.35

  2. 2019-2020-1 20199302《Linux内核原理与分析》第八周作业

    一.上课学习笔记 1.shell作用:①运行程序 ②重定向(输入/输出重定向) ③可编程(写脚本) 执行一个c程序时,如果切进另一个进程,会进入该进程而切不回原进程,所以需要为调用的进程创一个子进程. ...

  3. WinDbg常用命令系列---.effmach

    .effmach (Effective Machine) .effmach命令显示或更改调试器使用的处理器模式. .effmach [MachineType] 参数: MachineType指定调试器 ...

  4. Python面向对象 -- slots, @property、多重继承MixIn、定制类(str, iter, getitem, getattr, call, callable函数,可调用对象)、元类(type, metaclass)

    面向对象设计中最基础的3个概念:数据封装.继承和多态 动态给class增加功能 正常情况下,当定义了一个class,然后创建了一个class的实例后,可以在程序运行的过程中给该实例绑定任何属性和方法, ...

  5. 牛顿插值法(c++)【转载】

    摘自<c++和面向对象数值计算>,代码简洁明快,采用模板函数,通用性增强,牛顿差分合理利用存储空间,采用Horner算法(又称秦九韶算法)提高精度,减少时间复杂度,高!确实是高!对其中代码 ...

  6. Maven中使用<version>LATEST</version>自动依赖最新版本引发的问题

    今天在打包项目的过程中出现了编译问题,奇怪的是这个项目已经好久没有修改过了,报错如下. 找不到符号 [ERROR] 符号: 方法 intent(java.lang.String) [ERROR] 位置 ...

  7. CS224n学习笔记(二)

    Global Vectors for Word Representation (GloVe) GloVe 模型包含一个训练在单词-单词的共同出现次数上的加权的最小二乘模型. 什么是Co-occurre ...

  8. .net core facebook 容易进的一个坑

    Microsoft.AspNetCore.Authentication.Facebook 库 services.AddAuthentication(CookieAuthenticationDefaul ...

  9. 【转】使用fastboot命令刷机流程详解

    一.Fastboot是什么? 1.1 首先介绍Recovery模式(卡刷) 在系统进行定制时,编译系统会编译出一份ZIP的压缩包,里面是一些系统分区镜像,提供给客户进行手动升级.恢复系统.需要提前将压 ...

  10. css3实现水平垂直居中------(特别注意,里边的固定还是不固定)

    a,----定位方式(父元素宽高固定,子元素宽高固定) <div class="Father"> <div class="children"& ...