您的位置:首页 > 编程语言 > Java开发

在Spring中装配DAO以及两种依赖注入方式

2018-03-23 20:08 711 查看
传统的JDBC API太底层,即使用户执行一条最简单的数据库查询操作,都必需执行如下过程:加载驱动-获取连接--创建Statement-执行数据操作-获取结果-关闭结果集-关闭Statement-关闭连接,除此之外还需要进行异常处理的操作.使用传统的jDBC API 进行数据访问操作,则会产生1/3以上单调乏味的重复性代码.
但是值得庆幸的是,在Spring中,连接数据库的操作十分方便,springJDBC对传统的JDBC API进行了薄层封装,将样版式和那些必不可少的代码进行了分离,用户仅需编写那些必不可少的代码,剩余的那些单调乏味的重复性工作则交由Spring JDBC框架处理.简单来说,SpringJDBC通过一个模板类org.springframework.jdbc.core.jdbcTemplate封装了样板式的代码,用户通过模板类就可以轻松地完成大部分数据访问操作.用户对数据进行操作时,只需要调用模板,然后调用对应地数据库操作方法尽可以对数据库中的数据库进行操作,用户不用担心获取连接,关闭连接,异常处理等繁琐的事务.非常的方便.

那么Spring中DAO类如何访问数据库? 用JdbcTemplate代表封装后的直接操作对象.而JdbcTemplate本身需要一个DataSource,这样JdbcTemplate就可以根据需要从DataSource中获取或返回连接.DAO类会提供一个带@Autowired注解的JdbcTemplate变量,所以必须先声明一个数据源,然后定义一个JdbcTemplate Bean,通过Spring的容器上下文自动绑定机制进行bean的注入.这里需要以配置文件的形式进行配置有关数据库的信息配置文件基本结构:
<!--基本配置结构需要导入相应的jar文件支持-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.4.0xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> </beans>
<!--有关数据库的信息-->
<context:component-scan  base-packege="com.smart.dao"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destory-method="close"
p:drverClassName="com.mysql.jdbc.Driver"
p:url="jdbc.mysql://localhost:3306/sampledb"
p:password="root"
p:password="123456"/>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.jdbcTemplate"
p:dataSouce-ref="dataSource"/>
</beans>

在配置文件中,Spring配置bean实例通常通过id属性指定两个属性:id:指定该Bean的唯一标识,程序通过id属性值来访问该Bean实例.(相当一个实例化的对象名)class:指定该Bean的实现类,此处不可再用接口,必须使用实现类,Spring容器会使用XML解析器读取该属性值,并利用反射来创建该实例类的实例. 通过Spring管理Bean的灵巧性.Bean与Bean之间的依赖关系放在配置文件组织里,而不是写再代码中.通过配置文件的指定,Spring能够精准地为每个Bean注入属性.因此,配置文件里的<bean.../>元素的class属性值并不能是接口,而必须是真正的实现类. Spring会自动接管每个<bean../>定义里的<property../>元素定义,Spring会在调用无参数的构造起后,创建默认的Bean实例后,调用对应的setter方法为程序注入属性值.<property.../>属性的属性值将不再由Bean来主动设置,管理,而是接收Spring的注入. 每个Bean的id属性是该Bean的唯一标识,程序通过id属性访问Bean,Bean与Bean的依赖关系也通过id属性关联.

Spring出现了,当然也会出现一个能够获取Spring容器中资源的总部:
ApplicationContext ctx = new ClassPathXmlApplication("bean.xml");

Spring容器就是一个巨大的工程,它可以"生产"出所有类型的Bean实例.程序获取Bean实例的方法是 getBean().配置文件中:使用<construct-arg../>元素指定构造器的参数.该元素还有一个index属性,用于指定构造参数值将作为第几个构造参数值,index=0表明该构造参数将作为第一个构造参数, 执行效果与设值注入时的执行效果完全一样,区别在于:设值注入先是通过无参的构造器创建一个Bean实例,然后调用对应的setter方法注入依赖关系; 而构造注入则直接调用有参数的构造器,当bean实例创建完成后,已经完成了依赖关系的注入两种注入方式的比较 Spring同时支持两种依赖注入方式:设值注入和构造注入.这两种依赖注入的方式,并没有绝对的好坏,只是适应的场景不同.相比之下,设值注入具有如下优点:1.与传统的javaBean的写法更相似,程序开发人员更容易理解,接受.通过setter方法设定依赖关系显得更加只管,自然.2.对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读,Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因此导致性能下降.而设值注入,则能避免这些问题.3.在某些属性可选的情况下,多参数的构造器更加笨重构造注入也不是绝对不如值注入,在特定的场景下,构造注入比设值注入更优秀.构造注入有如下优势:1.构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入.例如,组件中其他依赖关系的注入,常常需要依赖于Datasource的注入.采用构造注入,可以在代码中清晰地决定注入顺序.2.对于依赖关系无须变化地Bean,构造注入更有用处.因为没有setter方法,所有的依赖关系全部在构造器内设定.因此,无须担心后续的代码对依赖关系产生破坏.3.依赖关系只能在构造器内设定,则只有组件的创建者才能改变组件的依赖关系.对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的的原则. 但在开发中建议使用设值注入为主,构造注入为辅注入策略.对于依赖关系无须变化的注入,尽量采用构造注入,而其他的依赖关系的注入,则考虑采用设值注入.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: