1)單例對象,如果多線程訪問的情況下,有線程安全的問題;
2)解決IOC依然有XML的問題;
3)config.SpringConfiguration,該類是一個配置類,其作用相當於bean.xml
4)@Bean: 用於把當前方法的返回值作爲bean對象存入spring的IOC容器中:
屬性:
name: bean的id, 當不寫時,默認值是當前方法名稱
5)@Import(xxx.class): 用於導入其它的配置類;
class<?>... xxx: 可變參數
6)@PropertySource
7)Spring整合JUnit的配置:
不能更改別人的class字節碼
8)@Runwith: 整合JUnit的, 替換Main函數的
9)事務的引入:
(1)中間出現了異常,發現加和減對不上
分析: 4次操作,有4個connection,每一個connection都會有一個事務.
解決方案: 只用一個connecttion--》ThreadLocal對象的引入:
使用ThreadLocalUI想baConnection和當前線程綁定,從而一個線程中只有一個能控制事務的對象
(2)之前沒有問題的原因: 每次操作都會創建一個對象,每次數據庫操作,都會從連接池中拿出一個連接
AOP優勢的引入:
10)ThreadLocal:
連接的工具類,它用於從數據源中獲取一個連接,並且實現和線程的綁定;
獲取當前線程上的連接;
11)連接池
(1)web app在tomcat啓動時,創建出來連接, 在外部使用時,保證執行效率;
12)已經close的連接時歸還到連接池了,要和Threadlocal解綁
13)讓Service有事務的控制
14)保證方法間的獨立,不讓有方法間的這種耦合關係;
15)動態代理解決的問題:
(1)生產廠家
(2)--》經銷商/代理商(銷售、售後)
(3)6999的電腦買到後, 經銷商還是6999嗎? 很可能是低很多,可能是4999, 另外2000可能是庫房、培訓等..
(4)我們不能和生產廠家聯繫了, 生產廠家只是生產電腦
代理實現了功能增強
16)認識接口
(1)java中接口就是標準,你必須實現
17)動態代理:
特點: 字節碼隨用隨創建,隨用隨加載;
作用:在不修改源碼的基礎上對方法增強;
分類: 基於接口的動態代理
涉及的類: Proxy
提供者: 官方
如何創建代理對象:
使用Proxy類中的newProxyInstance方法:
參數:
ClassLoader: 類加載器(固定寫法)
用於加載代理對象字節碼的,寫的是: 和被代理對象使用相同的類加載器;
Class[]: 字節碼數組(固定寫法)
它是用於讓代理對象和被代理對象有相同的方法。
InvocationHandler: 用於提供增強的代碼
它是讓我們寫如何代理,我們一般都是寫一個該接口的實現類,通常情況下都是匿名內部類(非必須)
作用: 執行被代理兌現改的任何接口都會經過該方法.
proxy: 代理對象的引用
method: 當前執行的方法
args: 當前執行方法所需的參數
return: 和被代理對象有相同的返回值
// 提供增強的代碼
1.獲取參數 args[0]
2.判斷當前方法是不是銷售 method.getName()
return method.invoke(producer, args)
要求: 被代理類至少實現一個接口,沒有則不能使用. 因此問題也是: 不識閒任何接口,則不可以用.
基於子類的動態代理(cglib)
涉及的類: Enchancer
提供者: 第三方cglib
如何創建對象:
使用Enhancer的create方法:
Class
Callback
MethodInterceptor:
intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
Enchaner.create(producer.getClass())
18)使用:
加回到池子裏
亂碼方法的增強
19)1個實現類,一個實現動態代理的
@Autowired
@Qualifier("proxyAccountService")
private IAccountService as;
11)配置中變得繁瑣了,那麼如何簡化配置呢? AOP來啦!!!