Spring第二天

常用注解

1 今日课程内容介绍

今日内容
spring第二天:spring基于注解的IOC以及IoC的案例
1、spring中ioc的常用注解
2、案例使用xml方式和注解方式实现单表的CRUD操作

持久层技术选择:dbutils

3、改造基于注解的ioc案例,使用纯注解的方式实现

spring的一些新注解使用

4、spring和Junit整合

2 常用IOC注解按照作用分类

首先将xml的bean配置删除掉
Spring第二天_第1张图片

3 用于创建的Component注解

修改bean.xml文件
Spring第二天_第2张图片

4 由Component衍生的注解

Spring第二天_第3张图片

5 自动按照类型注入

image.png
如果不是唯一的这种情况

  • Autowired:
  • 作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
  • 如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
  • 如果Ioc容器中有多个类型匹配时:
  • 出现位置:
  • 可以是变量上,也可以是方法上
  • 细节:
  • 在使用注解注入时,set方法就不是必须的了。

Spring第二天_第4张图片

6 用于注入数据的注解

Spring第二天_第5张图片

7 改变作用范围以及和生命周期相关的注解

@Scope @PostConstruct @PreDestroy
Spring第二天_第6张图片

基于XML的IOC的案例1

1 测试基于XML的IOC案例

Spring第二天_第7张图片
AccountServiceImpl.java
package com.itheima.service.impl;

import com.itheima.dao.IAccountDao;
import com.itheima.service.IAccountService;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/**

  • 账户的业务层实现类

*

  • 曾经XML的配置:
  • scope="" init-method="" destroy-method="">

*

  • 用于创建对象的
  • 他们的作用就和在XML配置文件中编写一个标签实现的功能是一样的
  • Component:
  • 作用:用于把当前类对象存入spring容器中
  • 属性:
  • value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。
  • Controller:一般用在表现层
  • Service:一般用在业务层
  • Repository:一般用在持久层
  • 以上三个注解他们的作用和属性与Component是一模一样。
  • 他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰

*
*

  • 用于注入数据的
  • 他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的
  • Autowired:
  • 作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
  • 如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
  • 如果Ioc容器中有多个类型匹配时:
  • 出现位置:
  • 可以是变量上,也可以是方法上
  • 细节:
  • 在使用注解注入时,set方法就不是必须的了。
  • Qualifier:
  • 作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以(稍后我们讲)
  • 属性:
  • value:用于指定注入bean的id。
  • Resource
  • 作用:直接按照bean的id注入。它可以独立使用
  • 属性:
  • name:用于指定bean的id。
  • 以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。
  • 另外,集合类型的注入只能通过XML来实现。

*

  • Value
  • 作用:用于注入基本类型和String类型的数据
  • 属性:
  • value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式)
  • SpEL的写法:${表达式}

*

  • 用于改变作用范围的
  • 他们的作用就和在bean标签中使用scope属性实现的功能是一样的
  • Scope
  • 作用:用于指定bean的作用范围
  • 属性:
  • value:指定范围的取值。常用取值:singleton prototype

*

  • 和生命周期相关 了解
  • 他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的
  • PreDestroy
  • 作用:用于指定销毁方法
  • PostConstruct
  • 作用:用于指定初始化方法

*/
@Service("accountService")
//@Scope("prototype")
public class AccountServiceImpl implements IAccountService {

// @Autowired
// @Qualifier("accountDao1")

@Resource(name = "accountDao2")
private IAccountDao accountDao = null;

@PostConstruct
public void  init(){
    System.out.println("初始化方法执行了");
}

@PreDestroy
public void  destroy(){
    System.out.println("销毁方法执行了");
}

public void  saveAccount(){
    accountDao.saveAccount();
}

}

IAccountService.java
package com.itheima.service;

/**

  • 账户业务层的接口

*/
public interface IAccountService {

/**
 * 模拟保存账户
 */
void saveAccount();

}
Client.java
package com.itheima.ui;

import com.itheima.service.IAccountService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**

  • 模拟一个表现层,用于调用业务层

*/
public class Client {

/**
 * @param args
 */
public static void main(String[] args) {
    //1.获取核心容器对象

// ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
    //2.根据id获取Bean对象
    IAccountService as  = (IAccountService)ac.getBean("accountService");

// IAccountService as2 = (IAccountService)ac.getBean("accountService");
// System.out.println(as);
// IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);
// System.out.println(adao);
// System.out.println(as == as2);

    as.saveAccount();
    ac.close();
}

}
bean.xml

   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">



pow.xml

     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0

com.itheima
day02_eesy_01anno_ioc
1.0-SNAPSHOT
jar


    
        org.springframework
        spring-context
        5.0.2.RELEASE
    

2 基于XML的IOC的案例-编写spring的Ioc配置

bean.xml配置

   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">


    
    




    
    




    
    




    
    
    
    
    

3 基于XML的IOC的案例-案例准备

Spring第二天_第8张图片
导入配置

     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0

com.itheima
day02_eesy_02account_xmlioc
1.0-SNAPSHOT
jar


    
        org.springframework
        spring-context
        5.0.2.RELEASE
    
    
        org.springframework
        spring-test
        5.0.2.RELEASE
    
    
        commons-dbutils
        commons-dbutils
        1.4
    

    
        mysql
        mysql-connector-java
        5.1.6
    

    
        c3p0
        c3p0
        0.9.1.2
    

    
        junit
        junit
        4.12
    


