Spring3.0 面向抽象(接口)編程
用面向對象的思惟考慮問題 : 第一步【先考慮實體類】
1, 設計東西 :須要先考慮實體類。
JUDE 一個 相似 UML 的工具。
2, 設計 :圖
UserDAO : 負責和不一樣的數據庫打交道。等價於它直接屏蔽了數據庫。(是interface)
UserService : 用戶管理服務層。 其中有 private UserDAO userDAO; 成員變量
對外公開的是業務邏輯,之後好比認證,權限...。
UserDAOImpl implements UserDAO
UserDAOImpl 能夠分爲 MysqlImpl, OracleImpl, ... 面向抽象編程(好處靈活)
裝修房子用壁紙 : 用符合國家生產規格的壁紙。 (尚學堂, 夏學堂生產的)
馬士兵 :10 年買起房子.
3, 各類 DAO, DAO 太多, TeacherDAO, ..., 將其寫到配置文件中去。
4, Spring , xml配置文件 項目驅動是最快的學習方式。
(1), jdom學習 :讀取 xml 文件. google 搜索 例子 :class Sample1.
dom4j 比 jdom 要強大一些。
之前馬老師用的 JUnit, 這塊你不要懼怕,藐視它就能夠,有它的視頻。
5, spring 的核心,在於自動裝配。
能夠在配置文件中,將不少類的關係設計好。
beans.xml
<beans>
<bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"/>
<bean id="userService" class="com.bjsxt.service.UserService">
<property name="userDAO" bean="u"/>
<!-- 表明 userService 中有一個 setUserDAO 的方法,也就間接表明 其中有一個 userDAO 成員變量,其值初始化爲 id 爲 u 的 class。-->
</bean>
</beans>
一個類 UserService 裏面 一個屬性,能夠給你指定好。在它生成的時候,就能夠指定。
就看你配置文件怎麼寫。
6, 什麼是 IOC (DI), 有什麼好處?
(1), 把本身 new 的東西改成容器提供
(a), 初始化具體值
(b), 裝配
(2), 好處, 靈活配置
7, Spring 的兩大核心 : (1) IOC (2) AOP
8, Spring 介紹 。 讀 Spring API
問 :spring3.1 這個 spring.jar 怎麼不在 dist 文件夾裏,是否是還要額外下載jar包?
答 :spring3.0以上已經沒有提供完整的spring包了,按功能模塊被分解成了,實際開發時,選擇你須要的包便可,core,beans,context,
在使用web開發中通常都須要被加入,若是你實際應用使用了aop等,這些包也要被加入。
9, // dependency injection - 依賴注入 示例程序中, UserService, DAO 都依賴於 容器的 注入
/* inversion of control 什麼是控制反轉?
(1), Service 成員 userDAO 控制在容器手裏了,不用本身new實現。反轉到容器那裏去了!
(2), 原來編程控制的是實現,如今是接口,是抽象, 反轉到抽象
(3), 你控制的是接口,而不是整個實現了!原來控制在本身手裏,如今控制在別人的容器手裏了。 「控制反轉」
*/
@(1), 指定 XML, catalog 書寫規範與提示 Spring_09 自動提示 馬士兵.avi
注入類型
Spring_0300_IOC_Injection_Type
setter(重要)
構造方法(能夠忘記)
接口注入(能夠忘記)
@(2), 以上講解的都是 setter 注入
11, annotation
@(1), 普通 java 文件 中 @overvide 編譯期間
Annotation-based container configuration
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
</beans>
---------------------------------------------------------------------------------------
(The implicitly registered post-processors include
AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor, RequiredAnnotationBeanPostProcessor.)
----------------------------------------------------------------------------------------
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 這個文件至關於當前 xml 文件的命名空間
xmlns = xml namespace xmlns:context="http://www.springframework.org/schema/context" 命名空間
表明這個xml文件,以context開頭的對應的東西到哪裏找。
對應的可以寫的內容context="http://www.springframework.org/schema/context" 到哪裏去找
@2, xsd 文件 是元數據, 通常稱之爲 xml 的語法。
12, JSR-250
JCP (google網址) 指定 java 的新標準
annotation 開發效率高
13, AOP
@1, 慎用繼承 (由於繼承直接就寫死了!)
常常組合代替了繼承,組合靈活性更高!
@2, Spring 解決了單例的問題
動態代理 jdk 若是想產生動態代理,那麼這個類就須要實現一個接口,沒有implements接口的類,JDK是給它產生不了動態代理的。
jdk proxy invocationhander
14,
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();
li.setTarget(userDAO);
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
(1), 產生的代理對象的 classLoader 和 被代理對象的 classLoader 要同樣,由於代理對象中有一個 被代理對象,因此須要互相訪問。
(2), userDAO.getClass().getInterfaces() 代理類(對象) 要實現這個接口。
(3), 第三個參數,代理用哪個 Handler 進行處理。
(4), 由於代理類實現了 UserDAO 接口,抽象主題,因此進行強制轉換。(UserDAO)
System.out.println(userDAOProxy.getClass());
userDAOProxy.delete();
userDAOProxy.save(new User());
寫程序推薦,面向接口編程。
15, <aop:aspectj-autoproxy />
把邏輯織入到原來那個方法裏面去。
@Aspect 說明這是一個切面類
@Component 初始化這個類
public class LogInterceptor {
@Pointcut("execution(public * com.bjsxt.service..*.add(..))") 指定這個切面點
public void myMethod(){};
@Before("myMethod()") 加在前面
public void before() {
System.out.println("method before");
}
@Around("myMethod()") 先後都加
public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("method around start");
pjp.proceed();
System.out.println("method around end");
}java
什麼是AOP
1, 面向切面編程Aspect-Oriented-Programming
a), 是對面向對象的思惟方式的有力補充
2, Spring_1400_AOP_Introduction
3, 好處:能夠動態的添加和刪除在切面上的邏輯而不影響原來的執行代碼
a), Filter
b), Struts2的interceptor
4, 概念:
a), JoinPoint 釋意: 切面與原方法交接點 即 切入點
b), PointCut 釋意: 切入點集合
c), Aspect(切面)釋意:可理解爲代理類前說明 【是切面】
d), Advice 釋意:可理解爲代理方法前說明 例如@Before [切入到那個點上的邏輯]
e), Target 釋意:被代理對象 被織入對象
f), Weave 釋意:織入
** 寫程序的業務邏輯不要依賴某種前後順序。
一個類若是沒有實現接口,那麼咱們就用拋出二進制碼的形式實現代理,CGLIB。實現接口了的,就用JDK proxy實現代理。
Annotation 實現 AOP 不是很重要的內容,留下印象。
Spring AOP配置與應用
1, 兩種方式:
a), 使用Annotation
b), 使用xml
2, Annotation
a), 加上對應的xsd文件spring-aop.xsd
b), beans.xml <aop:aspectj-autoproxy />
c), 此時就能夠解析對應的Annotation了
d), 創建咱們的攔截類
e), 用@Aspect註解這個類
f), 創建處理方法
g), 用@Before來註解方法
h), 寫明白切入點(execution …….)
i), 讓spring對咱們的攔截器類進行管理@Component
IOC 和 AOP 是 Spring 的兩大核心概念
聲明式的事務管理 , dataSource 是提供標準化鏈接的方式。
在 Spring 中指定 dataSource, dataSource就是標準化取得鏈接的方式。
web