暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring 06 新注解

敲代码的人 2019-09-03
197

QueryRunner 的使用参考


DBUtils(apache开源项目) 介绍


dao层接口实现

@Component
public class AccountDaoImpl implements AccountDao {

@Autowired
private 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);
}
    
@Bean
public 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.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.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;
}


喜欢,转发

明天见

文章转载自敲代码的人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论