QueryRunner 的使用参考
dao层接口实现
@Componentpublic class AccountDaoImpl implements AccountDao {@Autowiredprivate QueryRunner queryRunner;public void saveAccount() {try{queryRunner.update("insert into user(username,address) values(?,?)","huge","address");}catch (Exception e){e.printStackTrace();}}}
业务层接口实现
@Component(value = "userService")public class UserServiceImpl implements UserService {@Resource(name = "accountDaoImpl")private AccountDao accountDao;public void save() {accountDao.saveAccount();}}
xml配置:
<context:component-scan base-package="com.huge"/><!--配置QueryRunner--><bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner"><constructor-arg name="ds" ref="dataSource"></constructor-arg></bean><!-- 配置数据源 com.mchange.v2.c3p0.ComboPooledDataSource --><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/test"></property><property name="user" value="root"></property><property name="password" value="1234"></property></bean>
可以看到对于QueryRunner这种类,不是我们自己创建只能在xml中配置创建这个类型的对象,不能通过传统的注解创建对象
但是spring提供了新的注解,创建一个配置类,可以完全替换application.xml的配置
spring中的新注解
Configuration
作用:指定当前类是一个配置类
细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
ComponentScan
作用:用于通过注解指定spring在创建容器时要扫描的包
属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。使用此注解就等同于在xml中配置了:
<context:component-scan ase-package="com.huge"></context:component-scan>
@Configuration//表明是一个配置类@ComponentScan("com.huge")//相当于开启了注解扫描器public class SpringConfiguration {}
Bean
作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称
细节:使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。查找的方式和Autowired注解的作用是一样的
@Configuration//表明是一个配置类@ComponentScan("com.huge")//相当于开启了注解扫描器public class SpringConfiguration {@Bean//注:如果这个dataSource这个对象在容器中没有就会报错//这样方法的返回一个QueryRunner 对象会存入spring的容器中public QueryRunner createQueryRunner(DataSource dataSource){return new QueryRunner(dataSource);}@Beanpublic DataSource createDateSource() throws Exception {ComboPooledDataSource source = new ComboPooledDataSource();source.setDriverClass("com.mysql.jdbc.Driver");source.setJdbcUrl("jdbcUrl");source.setUser("root");source.setPassword("1234");return source;}}

这样一来,整个的配置文件都不需要了
测试方法:
注意需要使用AnnotationConfigApplicationContext这个类来启动注解配置类
//加载注解配置类,使用SpringConfiguration.class作为参数,此时@Configuration这个注解可以不写ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);UserService userservice = (UserService)context.getBean("userService");userservice.save();
一般开发中:可能有多个配置类,例如
增加要给配置类专门配置JDBC的类JdbcConfiguration .java


主配置类:
@Configuration//表明是一个配置类,当作为对象参数是,可以不写@ComponentScan("com.huge")//相当于开启了注解扫描器public class SpringConfiguration {}
Import
作用:用于导入其他的配置类
属性:value:用于指定其他配置类的字节码。使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
主配置类:
@Configuration//表明是一个配置类,当作为对象参数是,可以不写@ComponentScan("com.huge")//相当于开启了注解扫描器@Import(JdbcConfiguration.class)//导入其他类作为配置类public class SpringConfiguration {}
注意:

但是使用了@Import(JdbcConfiguration.class)还是可以运行,这样配置类的层次就很清晰,相当于之前的主配置文件中引入别的配置文件
PropertySource
作用:用于指定properties文件的位置
属性:value:指定文件的名称和路径。
关键字:classpath,表示类路径下
之前配置数据连接信息时需要的信息都是写的,现在需要从配置文件中取
jdbcConfig.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/testjdbc.username=rootjdbc.password=1234
使用@PropertySource加载配置文件信息
@Configuration//表明是一个配置类,当作为对象参数是,可以不写@ComponentScan("com.huge")//相当于开启了注解扫描器@Import(JdbcConfiguration.class)//导入其他类作为配置类@PropertySource("classpath:jdbcConfig.properties")public class SpringConfiguration {}
public class JdbcConfiguration {@Value("${jdbc.driver}")private String driverClass;@Value("${jdbc.url}")private String jdbcUrl;@Value("${jdbc.username}")private String user;@Value("${jdbc.password}")private String passeWord;
Qualifier在配置类的方法中 使用

使用Qualifier可以强制使用成名称注入
@Bean(name = "queryRunner")public QueryRunner createQueryRunner(@Qualifier(value = "ds") DataSource dataSource){return new QueryRunner(dataSource);}@Bean("ds")public DataSource createDateSource() throws Exception {ComboPooledDataSource source = new ComboPooledDataSource();source.setDriverClass(driverClass);source.setJdbcUrl(jdbcUrl);source.setUser(user);source.setPassword(passeWord);return source;}
喜欢,转发
明天见





