Spring进阶案例之注解和IoC案例 (4)

对于maven的配置文件pom.xml,主要需要导入的包有:Spring、dbutils(用于执行sql语句)、mysql、c3p0(用于数据源)、junit(用于单元测试)

<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</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.13</version> <scope>test</scope> </dependency> </dependencies> 3.单元测试

编写AccountServiceTest测试类用于测试,只测试能否正常执行crud操作,这里只演示了测试查询所有方法:

public class AccountServiceTest { @Test public void testFinaAll() { //1.获取容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); //2.从容器中获取业务层对象 IAccountService accountService = applicationContext.getBean("accountService", IAccountService.class); //3.执行方法 List<Account> accounts = accountService.findAllAccounts(); for (Account account : accounts) { System.out.println(account); } } } 三、基于注解和xml的IoC案例 1.修改AccountServiceImpl和AccountDaoImpl类

在上述案例中,采用的xml进行依赖注入。本案例中,使用注解的方式进行依赖注入,所以不再需要main方法。这两个类仅进行如下修改,其余部分不变:

@Repository("accountDao") public class AccountDaoImpl implements IAccountDao { @Autowired private QueryRunner queryRunner; } @Service("accountService") public class AccountServiceImpl implements IAccountService { @Autowired private IAccountDao accountDao; } 2.修改beans.xml配置文件

和之前一样,要告知Spring要扫描的包,所以约束空间要加入context名称空间,此外之前service和dao的xml配置就不再需要了,但是和连接数据库相关的QueryRunner的配置仍然需要。

<?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 https://www.springframework.org/schema/beans/spring-beans.xsd https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置Spring在创建容器时要扫描的包,在一个名为context名称空间的约束中进行配置--> <context:component-scan base-package="com.crud"></context:component-scan> <!-- 配置queryRunner,必须是多例对象,否则会出现线程安全问题 --> <bean id = "queryRunner" scope="prototype"> <!-- 注入数据源 --> <constructor-arg ref="dataSource"></constructor-arg> </bean> <!-- 配置数据源 --> <bean> <!-- 配置连接数据库的必备信息 --> <property value="com.mysql.cj.jdbc.Driver"></property> <property value="jdbc:mysql://localhost:3306/spring"></property> <property value="root"></property> <property value="12345678"></property> </bean> </beans> 3.测试执行

由于多个单元测试都需要用到accountService对象,所以这里抽取出来作类对象,这样就只需要初始化一次。

public class AccountServiceTest { private ApplicationContext applicationContext; private IAccountService accountService; //手动获取accountService对象 @Before public void init(){ //1.获取容器 applicationContext = new ClassPathXmlApplicationContext("beans.xml"); //2.从容器中获取业务层对象 accountService = applicationContext.getBean("accountService", IAccountService.class); } @Test public void testFinaAll() { //3.执行方法 List<Account> accounts = accountService.findAllAccounts(); for (Account account : accounts) { System.out.println(account); } } } 四、基于纯注解的IoC案例 1.配置类

如果不写xml配置文件,我们如何去指定Spring的相关配置呢?这个时候就需要一个配置类来代替xml配置文件。在src目录下,新建com.crud.conf包,该包下新建配置类SpringConfig。依照前面注解结合xml配置文件的案例。我们需要解决的问题有:

1.告知Spring容器要扫描的包,对应<context:component-scan>标签 2.配置queryRunner 3.配置数据源 2.Spring新注解 注解 作用 属性
@Configuration   指定当前类是一个配置类。    
@Import   用于导入其他的配置类   value:用于指定其他配置类的字节码  
@ComponentScan/@ComponentScans   指定Spring在创建容器时要扫描的包   value/basePackages:用于指定包  
@Bean   把当前方法的返回值作为Bean对象存入IoC容器   name:用于指定bean的id,不写是默认值就是当前方法的名称  
@PropertySource   用于指定要使用的properties文件的位置   value:指定文件的名称和路径,classpath关键字表示类路径  
3.新注解的使用

整个项目的结构如下:

纯注解的IoC案例项目结构

接下来我们一个一个详细理解这些注解的作用:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpddgy.html