1. 知识点
- Spring中的常用注解
- 案例使用xml方式和注解方式实现单标CRUD操作
持久层技术选择:dbutils - 改造基于注解的IOC案例,使用纯注解的方式实现
- Spring和Junit的整合
2. Spring中的常用注解
2.1 注解的作用
用于创建对象的,他们的作用就和xml配置文件中编写一个bean标签实现的功能是一样的
2.2 常用注解
@Component:
- 作用:用于把当前类对象存入Spring容器中
- 属性:value:用于指定bean的id,当我们不写时,它的默认值是当前类名,并且首字母改小写
@Controller:
一般用于表现层
@Service:
一般用于业务层
@Repository:
一般用于持久层
以上三个注解他们的作用和Component一模一样用于注入数据的
他们的作用就和xml配置文件中的bean标签中写一个<property>标签是一样的
@Autowired:
-
作用:
自动按照类型注入,只要容器中有唯一一个bean对象类型和要注入的变量类型匹配,就可以注入成功
如果IOC容器中没有任何bean类型和要注入的变量类型匹配,则报错
如果IOC容器中有多个类型匹配时,首先按照类型匹配,再按照使用的类名匹配 -
位置:可以使成员变量也可以是方法
-
细节:在使用注解注入时,set方法就不是必须的了
@Qualifier:
-
作用 :在按照类注入的基础上再按照名称注入,他在给类成员注入时时,不能单独使用,但是在给方法参数注入时,可以
-
属性:value:用于指定bean的id
以上三个注入只能注入其他bean类型的数据,而基本数据和String类型无法使用上述注解
另外:集合类型的注入只能通过xml来实现
@Value:
- 作用:用于注入基本类型和String类型的数据
- 属性: value:用于指定指定数据的值,它可以使用使用Spring中的el表达式
@Resource
- 作用:直接按照bean的id注入
- 属性:name:用于指定bean的id用于改变作用范围的
@Scope:
- 作用:指定单例、多例
- 他们的作用就和在bean标签中使用scope属性实现的功能是一致的和生命周期相关的
@PreDestory:
- 作用:用于指定销毁方法
@PostConstruct:
- 作用:用于指定初始方法
- 他们的作用就和在bean标签中使用init-method和destory-method的作用是一样的
3. 案例:使用xml方式实现单标CRUD操作
<!--配置Service对象-->
<bean id="accountService" class="com.zrf.service.impl.AccountServiceImpl">
<!--注入到=dao-->
<property name="accountDao" ref="accountDao">
</property>
</bean>
<!--配置Dao对象-->
<bean id="accountDao" class="com.zrf.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.cj.jdbc.Driver">
</property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy?characterEncoding=utf8&serverTimezone=UTC&useSSL=false">
</property>
<property name="user" value="root">
</property>
<property name="password" value="root">
</property>
</bean>
4. 案例:使用纯注解方式实现单标CRUD操作
<!--配置Service对象-->
<bean id="accountService" class="com.zrf.service.impl.AccountServiceImpl">
<!--注入到=dao-->
<property name="accountDao" ref="accountDao">
</property>
</bean>
替换成:
@Service("accountService")
public class AccountServiceImpl implements IAccountService {
@Autowired
private IAccountDao accountDao;
}
<bean id="accountDao" class="com.zrf.dao.impl.AccountDaoImpl">
<!--注入QueryRunner-->
<property name="runner" ref="runner">
</property>
</bean>
替换成:
@Repository("accountDao")
public class AccountDaoImpl implements IAccountDao {
@Autowired
private QueryRunner runner;
}
<!--配置QueryRunner-->
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
<!--注入数据源-->
<constructor-arg name="ds" ref="dataSource">
</constructor-arg>
</bean>
替换成:
@Bean(name = "runner")
public QueryRunner createQueryRunner(DataSource dataSource) {
return new QueryRunner(dataSource);
}
<!--配置数据源对象-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--连接数据库的必备信息-->
<property name="driverClass" value="com.mysql.cj.jdbc.Driver">
</property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy?characterEncoding=utf8&serverTimezone=UTC&useSSL=false">
</property>
<property name="user" value="root">
</property>
<property name="password" value="root">
</property>
</bean>
替换成
@Configuration
public class JDBConfig {
@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 = "dataSource")
//创建数据源对象
public DataSource createDataSource() {
ComboPooledDataSource ds = new ComboPooledDataSource();
try {
ds.setDriverClass(driver);
} catch (PropertyVetoException e) {
throw new RuntimeException(e);
}
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
}
}
5. Spring和JUnit的整合
- 使用Juit单元测试,测试我们的配置
Spring整合JUnit的配置
- 导入Spring整合Junit的坐标
- 使用junit提供的注解把原有的main方法替换了,替换成spring提供的
@RunWith
- 告知Spring的运行期,Spring和ioc创建是基于xml还是注解的,并说明位置
@ContextConfiguration
- locations:指定xml文件的位置,加上classpath关键字,表示类路径
- classes:指定注解类的位置
注意:
- 当我使用spring5.x版本的时候,要SpringConfigure求juit的java必须是4.1.2及以上
代码
@ContextConfiguration(classes =SpringConfiguration.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountServiceTest {
@Autowired
private IAccountService as;
@Test
public void testfindAll(){
List<Account>accounts=as.findAllAccount();
for(Account account:accounts){
System.out.println(account);
}
}