原创

Spring二之完全使用注解实现控制反转(IOC)

声明注解所在的包

首先需要告诉Spring需要扫描哪些包中的注解
添加一个配置类

@Configuration
@ComponentScan(basePackages = "work.lijian4net")
@Import(value = JdbcConfig.class)
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfig {

}

注解说明

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

 PropertySource
  作用:用于指定properties文件的位置
  属性:
      value:指定文件的名称和路径
          关键字:classpath,表示类路径下

配置参数类

/**
 * @ClassName JdbcConfig
 * @DESCRIPTION 和spring连接数据库相关的配置类
 * @Author www.lijian4net.work
 * @Date 2021-06-06 17:20
 * @Vsersion 1.0
 */
public class JdbcConfig {

    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.uername}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    @Bean(name = "runner")
    public QueryRunner createQueryRunner(@Qualifier("dataSource1") DataSource dataSource){
        return new QueryRunner(dataSource);
    }

    @Bean(name = "dataSource1")
    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 = "dataSource2")
    public DataSource createDataSource2(){
        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);
        }
    }
}

上面的代码会读取resources目录下的jdbcConfig.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/day17?useUnicode=true&characterEncoding=utf8
jdbc.uername=root
jdbc.password=lijian

代码中使用注解

接口类和原先一样,只需要在实现类中使用注解
dao层实现类

@Repository("accountDao")
public class AccountDao implements IAccountDao {

    @Autowired
    private QueryRunner runner;

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

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

    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);
        }
    }

    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);
        }
    }

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

业务层实现类

@Service("accountService")
public class AccountService implements IAccountService {
    @Autowired
    private IAccountDao accountDao;

    public List<Account> findAll() {
        return accountDao.findAll();
    }

    public Account findAccountById(Integer id) {
        return accountDao.findAccountById(id);
    }

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

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

    public void deleteAccount(Integer accountid) {
        accountDao.deleteAccount(accountid);
    }
}

测试类

测试代码如下

/**
 * @ClassName AccountServiceTest
 * @DESCRIPTION TODO
 * @Author www.lijian4net.work
 * @Date 2021-06-04 20:37
 * @Vsersion 1.0
 *
 *Spring整合junit的配置
 *      1、导入spring整合junit的jar(坐标)
 *      2、使用Junit提供的一个注解把原有的main方法替换了,替换成spring提供的
 *             @Runwith
 *      3、告知spring的运行器,spring和ioc创建是基于xml还是注解的,并且说明位置
 *          @ContextConfiguration
 *                  locations:指定xml文件的位置,加上classpath关键字,表示在类路径下
 *                  classes:指定注解类所在地位置
 *
 *   当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {

    @Autowired
    IAccountService accountService = null;
    @Test
    public void testFindAll(){


        //3、执行方法
        List<Account> accountList = accountService.findAll();
        for(Account account : accountList){
            System.out.println(account);
        }
    }
    @Test
    public void testFindById(){
        //3、执行方法
        Account account = accountService.findAccountById(4);
        System.out.println(account);
    }
    @Test
    public void testSaveAccount(){


        Account account = new Account();
        account.setId(4);
        account.setName("123213");
        account.setMoney(500);
        accountService.saveAccount(account);
    }

    @Test
    public void testUpdateAccount(){

        Account account = new Account();
        account.setId(4);
        account.setName("32");
        account.setMoney(50);
        accountService.updateAccount(account);
    }
}
正文到此结束