一些新的注解
在做完之前的小练习后,我们发现配置文件依然存在,那么能不能完全使用注解的方式来使用spring框架呢?
下面就介绍一些新的注解
@Configuration
作用: 指定当前类是一个配置类
@ComponentScan
作用: 用于通过注解指定spring在创建容器时要扫描的包
属性: value或basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
@bean
作用: 用于把当前方法的返回值作为bean对象存入spring的核心容器中。
属性: name,用于指定bean的id。当不写时,默认值是当前方法的名称。
细节: 当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中寻找有没有可用的bean对象。查找的方式与Autowired注解相同。
@Import
作用: 用于导入其他的配置类
属性: value,用于指定其他配置类的字节码。当我们使用Import注解后,有Import注解的就是父配置类,而导入的就是子配置类。
@PropertySource
作用: 用于指定properties文件的位置
属性: value,指定文件的名称和路径。
关键字: classpath表示配置文件在类路径下
这时候创建一个SpringConfiguration类,进行我们的纯注解改造
package com.tianqicode.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.context.annotation.*;
import javax.sql.DataSource;
/**
* 这是一个配置类,它与bean.xml的作用是一样的
*/
//这是一个配置类
@Configuration
//指定spring要扫描的包
@ComponentScan(value = "com.tianqicode")
//导入子配置类
@Import({JdbcConfig.class})
//导入配置文件
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {
}
在上面这个父配置类中,我们导入了子配置类JdbcConfig.class,以及使用PropertySource导入了配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaStudy
jdbc.username=root
jdbc.password=admin
子配置类内容
package com.tianqicode.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 javax.sql.DataSource;
//子配置类
public class JdbcConfig {
//使用Value注解注入读入的配置文件内容
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 用于创建一个QueryRunner对象
* @param
* @return
*/
@Bean(name = "runner")
public QueryRunner creatQueryRunner(DataSource ds) {
return new QueryRunner(ds);
}
/**
* 用于创建一个数据源对象
* @return
*/
@Bean(name = "dataSource")
public DataSource creatDataSource() {
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);
}
}
}
到此为止,我们的纯注解方式就改造好了,现在去运行测试类
发现我们获取核心容器的方式还是使用配置文件获取。
修改一下,使用注解的方式获取核心容器
@Test
public void testFindAll() {
//ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//在这里写入配置类的类型,使用AnnotationConfigApplicationContext类获取。
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
AccountService accountService = (AccountService) ac.getBean("accountService");
List<Account> accounts = accountService.findAllAccount();
for (Account account : accounts) {
System.out.println(account);
}
}
点击运行测试类,运行成功。