【Spring】基于XML的IOC案例

作者:神秘网友 发布时间:2020-10-31 09:52:54

【Spring】基于XML的IOC案例

【Spring】基于XML的IOC案例

代码结构:
【Spring】基于XML的IOC案例

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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置Service-->
    <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
        <!--注入dao-->
        <property name="accountDao" ref="accountDao"></property>
    </bean>
    <!--配置dao对象-->
    <bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
        <!--注入QueryRunner-->
        <property name="runner" ref="runner"></property>
    </bean>
    <!--配置QueryBean-->
    <bean id="runner" class="org.apache.commons.dbutils.QueryRunner">
        <!--配置数据源-->
        <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/eesy"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
</beans>

业务接口层

/**
 * 账户的业务层接口
 */
public interface IAccountService {
    /**
     * 查询所有
     * @return
     */
    List<Account> findAllAccount();

    /**
     * 查询一个
     * @return
     */
    Account findAccountById(Integer accountId);

    /**
     * 保存
     * @param account
     */
    void saveAccount(Account account);

    /**
     * 更新
     * @param account
     */
    void updateAccount(Account account);

    /**
     * 删除
     * @param accountId
     */
    void deleteAccount(Integer accountId);
}

业务接口层实现

/**
 * 账户的业务成是先烈
 */
public class AccountServiceImpl implements IAccountService {

    public void setAccountDao(IAccountDao accountDao) {
        this.accountDao = accountDao;
    }

    private IAccountDao accountDao;
    @Override
    public List<Account> findAllAccount() {
        return accountDao.findAllAccount();
    }

    @Override
    public Account findAccountById(Integer accountId) {
        return accountDao.findAccountById(accountId);
    }

    @Override
    public void saveAccount(Account account) {
        accountDao.saveAccount(account);
    }

    @Override
    public void updateAccount(Account account) {
        accountDao.updateAccount(account);
    }

    @Override
    public void deleteAccount(Integer accountId) {
        accountDao.deleteAccount(accountId);
    }
}

持久层接口

/**
 * 账户的持久层接口
 */
public interface IAccountDao {
    /**
     * 查询所有
     * @return
     */
    List<Account> findAllAccount();

    /**
     * 查询一个
     * @return
     */
    Account findAccountById(Integer accountId);

    /**
     * 保存
     * @param account
     */
    void saveAccount(Account account);

    /**
     * 更新
     * @param account
     */
    void updateAccount(Account account);

    /**
     * 删除
     * @param accountId
     */
    void deleteAccount(Integer accountId);
}

持久层接口实现

/**
 * 账户的持久层实现类
 */
public class AccountDaoImpl implements IAccountDao {

    public void setRunner(QueryRunner runner) {
        this.runner = runner;
    }

