SpringAop的依賴(lài)注入方式
SpringAop依賴(lài)注入
1.Spring
它是一個(gè)輕量級(jí)和IOC(DI)和AOP的 容器框架:
- IOC:控制反轉(zhuǎn) 現(xiàn)在創(chuàng)建bean的方式,是交給spring幫我們創(chuàng)建。(理解)
- DI:依賴(lài)注入 spring它是容器框架,是一個(gè)bean(裝對(duì)象的)容器框架,spring幫我創(chuàng)建好對(duì)象之后,在把我們創(chuàng)建好的對(duì)象 注入到相應(yīng)的類(lèi)里面
- AOP:面向切面編程,Spring框架的AOP機(jī)制可以讓開(kāi)發(fā)者把業(yè)務(wù)流程中的通用功能抽取出來(lái),單獨(dú)編寫(xiě)功能代碼。在業(yè)務(wù)流程執(zhí)行過(guò)程中,Spring框架會(huì)根據(jù)業(yè)務(wù)流程要求,自動(dòng)把獨(dú)立編寫(xiě)的功能代碼切入到流程的合適位置。
AOP使用場(chǎng)景:
- ? 事務(wù)管理
- ? 日志管理
- ? 性能控制
2.spring的DI依賴(lài)注入
2.1.根據(jù)構(gòu)造器注入:
- index索引注入
<bean id="MyBean" class="cn.itsource._01_.MyBean"> <constructor-arg index="0" value="666" /> <constructor-arg index="1" value="石娃娃" /> </bean>
- name 參數(shù)名字注入
<bean id="MyBean" class="cn.itsource._01_.MyBean"> <constructor-arg name="id" value="1" /> <constructor-arg name="name" value="石大娃" /> </bean>
- type類(lèi)型注入
<bean id="MyBean" class="cn.itsource._01_.MyBean"> <constructor-arg type="java.lang.Long" value="1" /> <constructor-arg type="java.lang.String" value="石二娃" /> </bean>
2.2類(lèi)里面屬性注入
<property name="id" value="20"></property> <!-- name --> <property name="name" value="馮增昕"></property> <!-- String數(shù)組--> <property name="arrys" value="1999,12,05"></property> <!--list set--> <property name="list"> <list> <value>air jordan 1</value> <value>黑曜石</value> </list> </property> <property name="set"> <set> <value>adiads</value> <value>Yeezy750</value> </set> </property> <property name="helloBeanList"> <list> <ref bean="hb"></ref> <bean class="cn.itsource._01di.HelloBean"></bean> </list> </property> <property name="helloBeanSet"> <set> <ref bean="hb"></ref> <bean class="cn.itsource._01di.HelloBean"></bean> </set> </property> <!-- map--> <property name="hp"> <map> <entry key="star" value="星星"></entry> <entry key="sunshine " value="陽(yáng)光"></entry> </map> </property> <!--Properties 不支持中文 --> <property name="pro1"> <value> driverClassName=com.mysql.jdbc.Driver username=yu玉 </value> </property> <!-- 支持中文--> <property name="pro2"> <props> <prop key="driverClassName">com.mysql.jdbc.Driver</prop> <prop key="username">杰倫</prop> </props> </property>
2.3XML版本的自動(dòng)注入
default-autowire="byType" default-autowire="byName"
byType根據(jù)類(lèi)型,byName根據(jù)名字
2.4XML版本的注解引入
<context:component-scan base-package="cn.itsource._03_autoxml"></context:component-scan> <!-- 掃描注解: @Component, @Repository, @Service,@Controller -->
如果一個(gè)接口有兩個(gè)實(shí)現(xiàn)情況下:
- 方案一:一個(gè)接口有多個(gè)實(shí)現(xiàn)的情況下面 通過(guò)名字去區(qū)分
- 方案二:通過(guò)Resource這個(gè)注解
區(qū)別:
- @Autowired和@Qualifier 都是屬于spring的注解
- Resource使用jdk的注解 推薦使用Autowired和Qualifier,可以和spring進(jìn)行無(wú)縫銜接
- autowired默認(rèn)是根據(jù)類(lèi)型匹配,如果類(lèi)型匹配不上在根據(jù)名字匹配
- 而Resource默認(rèn)根據(jù)名字匹配,名字匹配不上就匹配類(lèi)型
如果你用的是Spring的注解,盡量全部使用Spring的標(biāo)簽
- AutoWired與Resource都表示注入對(duì)象
- AutoWired他是SPring提供的注解,@Resource是sun公司提供注解
- AutoWired默認(rèn)是根據(jù)類(lèi)型匹配,如果類(lèi)型匹配不上在根據(jù)名字匹配
- 建議大家使用Autowried 因?yàn)樗荢pring提供的注解,他能和Spring進(jìn)行無(wú)縫銜接集成,
- 而Resource默認(rèn)根據(jù)名字匹配,名字匹配不上就匹配類(lèi)型
3.Spring里面的AOP功能
3.1 AOP簡(jiǎn)述
- 定義: 面向切面編程(面向方面編程)
- Spring使用動(dòng)態(tài)代理織入。
- Spring支持我們?cè)诜椒ǖ那昂筇砑釉鰪?qiáng)代碼。
- Aop的功能作用Spring的兩個(gè)核心之一,也可以是Spring非常重要的功能。
3.2 Spring中aop的實(shí)現(xiàn)
1.若目標(biāo)對(duì)象實(shí)現(xiàn)了若干接口,spring使用JDK的java.lang.reflect.Proxy類(lèi)代理。
2.若目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)任何接口,spring使用CGLIB庫(kù)生成目標(biāo)對(duì)象的子類(lèi)。
3.使用該方案時(shí)需要注意:
- 對(duì)接口創(chuàng)建代理優(yōu)于對(duì)類(lèi)創(chuàng)建代理,因?yàn)闀?huì)產(chǎn)生更加松耦合的系統(tǒng)。對(duì)類(lèi)代理是讓遺留系統(tǒng)或無(wú)法實(shí)現(xiàn)接口的第三方類(lèi)庫(kù)同樣可以得到通知,這種方案應(yīng)該是備用方案。
- 標(biāo)記為final的方法不能夠被通知。spring是為目標(biāo)類(lèi)產(chǎn)生子類(lèi)。任何需要被通知的方法都被復(fù)寫(xiě),將通知織入。final方法是不允許重寫(xiě)的。
3.3 Springaop的配置
<context:component-scan base-package="cn.itsource._04_aopxml"></context:component-scan> <aop:config> <aop:pointcut id="pointcut" expression="execution(* cn.itsource._04_aopxml.service.I*Service.*(..))"></aop:pointcut> <!--配置通知--> <aop:aspect ref="txManager"> <!--前置通知--> <!--<aop:before method="begin" pointcut-ref="pointcut"></aop:before>--> <!--<!–后置通知–>--> <!--<aop:after-returning method="commit" pointcut-ref="pointcut"></aop:after-returning>--> <!--<!–關(guān)閉通知–>--> <!--<aop:after method="close" pointcut-ref="pointcut"></aop:after>--> <!--<!–異常–>--> <!--<aop:after-throwing method="rollback" throwing="e" pointcut-ref="pointcut"></aop:after-throwing>--> <!--環(huán)繞通知--> <aop:around method="surround" pointcut-ref="pointcut"></aop:around>
3.4 注解方式的配置
@Component @Aspect public class TxManager { @Pointcut("execution(* cn.itsource._05_aopanno.service.I*Service.*(..))") public void pointcut(){}
4.Bean的創(chuàng)建方式
4.1 Bean創(chuàng)建方式一
通過(guò)無(wú)參數(shù)的構(gòu)造方法來(lái)創(chuàng)建bean --最常用方式
配置
<bean id="mybean" class="cn.itsource._06_bean.Mybean"></bean>
4.2 Bean創(chuàng)建方式二
FactoryBean
public class MybeanFactoryBean implements FactoryBean<Mybean> { public Mybean getObject() throws Exception { return new Mybean("石楚玉", "仙桃之光"); } public Class<?> getObjectType() { return Mybean.class; } //是否單例 public boolean isSingleton() { return true; }
4.3 Bean的創(chuàng)建方式三
通過(guò)類(lèi)里面定義靜態(tài)方法 來(lái)獲取bean
public class MybeanFactory { public static Mybean getBean(){ return new Mybean(); } }
bean class="cn.itsource._06_bean.MybeanFactory" factory-method="getBean"></bean>
4.4 Bean的創(chuàng)建方式四
public class MybeanFactory1 { //普通方式 public Mybean getBean1(){ return new Mybean(); } }
<bean class="cn.itsource._06_bean.MybeanFactory1" id="mybeanFactory1"></bean> <bean factory-bean="mybeanFactory1" factory-method="getBean1"></bean>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)多選批量刪除功能(vue+Element)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多選批量刪除功能,包括前端vue實(shí)現(xiàn)代碼文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Java synchronized關(guān)鍵_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在java中,每一個(gè)對(duì)象有且僅有一個(gè)同步鎖。這也意味著,同步鎖是依賴(lài)于對(duì)象而存在。下面通過(guò)本文給大家介紹synchronized原理 及基本規(guī)則,感興趣的朋友一起學(xué)習(xí)吧2017-05-05Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享
這篇文章主要為大家詳細(xì)介紹了Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Java中ThreadLocal避免內(nèi)存泄漏的方法詳解
ThreadLocal是Java中的一個(gè)線程本地存儲(chǔ)機(jī)制,它允許每個(gè)線程擁有一個(gè)獨(dú)立的本地存儲(chǔ)空間,用于存儲(chǔ)該線程的變量,本文主要介紹了ThreadLocal如何避免內(nèi)存泄漏,需要的朋友可以參考下2023-05-05Java中關(guān)于String StringBuffer StringBuilder特性深度解析
這篇文章主要介紹了Java中關(guān)于String StringBuffer StringBuilder特性深度解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Java語(yǔ)法基礎(chǔ)之運(yùn)算符學(xué)習(xí)筆記分享
這篇文章主要為大家分享了Java語(yǔ)法基礎(chǔ)之運(yùn)算符學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Elasticsearch 基礎(chǔ)介紹及索引原理分析
這篇文章主要介紹了Elasticsearch 基礎(chǔ)介紹及索引原理分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07