基于注解配置的SpringIOC容器案例
程序员文章站
2022-03-26 14:04:57
...
技术选型
- SpringIoc核心容器
- Springjdbc
- Mysql
- Junit
- Druid连接池
- Maven工程
需求分析
使用以上技术选型,使用Java代码实现简单的CRUD操作,在Spring的Ioc核心容器中,这里使用xml配置文件进行配置
环境搭建
-
Mysql环境
CREATE DATABASE spring;
CREATE TABLE account
(id primary key,auto_increment,
name varchar(50),
money varchar(50)
) -
创建Maven工程,导入依赖
<dependencies>
<!--SpringIoc容器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- Spring-jdbc 用于配置JdbcTemplate -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--Spring与junit整合-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
-
三层架构的搭建(并编写配置类)
-
编写druid.properties配置文件(使用Druid连接池技术连接数据库所必需的)
#驱动加载
driverClassName=com.mysql.jdbc.Driver
#设定连接对象的参数(要连接哪一个库,以及用户名,密码)
url=jdbc:mysql://127.0.0.1:3306/spring?serverTimezone=UTC
#连接数据库的用户名
username=root
#连接数据库的密码
password=123456
#初始化时池中建立的物理连接个数
initialSize=2
#最大的可活跃的连接池数量
maxActive=10
#获取连接时最大等待时间,单位毫秒,超过连接就会失效
maxWait=3000
编码实现
- Dao中的代码
//告知spring这是持久层类,创建该类对象,并存入核心容器 key=dao
@Repository("dao")
public class AccountDaoImpl implements AccountDao {
@Autowired
@Qualifier("template")
//自动注入数据,若bean中有符合类型数据,自动注入,若有多个符合类型数据
//采用key=template的bean对象
private JdbcTemplate template;
public void delete(Integer id) {
String sql="delete from account where id=?";
template.update(sql,id);
}
public List<Account> selectAll() {
String sql="select * from account";
List<Account> list = template.query(sql, new BeanPropertyRowMapper<>(Account.class));
return list;
}
}
- Service中的代码
//告知spring这是业务层类,创建该类对象存入容器 key=service
@Service("service")
public class AccountServiceImpl implements AccountService {
@Autowired
@Qualifier("dao")
//自动注入数据,查找容器中符合该类型的bean对象,若有多个
//采用key=dao的bean对象
private AccountDao dao;
public void delete(Integer id) {
dao.delete(id);
}
public void selectAll() {
List<Account> accounts = dao.selectAll();
for (Account account : accounts) {
System.out.println(account);
}
}
}
- Config父配置中的代码
/*告知spring,该类是一个父配置类,并说明在创建容器时要扫描的包,并导入子配置类*/
@ContextConfiguration
@ComponentScan("dao")
@ComponentScan("service")
@Import(PropConfig.class)
public class Config {
/*
* 在容器中创建一个DataSource对象,创建该对象时需要参数
* 若不指定@Qualifier,则会自动在容器中找有无符合的bean对象
* */
@Bean
//bean注解用于把当前方法的返回值作为bean对象存入spring的ioc容器中
public DataSource getDataSource(@Qualifier("prop") Properties prop) throws Exception {
return DruidDataSourceFactory.createDataSource(prop);
}
/*
* 在容器中创建一个JdbcTemplate对象,创建该对象时需要参数DataSource
* 自动在容器中找有无符合的bean对象
* */
@Bean("template")
//指定bean的id,默认值为当前方法的名称
public JdbcTemplate getTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
- PropConfig子配置类
/*加载外界properties配置文件,这里并没有什么用,可以通过value注解获取配置文件中的值*/
@PropertySource("classpath:druid.properties")
public class PropConfig {
/*
* 在容器中创建一个bean对象,是一个properties,key为prop
* */
@Bean(name="prop")
public Properties getProp() throws IOException {
Properties prop=new Properties();
prop.load(PropConfig.class.getClassLoader().getResourceAsStream("druid.properties"));
return prop;
}
}
- 测试类中的代码
//使用junit提供的一个注解 @Runwith把原有的main方法替换,替换成spring的
@RunWith(SpringJUnit4ClassRunner.class)
//告知spring的运行器,spring容器创建是基于xml还是注解的,并且说明位置
@ContextConfiguration(classes = {Config.class})
public class CRUDByAnnoTest {
@Autowired
//此时,spring整合了junit,junit会根据我们的配置,自动创建好容器
//已经有了容器,可以自动注入数据
private AccountService service;
@Test
public void delete() {
service.delete(3);
}
@Test
public void select() {
service.selectAll();
}
}