    private QueryRunner runner;
    @Override
    public List<Account> findAllAccount() {
        try {
            return runner.query("select * from account",new BeanListHandler<Account>(Account.class));
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    @Override
    public Account findAccountById(Integer accountId) {
        try {
            return runner.query("select * from account where id = ?",new BeanHandler<Account>(Account.class),accountId);
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    @Override
    public void saveAccount(Account account) {
        try {
             runner.update("insert into account(name,money)values(?,?)",account.getName(),account.getMoney());
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    @Override
    public void updateAccount(Account account) {
        try {
            runner.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    @Override
    public void deleteAccount(Integer accountId) {
        try {
             runner.update("delete from account where id=?",accountId);
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }
}

实体层

/**
 * 账户的实体类
 */
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 +
                '}';
    }
}

测试类

/**
 * 使用Junited单元测试,测试我们的配置
 */
public class AccountServiceTest {

    @Test
    public void testFindAll() {
        //1. 获取容器
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到业务层对象
        IAccountService as=ac.getBean("accountService",IAccountService.class);
        //3. 执行方法
        List<Account> accounts=as.findAllAccount();
        for(Account account:accounts){
            System.out.println(account);
        }
    }

    @Test
    public void testFindOne() {
        //1. 获取容器
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到业务层对象
        IAccountService as=ac.getBean("accountService",IAccountService.class);
        //3. 执行方法
        Account account=as.findAccountById(1);
    }

    @Test
    public void testSave() {
        Account account=new Account();
        account.setName("zhaofen");
        account.setMoney(200f);
        //1. 获取容器
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到业务层对象
        IAccountService as=ac.getBean("accountService",IAccountService.class);
        //3. 执行方法
        as.saveAccount(account);

    }

    @Test
    public void testUpdate() {
        //1. 获取容器
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到业务层对象
        IAccountService as=ac.getBean("accountService",IAccountService.class);
        //3. 执行方法
        Account account=as.findAccountById(4);
        account.setName("test");
        as.updateAccount(account);
    }

    @Test
    public void testDelete() {
        //1. 获取容器
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        //2. 得到业务层对象
        IAccountService as=ac.getBean("accountService",IAccountService.class);
        //3. 执行方法
        as.deleteAccount(4);
    }
}

【Spring】基于XML的IOC案例相关教程

  1. Spring启动流程(二)——获取BeanFactory

    Spring启动流程(二)——获取BeanFactory protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (logger.isDebugEnabled()) { logger.debug(B

  2. Spring应用手册-AOP(XML)-(12)-AOP-XML-advisor方式-后置通知和

    Spring应用手册-AOP(XML)-(12)-AOP-XML-advisor方式-后置通知和最终通知 戴着假发的程序员 出品 抖音ID: 戴着假发的程序员 欢迎关注 spring应用手册(第四部分) 这里说明一下为什么后置通知和最终通知一起说呢,因为在后置通知接口继承了最终通知,并且在最

  3. Spring应用手册-AOP(XML)-(15)-AOP-XML-advisor方式-多通知执行

    Spring应用手册-AOP(XML)-(15)-AOP-XML-advisor方式-多通知执行顺序 戴着假发的程序员 出品 抖音ID: 戴着假发的程序员 欢迎关注 spring应用手册(第四部分) 在Advisor方式中我们也会遇到多个通知顺序问题,在这里spring提供的解决方案是:我们可以让我们通

  4. Spring应用手册-AOP(XML)-(14)-AOP-XML-advisor-方式环绕通知

    Spring应用手册-AOP(XML)-(14)-AOP-XML-advisor-方式环绕通知 戴着假发的程序员 出品 抖音ID: 戴着假发的程序员 欢迎关注 spring应用手册(第四部分) advisor的环绕通知,我们的通知类需要实现接口:MethodInterceptor,源码如下: package org.aopalliance.i

  5. 基于cloudera manager的大数据集群平台搭建之集群服务安装

    基于cloudera manager的大数据集群平台搭建之集群服务安装 继续上篇,这篇介绍集群服务安装 监控服务安装 出现如下界面的原因是我们没有安装监控服务,因此应该首先安装监控服务,便于后面安装其他服务的过程出现问题的排查。 点击如下直接进行添加监控服务的

  6. STM32L475基于RT-Thread PWM模块的使用注意事项

    STM32L475基于RT-Thread PWM模块的使用注意事项 STM32L475基于RT-Thread PWM模块的使用注意事项 关于RT-Thread PWM模块配置的步骤可参考官方提供的步骤来进行配置,但是官方讲解的不全面,按照官方的配置来进行配置最后下载到板子里面验证时候没有波形输出,

  7. SpringBoot2--外部Servlet容器

    SpringBoot2--外部Servlet容器 嵌入式Servlet容器的优点是简单、便携,缺点是默认不支持JSP、优化定制比较复杂(自定义定制器或者工厂),所以有时需要使用外部Servlet容器,应用war包的形式打包 jar包:执行SpringBoot主类的main方法,启动ioc容器,创建嵌入式

  8. 基于应用日志的扫描器检测实践

    基于应用日志的扫描器检测实践 基于应用日志的扫描器检测实践 在网络上搜索web扫描器时,各类扫描器工具、扫描攻略玲琅满目,但对扫描器检测方法的内容却少之又少。因此,本文对各类web扫描特特征进行了梳理和总结,并结合苏宁应用防火墙(SNWAF)日志数据,