?? spring2.txt
字號:
十、spring最有價值的兩個功能?
ioc(inverse of control)/di:控制返轉/依賴注入
將類與類的依賴關系寫在配置文件中,程序在運行時
根據配置文件動態加載所依賴的類,讓類與類之間的依賴解藕合。
強藕合:
List al=new ArrayList();
弱一點的藕合:
IFacade facade=FacadeFactory.getFacade();
很弱的藕合:
spring的ioc,將依賴的類寫在配置文件中,
程序在運行的過程中動態加載,如果要換成另一個類
只需修改配置文件,客戶端及工廠都不用改。
十一、spring的三種注入方式?
set
構造子
接口
十二、spring的核心配置文件,請寫一個典型的配置?
--核心配置文件是appliationContext.xml
<beans>
<bean id="customer" class="vo.Customer" init-method="init" destroy-method="destroy">
<property name="customerName" value="張三">
<property name="sex">
<null/>
</property>
<property name="address">
<ref local="address"/>
</property>
</bean>
<bean id="address" class="vo.Address">
<property name="state" value="廣東">
</property
</bean>
<bean id="customer1" class="vo.Customer" init-method="init" destroy-method="destroy">
<constructor-args>
<value>張三</value>
</constructor-args>
<constructor-args>
<value>男</value>
</constructor-args>
<constructor-args>
<ref local="address"/>
</constructor-args>
</bean>
</beans>
--核心類
ApplicationContext ac=new XMLFileApplicationContextSupport("applicationContext.xml");
Object customer=ac.getBean("customer");
三、加載多個applicationContext.xml文件
在web.xml文件中加入如下內容:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml,classpath*:dao/applicationContext-*.xml,classpath*:applicationContext.xml</param-value>
<context-param>
action中overode Action的setServlet獲得spring的context對象,從而使用spring特性
public void setServlet(ActionServlet actionServlet) {
try {
super.setServlet(actionServlet);
ServletContext servletContext = actionServlet.getServletContext();
context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
} catch(Exception e) {
e.printStackTrace();
}
}
-------------------------struts2-------------------------
struts中可以有多個配置文件,一般是一個功能模板一個,不同團隊不影響,實現如下:
1、在/WEB-INF/下加入新的struts-config.xml文件
2、在web.xml中在ActionServlet的配置中說明具體的struts-config.xml文件所在位置
多個文件用,分隔開。
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config-1.xml,
/WEB-INF/struts-config-2.xml</param-value>
</init-param>
二、什么是aop?aop相關的名詞是什么?
aop是面向方面編程,是對oop的補充,oop主要是縱向的業務,aop主要
應用橫向的服務,主事務、日志、安全,不可以替代oop,只是補充。
aop相關的名詞:
攔截器(代理):向客戶端公開通過它找到真實對象。
真實對象:做具體的處理。
裝備:代理調用服務類如TransactionManager
關切點:為那些方法提供什么樣的服務,如是否需要的事務。
連接點:連接的是方法還是屬性,一般是方法。
三、spring&hibernate的配置過程?
dataSource
sessionFactory
dataSource
userDao
sessionFactory
realFacade
userDao
transactionManager
sessionFactory
abstractProxy TransactionProxyFactoryBean:產生代理
transactionManager:引入裝備
transactionAttributes:什么方法需要什么樣的事務
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
<props>
facade parent="abstractProxy"
target=realFacade
四、代理模式
有三個角色,分別是通用接口、真實對象、代理,真實對象、代理
實現的同一個接口,將真實對象作為代理的一個屬性,向客戶端公開的
代理,客戶端調用代理的一方法時,代到調用真實對象的方法,在調用真實
對象的方法之間之后可以做一些服務。
五、什么是aop
aop不是oop,aop是面向方面編程,是對oop的一個補充
oop是縱向的業務處理,aop是橫向的服務,如事務、安全、
日志
六、aop實現的原理及名詞
aop實現的原理就是代理模式
名詞:
攔載器:代理
真實對象:本原
裝備:做具體的服務
關切點:哪些方法需要什么樣的服務
連接點:攔截的是方法還是屬性,一般是方法。
七、事務的實現
聲明式:什么方法需要什么樣的事務寫在配置文件中,
如spring的aop、ejb2、ejb3
代碼式:手動的寫代碼進行事務管理
con.setAutoCommit(false);
con.commit();
con.rollback();
Transaction trans=session.beginTransaction();
trans.rollback();
trans.commit();
八、struts與spring組合
1、在struts中加入一插件加載spring的配置文件applicationContext.xml
2、struts-config.xml中的action標簽內的type屬性不再指向具體的action
而是DelegatingActionProxy(代表action的代理),通過該代理進入spring
環境。
3、在spring中加入bean標簽,說明具體的action
<bean name="/insert" class="action.InsertAction">
<property name="facade">
<ref local="facade(是代理,只有代理才可以提供聲明式的事務服務)"/>
</property>
</bean>
三、spring&struts的組合?
1、在struts-config.xml加入一個插件加載applicationContext.xml文件
類是:ContextLoaderPlugIn
參數:
contextConfigLocation=/WEB-INF/applicationContext.xml
2、修改struts-config.xml中的action標簽的type屬性,其不再指向具體
Action,而是DelegatingActionProxy
3、在applicationContext.xml中配置具體的action
<bean name="/login" type="struts.action.LoginAction"/>
八、spring2的事務配置(三種方式)
(一)通過xml配置
1、加入tx及aop命名空間
2、通過tx說明關切點即那些方法需要什么樣的服務及裝備
<tx:advice id="facadeTransactonMethod" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="select*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
3、通過aop前綴說明被攔截的類,將攔截類與tx整合在一起。
<aop:config>
<aop:pointcut id="facadeClass" expression="execution(* facade.*.*(..))"/>
<aop:advisor advice-ref="facadeTransactonMethod" pointcut-ref="facadeClass"/>
</aop:config>
(二)通過注解配置:
在xml中加入如下標記,支持注解的事務處理
<tx:annotation-driven/>
在代碼中加入注解,說明具體的事務
需要事務處理
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
不需要事務處理
spring中的事務聲明,因xml格式說明用了schema,所以支持命名空間,使用了AspectJ語法
<!--說明事務策略,說明攔截那些方法-->
<tx:advice id="facadeTransactonMethod" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="select*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--攔截那些類-->
<aop:config>
<!--關切那些類-->
<aop:pointcut id="facadeClass" expression="execution(* facade.*.*(..))"/>
<aop:advisor advice-ref="facadeTransactonMethod" pointcut-ref="facadeClass"/>
</aop:config>
<!--啟動容器對注解型事務管理功能的支持,必須加,如果沒有,事務處理注解不起作用-->
<tx:annotation-driven/>
具體注解內容:
需要事務處理
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
不需要事務處理
@Transactional(readOnly=true) @Transactional(readOnly=true)
(三)applicationContext.xml
<bean id="customerDao" class="dao.impl.HibernateCustomerDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="buyDao" class="dao.impl.HibernateBuyDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="realFacade" class="facade.Facade">
<property name="buyDao" ref="buyDao"></property>
<property name="customerDao" ref="customerDao"></property>
</bean>
<!-- 配置通用的代理-->
<bean id="abstractProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 配置具體的facade代理 -->
<bean id="facade" parent="abstractProxy">
<property name="target" ref="realFacade"></property>
</bean>
<!--通過struts進行處理-->
<bean name="/insert" class="struts.action.InsertAction">
<property name="facade" ref="facade"></property>
</bean>
spring2的兩種事務處理
1、通過xml文件說明事務的規則。
--說明裝備及攔截那些方法給什么服務
<tx:advice id="methodAdvice" transaction-manager="transactionManager">
<tx:attribute>
<tx:method name="select*" read-only="true">
<tx:method name="*"/>
</tx:attribute>
</tx:advice>
--說明攔截那些類
<aop:config>
<aop:pointcut id="classPointcut" expression="execution (* facade.*.*(..))"/>
<aop:advisor advice-ref="methodAdvice" pointcut-ref="classPointcut"/>
</aop:config>
2、通過注解說明事務的規則
1、讓spring支持注解
<annotation-driven/>
2、在具體方法前加入注解說明需要什么樣的事務
八、spring2的事務配置
1、加入tx及aop命名空間
2、通過tx說明關切點即那些方法需要什么樣的服務及裝備
<tx:advice id="facadeTransactonMethod" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="select*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
3、通過aop前綴說明被攔截的類,將攔截類與tx整合在一起。
<aop:config>
<aop:pointcut id="facadeClass" expression="execution(* facade.*.*(..))"/>
<aop:advisor advice-ref="facadeTransactonMethod" pointcut-ref="facadeClass"/>
</aop:config>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -