23_2spring的常用注解
1.基于注解的IOC配置
1.1导入jar包
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- 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">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.itheima</groupId>
- <artifactId>day02_eesy_01anno_ioc</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>jar</packaging>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>5.0.2.RELEASE</version>
- </dependency>
- </dependencies>
- </project>
1.2接口
- package com.itheima.dao;
- /**
- * 账户的持久层接口
- */
- public interface IAccountDao {
- /**
- * 模拟保存账户
- */
- void saveAccount();
- }
- package com.itheima.service;
- /**
- * 账户业务层的接口
- */
- public interface IAccountService {
- /**
- * 模拟保存账户
- */
- void saveAccount();
- }
1.3创建spring的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来管理-->
- <!--<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>-->
- <!--告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个名称为
- context名称空间和约束中-->
- <context:component-scan base-package="com.itheima"></context:component-scan>
- </beans>
1.4使用@Component注解配置管理的资源
- package com.itheima.service.impl;
- import com.itheima.dao.IAccountDao;
- import com.itheima.service.IAccountService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.context.annotation.Scope;
- import org.springframework.stereotype.Component;
- import org.springframework.stereotype.Service;
- import javax.annotation.Resource;
- /**
- * 账户的业务层实现类
- *
- * 曾经XML的配置:
- * <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
- * scope="" init-method="" destroy-method="">
- * <property name="" value="" | ref=""></property>
- * </bean>
- *
- * 1.用于创建对象的
- * 他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的
- * Component:
- * 作用:用于把当前类对象存入spring容器中
- * 属性:
- * value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。
- * Controller:一般用在表现层
- * Service:一般用在业务层
- * Repository:一般用在持久层
- * 以上三个注解他们的作用和属性与Component是一模一样。
- * 他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰
- *
- * 2.用于注入数据的
- * 他们的作用就和在xml配置文件中的bean标签中写一个<property>标签的作用是一样的
- * 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的写法:${表达式}
- *
- * 3.用于改变作用范围的
- * 他们的作用就和在bean标签中使用scope属性实现的功能是一样的
- * Scope
- * 作用:用于指定bean的作用范围
- * 属性:
- * value:指定范围的取值。常用取值:singleton prototype
- *
- * 4.和生命周期相关(了解)
- * 他们的作用就和在bean标签中使用init-method和destroy-method的作用是一样的
- * PreDestroy
- * 作用:用于指定销毁方法
- * PostConstruct
- * 作用:用于指定初始化方法
- */
- @Service("accountService")
- @Scope("prototype")
- public class AccountServiceImpl implements IAccountService {
- // @Autowired
- // @Qualifier("accountDao2")
- @Resource(name = "accountDao1")
- private IAccountDao accountDao ;
- public void saveAccount(){
- accountDao.saveAccount();
- }
- }
- package com.itheima.dao.impl;
- import com.itheima.dao.IAccountDao;
- import org.springframework.stereotype.Repository;
- /**
- * 账户的持久层实现类
- */
- @Repository("accountDao1")
- public class AccountDaoImpl implements IAccountDao {
- public void saveAccount(){
- System.out.println("保存了账户1111111111");
- }
- }
1.5测试方法
- package com.itheima.ui;
- import com.itheima.dao.IAccountDao;
- import com.itheima.service.IAccountService;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * 模拟一个表现层,用于调用业务层
- */
- public class Client {
- public static void main(String[] args) {
- //1.获取核心容器对象
- ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
- //2.根据id获取Bean对象
- IAccountService as = (IAccountService)ac.getBean("accountService");
- IAccountService as2 = (IAccountService)ac.getBean("accountService");
- System.out.println(as==as2);
- // IAccountDao adao = ac.getBean("accountDao", IAccountDao.class);
- // System.out.println(adao);
- // System.out.println(as);
- as.saveAccount();
- }
- }
2.常用注解
2.1用于创建对象的
- 相当于:<bean id="" class="">
1.@Component
2.@Controller @Service @Repository
2.2用于注入数据的
- 相当于:<property name="" ref="">
- <property name="" value="">
1. @Autowired
2.@Qualifier
3.@Resource
4.@Value
2.3用于改变作用范围的
- 相当于:<bean id="" class="" scope="">
1.@Scope
2.4和生命周期相关的
- 相当于:<bean id="" class="" init-method="" destroy-method="" />
1.@PostConstruct
2.@PreDestroy
3.使用spring的IoC的实现账户的CURD
3.1 技术要求
使用 spring 的 IoC 实现对象的管理
使用 DBAssit 作为持久层解决方案
使用 c3p0 数据源
3.2导入jar包
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- 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">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.itheima</groupId>
- <artifactId>day02_eesy_02account_xmlioc</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>jar</packaging>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>5.0.2.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>5.0.2.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>commons-dbutils</groupId>
- <artifactId>commons-dbutils</artifactId>
- <version>1.4</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.6</version>
- </dependency>
- <dependency>
- <groupId>c3p0</groupId>
- <artifactId>c3p0</artifactId>
- <version>0.9.1.2</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- </dependency>
- </dependencies>
- </project>
3.3编写实体
- 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 +
- '}';
- }
- }
3.4编写持久层代码
- package com.itheima.dao;
- import com.itheima.domain.Account;
- import java.util.List;
- /**
- * 账户的持久层接口
- */
- 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 acccountId
- */
- void deleteAccount(Integer acccountId);
- }
- 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<Account> findAllAccount() {
- try{
- return runner.query("select * from account",new BeanListHandler<Account>(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>(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);
- }
- }
- }
3.5编写业务层代码
- package com.itheima.service;
- import com.itheima.domain.Account;
- import java.util.List;
- /**
- * 账户的业务层接口
- */
- 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 acccountId
- */
- void deleteAccount(Integer acccountId);
- }
- 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<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 acccountId) {
- accountDao.deleteAccount(acccountId);
- }
- }
3.6创建并编写配置文件
- <?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 -->
- <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>
- <!--配置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/eesy"></property>
- <property name="user" value="root"></property>
- <property name="password" value="123456"></property>
- </bean>
- </beans>
3.7测试
- 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<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);
- 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.使用注解完成上述案例
4.1导入jar包
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- 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">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.itheima</groupId>
- <artifactId>day02_eesy_04account_annoioc_withoutxml</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>jar</packaging>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>5.0.2.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>5.0.2.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>commons-dbutils</groupId>
- <artifactId>commons-dbutils</artifactId>
- <version>1.4</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.6</version>
- </dependency>
- <dependency>
- <groupId>c3p0</groupId>
- <artifactId>c3p0</artifactId>
- <version>0.9.1.2</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- </dependency>
- </dependencies>
- </project>
4.2实体类
- 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 +
- '}';
- }
- }
4.3持久层代码
- package com.itheima.dao;
- import com.itheima.domain.Account;
- import java.util.List;
- /**
- * 账户的持久层接口
- */
- 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 acccountId
- */
- void deleteAccount(Integer acccountId);
- }
- 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<Account> findAllAccount() {
- try{
- return runner.query("select * from account",new BeanListHandler<Account>(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>(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);
- }
- }
- }
4.4业务层代码
- package com.itheima.service;
- import com.itheima.domain.Account;
- import java.util.List;
- /**
- * 账户的业务层接口
- */
- 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 acccountId
- */
- void deleteAccount(Integer acccountId);
- }
- 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<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 acccountId) {
- accountDao.deleteAccount(acccountId);
- }
- }
4.5主配置类
- package config;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Import;
- import org.springframework.context.annotation.PropertySource;
- /**
- * 该类是一个配置类,它的作用和bean.xml是一样的
- */
- @ComponentScan(basePackages = {"com.itheima"})
- @Import(JdbcConfig.class)
- @PropertySource("classpath:jdbcConfig.properties")
- public class SpringConfiguraiton {
- }
4.6数据库连接配置类
- package config;
- import com.mchange.v2.c3p0.ComboPooledDataSource;
- import org.apache.commons.dbutils.QueryRunner;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.Scope;
- import javax.sql.DataSource;
- 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;
- @Bean(name = "runner")
- @Scope("prototype")
- public QueryRunner createQueryRunner(DataSource dataSource) {
- return new QueryRunner(dataSource);
- }
- @Bean(name = "dataSource")
- 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);
- }
- }
- }
4.7数据库配置文件
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/eesy
- jdbc.username=root
- jdbc.password=123456
4.8测试类
- package com.itheima.test;
- import config.SpringConfiguraiton;
- import com.itheima.domain.Account;
- import com.itheima.service.IAccountService;
- import org.junit.Before;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.annotation.AnnotationConfigApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import java.util.List;
- /**
- * 使用Junit单元测试:测试我们的配置
- */
- public class AccountServiceTest {
- private ApplicationContext ac;
- private IAccountService as;
- @Before
- public void init() {
- //1.获取容易
- ac = new AnnotationConfigApplicationContext(SpringConfiguraiton.class);
- //2.得到业务层对象
- as = ac.getBean("accountService", IAccountService.class);
- }
- @Test
- public void testFindAll() {
- //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");
- ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguraiton.class);
- //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);
- }
- }
5.新注解说明
5.1@Configuration
5.2@ComponentScan
5.3@Bean
5.4@PropertySource
5.5@Import
6.spring整合junit案例
6.1问题
6.2解决思路分析
1、应用程序的入口
main方法
2、junit单元测试中,没有main方法也能执行
junit集成了一个main方法
该方法就会判断当前测试类中哪些方法有 @Test注解
junit就让有Test注解的方法执行
3、junit不会管我们是否采用spring框架
在执行测试方法时,junit根本不知道我们是不是使用了spring框架
所以也就不会为我们读取配置文件/配置类创建spring核心容器
4、由以上三点可知
当测试方法执行时,没有Ioc容器,就算写了Autowired注解,也无法实现注入
6.3使用@RunWith注解替换原有运行器
6.4使用@ContextConfiguration 指定spring 配置文件/对象的位置
6.5使用@Autowired给测试类中的变量注入数据
6.6测试类
- package com.itheima.test;
- import config.SpringConfiguration;
- 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.context.ApplicationContext;
- import org.springframework.context.annotation.AnnotationConfigApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
- import java.util.List;
- /**
- * 使用Junit单元测试:测试我们的配置
- * 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 = SpringConfiguration.class)
- public class AccountServiceTest {
- @Autowired
- private IAccountService as;
- @Test
- public void testFindAll() {
- //3.执行方法
- List<Account> accounts = as.findAllAccount();
- for (Account account : accounts) {
- System.out.println(account);
- }
- }
- }
23_2spring的常用注解的更多相关文章
- Spring系列之Spring常用注解总结
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- SpringMVC常用注解實例詳解3:@ResponseBody
我的開發環境框架: springmvc+spring+freemarker開發工具: springsource-tool-suite-2.9.0JDK版本: 1.6.0_29tomcat ...
- SpringMVC常用注解實例詳解2:@ModelAttribute
我的開發環境框架: springmvc+spring+freemarker開發工具: springsource-tool-suite-2.9.0JDK版本: 1.6.0_29tomcat ...
- Spring常用注解汇总
本文汇总了Spring的常用注解,以方便大家查询和使用,具体如下: 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包). <context:component- ...
- Spring常用注解,自动扫描装配Bean
1 引入context命名空间(在Spring的配置文件中),配置文件如下: xmlns:context="http://www.springframework.org/schema/con ...
- springmvc常用注解与类型转换
springmvc常用注解与类型转换 一:前置 spring -servlet.xml 注入 <!-- 启用spring mvc 注解 --> <context:annotation ...
- SpringMVC常用注解,返回方式,路径匹配形式,验证
常用注解元素 @Controller 标注在Bean的类定义处 @RequestMapping 真正让Bean具备 Spring MVC Controller 功能的是 @RequestMapping ...
- SpringMVC 常用注解
本文参考了博客,具体请见:http://www.cnblogs.com/leskang/p/5445698.html Spring MVC的常用注解 1.@Controller @Controller ...
- spring注解开发中常用注解以及简单配置
一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...
随机推荐
- 20190521 - macOS 中显示隐藏文件的快捷键
macOS 中显示隐藏文件,以前总是借助于命令行或第三方软件,其实有一个快捷键: shift + cmmand + .
- VMware Workstation 12许可证
VMware 12专业版永久许可证密钥: 5A02H-AU243-TZJ49-GTC7K-3C61N VF5XA-FNDDJ-085GZ-4NXZ9-N20E6 UC5MR-8NE16-H81WY-R ...
- 【Abode Air程序开发】打包并导出
打包并导出 将移动设备应用程序打包并导出到在线商店 导出用于发行的 Android APK 包 导出用于发行的 Apple iOS 包 使用命令行进行创建.测试和部署 使用 mxmlc 编译手机应用程 ...
- Web工作方式
我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容.在这个看似简单的用户行为背后,到底隐藏了些什么呢? 对于普通的上网过程,系统其实是这样做的:浏览器本身是一个 ...
- 生成器的send方法、递推函数、匿名函数及常用内置函数
生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 什么是send方法? send方法相当于高级的next方法,send ...
- hadoop集群搭建及易踩坑收录
配置前先把域名映射配好哈 详情参考我的其他随笔(哪里不通可以在下方评论) 下载好hdfs.tar.gz 后 在/home/ldy下 mkdir apps/ tar -xzvf hdfs.tar.gz ...
- 对Android应用签名
Android使用包名作为唯一标识,当在同一台手机安装两个包名相同的应用,后安装的应用就会覆盖前面的应用(签名相同的情况下). 签名有两个主要作用: 1.确定发布者身份.由于应用开发者可以通过使用相同 ...
- Firebase Chat (firebase 实现web聊天室)
基于firebase + cloud Function 实现web聊天(demo版) 知识点: 使用Firebase SDK创建Google Cloud功能. 触发云功能基于Auth,云存储和Clou ...
- Java多线程(一):线程与进程
1.线程和进程 1.1 进程 进程是操作系统的概念,我们运行的一个TIM.exe就是一个进程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位 ...
- Where is __dso_handle defined?
Where is __dso_handle defined? 来源 https://stackoverflow.com/questions/34308720/where-is-dso-handle- ...