spring学习2:基于注解+xml实现ioc和依赖注入

spring学习2:基于注解+xml实现ioc和依赖注入

一、在spring配置文件中开启spring对注解的支持




    
    
    

二、使用注解来配置要创建的bean

在需要放到spring容器中的类上加上对应注解,这时可以使用注解来配置bean,不需要在配置文件中用bean标签来配置。

@Component,@Controller,@Service,@Repository,这几个注解加在类上,告知spring把所在的类创建对象放入容器中。

三、依赖注入相关的注解

3.1 注入一个bean

autowired

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

Qualifier

在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和 @Autowire 一起使用;但是给方法参数注入时,可以独立使用。

属性:value,指定bean的id

Resource

直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。 属性:name,指定bean的id

3.2注入简单类型(基本+String)

Value

注入基本数据类型和 String 类型数据的 。属性:value,用于指定值。

四、实例:实现一个对账户的crud操作

使用spring的注解+xml配置来实现一个对账户的crud操作,持久层使用commons-dbutils来实现

3.1 创建数据库和表的sql

-- 创建数据库
CREATE DATABASE spring_demo1;
SHOW TABLES;
USE spring_demo1;
-- 创建账户表
CREATE TABLE account(
  id VARCHAR(64) PRIMARY KEY,
  `name` VARCHAR(32),
  money FLOAT
)

-- 新增记录
INSERT INTO account(id,`name`,money) VALUE(MD5(UUID()),'张三',100);

SELECT * FROM account 

3.2 maven依赖


        
            log4j
            log4j
            1.2.17
        

        
            org.projectlombok
            lombok
            1.16.16
        

        
            junit
            junit
            4.12
        

        
        
            org.springframework
            spring-context
            5.0.2.RELEASE
        

        
            org.springframework
            spring-test
            5.0.2.RELEASE
        

        
            org.springframework
            spring-tx
            5.0.2.RELEASE
        

        
        
            mysql
            mysql-connector-java
            5.1.46
        

        
        
            com.alibaba
            druid
            1.1.11
        

        
        
            commons-dbutils
            commons-dbutils
            1.6
        
    

3.3 spring的配置文件

在这个配置文件中开启对注解的支持,配置连接池的bean和QueryRunner的bean




    
    
    
    

    

    
    
    
        
        
        
        
    

    
    
        
    

3.4创建实体类

import lombok.Data;

/**
 * 账户实体类
 */
@Data
public class Account {
    private String id;
    private String name;
    private float money;
}

3.5创建dao、service的包结构和对应的实现类

其中dao实现类如下


@Repository(value = "accountDaoImpl2")
public class AccountDaoImpl2 implements IAccountDao {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private QueryRunner queryRunner;

    @Override
    public void insert(Account account) {
        try {
            String sql="INSERT INTO account(id,`name`,money) VALUE(MD5(UUID()),?,?)";
            Object[] params={account.getName(),account.getMoney()};
            queryRunner.update(sql,params);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("新增记录出错,e"+e.toString());
        }
    }

    @Override
    public List findAll() {
        try {
            String sql="SELECT * FROM account";
            List list = (List) queryRunner.query(sql, new BeanListHandler(Account.class));
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("查询全部记录出错,e"+e.toString());
        }
    }

    @Override
    public Account findById(String id) {
        try {
            String sql="SELECT * FROM account WHERE id=?";
            Account account = queryRunner.query(sql, new BeanHandler<>(Account.class), id);
            return account;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("查询指定记录出错,e"+e.toString());
        }
    }

    @Override
    public void delete(String id) {
        try {
            String sql="DELETE FROM account WHERE id=?";
            queryRunner.update(sql,id);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("删除指定记录出错,e"+e.toString());
        }
    }

}

然后在service实现类中用Autowired注入这个对象,就可以调用dao的方法

    @Autowired
    @Qualifier(value = "accountDaoImpl2")
    private IAccountDao accountDao;

3.6测试

从spring容器中获取service对象,并执行对应的方法

    @Test
    public void testFindAll(){
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        IAccountService accountService = app.getBean(IAccountService.class);
        List list = accountService.findAll();
        System.out.println(Arrays.toString(list.toArray()));
    }

五、总结

注解配置和xml配置的过程是一样的,都是先把bean放入容器,放入的过程中可能会涉及到依赖注入的问题,用注解实现依赖注入主要用到两个注解:@Autowired和@Value

示例工程地址
示例工程地址

你可能感兴趣的:(spring学习2:基于注解+xml实现ioc和依赖注入)