一、Spring的瞭解
Spring是一個輕量級的IOC/DI和AOP容器的開源框架。能夠實現Java模塊化開發,貫穿表現層,業務層,邏輯層,實現各層之間的解耦合關係。
IOC,控制反轉,將程序中手動建立對象的控制權交由Spring框架來管理,從而實現對象之間解耦合
AOP,面向切面編程,將功能代碼從業務邏輯代碼中分離,使之能夠更專一於業務
二、AOP的實現方式
AOP的實現方式有兩種:JDK動態代理和cglib實現
若是目標對象實現了接口,默認狀況下采用JDK的動態代理實現AOP,也能夠強制使用cglib實現AOP
若是目標對象沒有實現接口,必須採用cglib,Spring會自動在JDK動態代理和cglib之間切換
三、JDK動態代理如何實現
JDK動態代理,只能對實現了接口類生成代理,而不是針對類,該目標類型實現的接口都將被代理。原理是經過在運行期間建立一個接口的實現類來完成對目標對象的代理。具體步驟以下:
①、定義一個實現接口InvocationHandler類
②、經過構造函數,注入被代理類
③、實現invoke(Object proxy,Method method,Object[] args) 方法
④、在主函數中得到被代理類的類加載器
⑤、使用Proxy.newProxyInstance()產生一個代理對象
⑥、經過代理對象調用各類方法web
具體的實現代碼以下:編程
①、定義個接口,及對應接口的實現類session
public interface Subject { public void say(); public void sayHello(String str); }
public class RealSubject implements Subject{ @Override public void say() { System.out.println("just say"); } @Override public void sayHello(String str) { System.out.println("say Hello" + str); } }
②、定義一個實現接口InvocationHandler類,經過構造函數,注入被代理類,實現invoke(Object proxy,Method method,Object[] args) 方法框架
在主函數中得到被代理類的類加載器,使用Proxy.newProxyInstance()產生一個代理對象,經過代理對象調用各類方法分佈式
public class DynamicProxy implements InvocationHandler{ private Object subject; public DynamicProxy(Object subject) { this.subject = subject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在代理真實對象前咱們能夠添加一些本身的操做 System.out.println("before do something"); System.out.println("method=" + method); //當代理對象調用真實對象的方法時,其會自動的跳轉到代理對象關聯的handler對象的invoke方法來進行調用 method.invoke(subject, args); //在代理真實對象後咱們能夠添加一些本身的操做 System.out.println("after do something"); return null; } public static void main(String[] args) { //咱們要代理的真實對象 Subject realSubject = new RealSubject(); //咱們要代理哪一個真實對象,就將該對象傳進去,最後是經過該真實對象來調用其方法的 InvocationHandler hander = new DynamicProxy(realSubject); /* * 經過Proxy的newProxyInstance方法來建立咱們的代理對象,咱們來看看其三個參數 * 第一個參數realSubject.getClass().getClassLoader() ,咱們這裏使用realSubject這個類的ClassLoader對象來加載咱們的代理對象 * 第二個參數realSubject.getClass().getInterfaces(),咱們這裏爲代理對象提供的接口是真實對象所實行的接口,表示我要代理的是該真實對象,這樣我就能調用這組接口中的方法了 * 第三個參數handler, 咱們這裏將這個代理對象關聯到了上方的 InvocationHandler 這個對象上 */ Subject dynamicProxySubject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), hander); System.out.println(dynamicProxySubject.getClass().getName()); dynamicProxySubject.say(); dynamicProxySubject.sayHello("haha"); } }
四、Spring中Bean的做用域
在默認的狀況下,Spring IOC容器只會對Bean建立一個實例
Spring提供了5中做用域,經過@Scope註解來設置
①、singleton(單例):在Spring IOC容器中僅存在一個Bean實例,默認的Scope設置
②、prototype(多例):每次從容器中調用Bean時,都會返回一個新的實例
③、request(請求):用於web開發,將Bean放入request範圍,request.setAttribute
(「XXX」),在用一個request得到同一個Bean
④、session(會話):用於web開發,將Bean放入Session範圍,在同一Session得到同一個Bean
⑤、globalSession(全局會話):通常用於Porlet應用環境,分佈式系統存在全局session概念,若是不是porlet環境等同於Sessionide