Spring
IOC(控制反轉)
1. 把程序創建對象的控制權轉移到第三方。
2. 滿足依賴倒轉原則
- 誰控制誰:在傳統的開發模式下,我們都是採用直接 new 一個對象的方式來創建對象,也就是說你依賴的對象直接由你自己控制,但是有了 IOC 容器後,則直接由 IoC 容器來控制。所以“誰控制誰”,當然是 IoC 容器控制對象。
- 控制什麼:控制對象。
- 爲何是反轉:沒有 IoC 的時候我們都是在自己對象中主動去創建被依賴的對象,這是正轉。但是有了 IoC 後,所依賴的對象直接由 IoC 容器創建後注入到被注入的對象中,依賴的對象由原來的主動獲取變成被動接受,所以是反轉。
- 哪些方面反轉了:所依賴對象的獲取被反轉了。
3. IOC的實現方式有依賴注入
-
依賴注入有3種方式:set方法注入,構造方法注入,其他方式注入。配置文件加載後,bean已經創建好了,放入spring容器裏面了
-
Set方式注入:
String注入:直接value注入
對象注入:用ref注入
數組[]注入:<array></value></value></array>\注入
List注入:<list></value></value></list>\注入
Map注入:<map><entry key="" value=""/></map>\注入
Set集合注入:<set></value></value></set>\注入
4. Bean的作用域(默認是單例)
- singleton:單例
生命週期:
創建:配置文件一讀就創建
活着:只要容器沒有關閉,就一直活着
死了:容器關閉 - prototype:原型模式,每次getBean都會產生一個新的對象
生命週期:
創建:什麼時候使用,什麼時候創建
活着:對象一直被用,就一直活着
死了:太久沒用被垃圾回收機制回收 - request: http請求,每次請求都會創建一個新的bean
- session: 每次會話創建新的
- application:
- websocket:
5. Spring種Bean的三種裝配方式
- 在xml種顯示的配置(前面的都是這種)
- 在java中顯示配置:在bean標籤中 加入autowire屬性,value可以是byName,byType。
- 隱式的自動裝配bean(重要)
- 開啓註解支持
@Autowired(require=true):自動注入,假如爲false,則該屬性可以爲空,默認是通過byName實現
@Resource:也是自動裝配,默認通過byname,如果找不到名字,則通過byType
@Qualifier(value=“dog222”):直接指定找哪個注入
@Nullable:字段標記了該註解,說明可以爲空
6. 註解開發
要使用註解開發,必須導入aop的包,並指定要開啓註解掃描的包
@Component:在類上加,標明該類是一個組件
@Repository,@Service,@Controller:是@Component衍生的註解,在dao,service,controller使用
@Scope:標明作用域
@Value(“laowang”):在屬性上加,相當於給屬性注入值
7. javaConfig
@Configuration:在類使用,表明是配置類
@Bean:在配置類中方法使用,相當於寫了bean標籤
AOP(面向切面編程)
1. 靜態代理
實現同一個接口,然後對其增加附屬操作即可
2. 動態代理(CGlib)
動態代理類實現InvocationHandler接口
調用proxy類靜態方法new一個proxy對象
3. AOP的實現方式
-
方式一:使用springAPI接口
1.讓日誌類實現***Advice接口,具體作什麼附屬操作
2.在xml中配置bean
3.配置aop
先配置切入點< aop:pointcut id="" expression=“expression(***)” >
在配置做什麼增強,相當於把bean和這個切點作綁定
< aop:advisor advice-ref=“上面的bean的id”,pointcut-ref=“切點id”> -
方式二:自定義類配置切面實現AOP(比方式一多了切面配置)
1.寫一個日誌類,具體作什麼附屬操作
2.在xml中配置bean
3.配置aop
先配置切面:< aop:aspect ref=“日誌類”></aop:aspect>
在切面中配置切點:< aop:pointcut id=" " expression=“expression(***)” >
接着配置通知,在方法前,後調用: < aop:before method=“before” pointcut-ref=“切點id” > -
方式三:使用註解實現
1.在切面類加上@Compnent,@Aspect註解
2.方法加上@Beafore,@After(參數是切入點表達式expression=“expression(***)”)
3.開啓註解支持
4. 聲明式事務
- 配置一個bean:事務管理器
- 配置事務通知:
< tx:advice id=“txAdvice” transaction-manager=“事務管理器id”>
3.在事務通知裏配置哪些方法需要開啓事務:
< tx:method name:“add”>
4.最後用方式一方式配置事務的切入