[Java] Spring 學習筆記

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

相關文章
相關標籤/搜索