bean.xml

   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">


    
    




    
    




    
    




    
    
    
    
    


AccountDaoImpl.java
package com.itheima.dao.impl;

import com.itheima.dao.IAccountDao;
import com.itheima.domain.Account;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.util.List;

/**

  • 账户的持久层实现类

*/
public class AccountDaoImpl implements IAccountDao {

private QueryRunner runner;

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

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

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

@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(e);
    }
}

@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(e);
    }
}

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

}
IAccountDao.java
package com.itheima.dao;

import com.itheima.domain.Account;

import java.util.List;

/**

  • 账户的持久层接口

*/
public interface IAccountDao {

/**
 * 查询所有
 * @return
 */
List findAllAccount();

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

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

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

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

}
Account.java
package com.itheima.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 +
            '}';
}

}
AccountServiceImpl.java
package com.itheima.service.impl;

import com.itheima.dao.IAccountDao;
import com.itheima.domain.Account;
import com.itheima.service.IAccountService;

import java.util.List;

/**

  • 账户的业务层实现类

*/
public class AccountServiceImpl implements IAccountService{

private IAccountDao accountDao;

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

@Override
public List 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 acccountId) {
    accountDao.deleteAccount(acccountId);
}

}
IAccountService.java
package com.itheima.service;

import com.itheima.domain.Account;

import java.util.List;

/**

  • 账户的业务层接口

*/
public interface IAccountService {

/**
 * 查询所有
 * @return
 */
List findAllAccount();

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

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

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

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

}
AccountServiceTest.java
package com.itheima.test;

import com.itheima.domain.Account;
import com.itheima.service.IAccountService;
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;

public class AccountServiceTest {

@Test
public void testFindAll() {
    //1.获取容易
    ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
    //2.得到业务层对象
    IAccountService as = ac.getBean("accountService",IAccountService.class);
    //3.执行方法
    List 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);
    System.out.println(account);
}

@Test
public void testSave() {
    Account account = new Account();
    account.setName("test");
    account.setMoney(12345f);
    //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.setMoney(23456f);
    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);
}

}

4 注解IOC案例-把自己编写的类使用注解配置

项目结构
Spring第二天_第9张图片
bean.xml

   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">





    
    




    
    
    
    
    


AccountDaoImpl.java
package com.itheima.dao.impl;

import com.itheima.dao.IAccountDao;
import com.itheima.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.util.List;

/**

  • 账户的持久层实现类

*/
@Repository("accountDao")
public class AccountDaoImpl implements IAccountDao {

@Autowired
private QueryRunner runner;



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

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

@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(e);
    }
}

@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(e);
    }
}

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

}
IAccountDao.java
package com.itheima.dao;

import com.itheima.domain.Account;

import java.util.List;

/**

  • 账户的持久层接口

*/
public interface IAccountDao {

/**
 * 查询所有
 * @return
 */
List findAllAccount();

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

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

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

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

}
AccountServiceImpl.java
package com.itheima.service.impl;

import com.itheima.dao.IAccountDao;
import com.itheima.domain.Account;
import com.itheima.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;

@Override
public List 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 acccountId) {
    accountDao.deleteAccount(acccountId);
}

}
IAccountService.java
package com.itheima.service;

import com.itheima.domain.Account;

import java.util.List;

/**

  • 账户的业务层接口

*/
public interface IAccountService {

/**
 * 查询所有
 * @return
 */
List findAllAccount();

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

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

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

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

}
AccountServiceTest.java
package com.itheima.test;

import com.itheima.domain.Account;
import com.itheima.service.IAccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

/**

  • 使用Junit单元测试:测试我们的配置

*/
public class AccountServiceTest {

@Test
public void testFindAll() {
    //1.获取容易
    ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
    //2.得到业务层对象
    IAccountService as = ac.getBean("accountService",IAccountService.class);
    //3.执行方法
    List 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);
    System.out.println(account);
}

@Test
public void testSave() {
    Account account = new Account();
    account.setName("test");
    account.setMoney(12345f);
    //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.setMoney(23456f);
    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新注解

完成后的代码的数据结构
Spring第二天_第10张图片

1 spring的新注解-Configuration和ComponentScan

Configuration的注解,他的作用同bean.xml
Spring第二天_第11张图片
当只有一个参数的时候
其中basePackages与value作用相同,且basePackages=可以省略

2 spring的新注解-Bean

上边那个只是个方法,下边那个会创建对象并且存入Spring的ioc容器
Spring第二天_第12张图片

3 AnnotationConfigApplicationContext的使用

Spring第二天_第13张图片

4 spring的新注解-Import

当把Configuration注解给注释的时候
Spring第二天_第14张图片

5 spring的新注解-PropertySource

Spring第二天_第15张图片

6 Qualifier注解的另一种用法

Spring第二天_第16张图片

7 spring整合junit问题分析

8 spring整合junit完成

Spring第二天_第17张图片
所以用指定xml的项目可以改成

你可能感兴趣的:(java)