初学习Spring时,从网上找的一些知识并把它汇总在了一块
Ø 什么是Spring组件和依赖注入机制,为什么说Spring组件的依赖关系减少?
Spring的组件应该是bean.也就相当于一个java类.
Spring依赖注入机制是将bean中用到的属性通过XML文档配置,而不是硬编码在程序中.再通过Spring的框架获得该bean,这时框架自动根据XML文档将属性设置进该bean.
将属性的培植放到XML文件中使各个bean可以不用写关于其他的bean的设置代码,也就是相当于自己的属性不用通过其他bean来设置,其他的bean是什么,在哪里,该bean都不用管,完全交给Spring框架来配置.
举个例子:
若有个bean,c1 依赖另一个 bean,c2, 具体的说可以是c1的属性a1需要c2的a2()来初试化,则在c1中要写成:
c2 cc2 = new c2();
a1 = cc2.a2();
而用Spring就可以什么都不用写,只要c1中有函数void setA1(type a1)就可以了.
不用在c1中写入关于c2的内容,所以就没有了各bean间的依赖
Spring 基础
依赖注入的三种方式:
interface injection / setter injection / constructor injection
现在比较常用的是:setter / constructor注入,一个接口可以由多个实现。
spring 利用DBCP获得连接池:(当spring 运行在一个不提供datasource的环境时)
使用org.apache.commons.dbcp.BasicDataSource作为数据源注入
需要在classpath中加入:commons-dbcp.jar/commons-pool.jar/commons-collections.jar
spring 的jndi数据源配置:
利用org.springframework.jndi.JndiObjectFactoryBean注入
classpath中加入:spring-context.jar
在tomcat中用DBCP取得连接池,通过jndi的方式来取得数据库连接;
利用TransactionProxyFactoryBean
<prop key="insert*">PROPAGATION_REQUIRED,readOnly,-RollbackableBizException</prop>
意思:以insert开头的方法在目前的事务中操作,
PROPAGATION_REQUIRED:如果不存在就新建一个
readOnly:只读
-RollbackableBizException:发生指定异常时回滚事务
+RollbackableBizException:发生指定异常时提交事务
最大特点:独立于具体的关系型数据库
在使用hibernate和spring整合的时候,可以将事务管理交给spring来处理,可以用声明式的事务处理。
只需使用org.springframework.orm.hibernate.HibernateTransactionManager,同时注入:sessionFactory
Bean Wrapper
DI(Dependency Injection,依赖注入)的理解:是在运行期,由Spring根据配置文件,将其他对象的引用通过组件的提供的setter方法进行设定(DI的第二种实现方式)
//动态加载了User类并实例化
Object obj = Class.forName("net.xiaxin.beans.User").newInstance();
//通过BeanWrapper set 对象的属性值
BeanWrapper bw = new BeanWrapperImpl(obj);
bw.setPropertyValue("name", "Erica");
BeanWrapper实现理解:动态加载User类,通过调用User.setName()方法设置name属性。
Bean Factory
bean的配置项目:
<bean
id="TheAction" ⑴------------------BeanFactory获取JavaBean实例时需以此作为索引名称
class="net.xiaxin.spring.qs.UpperAction" ⑵-------类名
singleton="true" ⑶----------------"true"_BeanFactory作用范围内,只维护此Java Bean的一个实例;"false"_获取Java Bean时,BeanFactory每次都将创建一个新的实例返回
init-method="init" ⑷----------用于资源的初始化
destroy-method="cleanup" ⑸----用于资源释放
depends-on="ActionManager" ⑹-----一般不用配置
>
理解:可以看成一个EJB容器,提供生命周期服务、事务服务、安全性服务、缓存服务等。
ApplicationContext
ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特性,可以在web.xml中对ApplicationContext配置。
ApplicationContext提供的扩展功能:
1-国际化支持
2-资源访问:ApplicationContext.getResource方法提供了对资源文件访问支持
3-事件传播
理解:同BeanFactory类似,ApplicationContext提供了BeanFactory的所有功能。
ApplicationContext主要是针对Java EE应用而来的,尤其是Web应用(WAR)。
ApplicationContext会被注册到ServletContext对象中。
Web Context
加载器:ContextLoaderListener / ContextLoaderServlet
分别在web.xml中添加:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Web容器会自动加载/WEB-INF/applicationContext.xml并初始化
指定配置文件位置情况:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext-common.xml;
/WEB-INF/classes/applicationContext-aop.xml;
/WEB-INF/classes/applicationContext-bs.xml;
/WEB-INF/classes/applicationContext-dao.xml;
/WEB-INF/classes/applicationContext-ucc.xml
</param-value>
</context-param>
配置完成之后就可以通过:WebApplicationContextUtils.getWebApplicationContext方法得到ApplicationContex引用。
JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库。
要通过JDBC来存取某一特定的数据库,必须有相应的JDBC driver,它是连接JDBC API与具体数据库之间的桥梁。
hibernate.jdbc.fetch_size:用来决定JDBC的获取量大小 50
hibernate.jdbc.batch_size:会开启Hibernate使用JDBC2的批量更新功能取值达到多少数据提交一次. 建议值在 5 和 30之间。
spring 的事务管理:(有编程/声明两种)
自动连接DB的方式效率比较低下,可以预先设定好一定数量的连接并存放在connection pool中,提高效率。