SpringAop的依賴注入方式
SpringAop依賴注入
1.Spring
它是一個輕量級和IOC(DI)和AOP的 容器框架:
- IOC:控制反轉(zhuǎn) 現(xiàn)在創(chuàng)建bean的方式,是交給spring幫我們創(chuàng)建。(理解)
- DI:依賴注入 spring它是容器框架,是一個bean(裝對象的)容器框架,spring幫我創(chuàng)建好對象之后,在把我們創(chuàng)建好的對象 注入到相應(yīng)的類里面
- AOP:面向切面編程,Spring框架的AOP機制可以讓開發(fā)者把業(yè)務(wù)流程中的通用功能抽取出來,單獨編寫功能代碼。在業(yè)務(wù)流程執(zhí)行過程中,Spring框架會根據(jù)業(yè)務(wù)流程要求,自動把獨立編寫的功能代碼切入到流程的合適位置。
AOP使用場景:
- ? 事務(wù)管理
- ? 日志管理
- ? 性能控制
2.spring的DI依賴注入
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類型注入
<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類里面屬性注入
<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="陽光"></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版本的自動注入
default-autowire="byType" default-autowire="byName"
byType根據(jù)類型,byName根據(jù)名字
2.4XML版本的注解引入
<context:component-scan base-package="cn.itsource._03_autoxml"></context:component-scan> <!-- 掃描注解: @Component, @Repository, @Service,@Controller -->
如果一個接口有兩個實現(xiàn)情況下:
- 方案一:一個接口有多個實現(xiàn)的情況下面 通過名字去區(qū)分
- 方案二:通過Resource這個注解
區(qū)別:
- @Autowired和@Qualifier 都是屬于spring的注解
- Resource使用jdk的注解 推薦使用Autowired和Qualifier,可以和spring進(jìn)行無縫銜接
- autowired默認(rèn)是根據(jù)類型匹配,如果類型匹配不上在根據(jù)名字匹配
- 而Resource默認(rèn)根據(jù)名字匹配,名字匹配不上就匹配類型
如果你用的是Spring的注解,盡量全部使用Spring的標(biāo)簽
- AutoWired與Resource都表示注入對象
- AutoWired他是SPring提供的注解,@Resource是sun公司提供注解
- AutoWired默認(rèn)是根據(jù)類型匹配,如果類型匹配不上在根據(jù)名字匹配
- 建議大家使用Autowried 因為他是Spring提供的注解,他能和Spring進(jìn)行無縫銜接集成,
- 而Resource默認(rèn)根據(jù)名字匹配,名字匹配不上就匹配類型
3.Spring里面的AOP功能
3.1 AOP簡述
- 定義: 面向切面編程(面向方面編程)
- Spring使用動態(tài)代理織入。
- Spring支持我們在方法的前后添加增強代碼。
- Aop的功能作用Spring的兩個核心之一,也可以是Spring非常重要的功能。
3.2 Spring中aop的實現(xiàn)
1.若目標(biāo)對象實現(xiàn)了若干接口,spring使用JDK的java.lang.reflect.Proxy類代理。
2.若目標(biāo)對象沒有實現(xiàn)任何接口,spring使用CGLIB庫生成目標(biāo)對象的子類。
3.使用該方案時需要注意:
- 對接口創(chuàng)建代理優(yōu)于對類創(chuàng)建代理,因為會產(chǎn)生更加松耦合的系統(tǒng)。對類代理是讓遺留系統(tǒng)或無法實現(xiàn)接口的第三方類庫同樣可以得到通知,這種方案應(yīng)該是備用方案。
- 標(biāo)記為final的方法不能夠被通知。spring是為目標(biāo)類產(chǎn)生子類。任何需要被通知的方法都被復(fù)寫,將通知織入。final方法是不允許重寫的。
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)建方式一
通過無參數(shù)的構(gòu)造方法來創(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)建方式三
通過類里面定義靜態(tà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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實現(xiàn)多選批量刪除功能(vue+Element)
這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)多選批量刪除功能,包括前端vue實現(xiàn)代碼文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08Java synchronized關(guān)鍵_動力節(jié)點Java學(xué)院整理
在java中,每一個對象有且僅有一個同步鎖。這也意味著,同步鎖是依賴于對象而存在。下面通過本文給大家介紹synchronized原理 及基本規(guī)則,感興趣的朋友一起學(xué)習(xí)吧2017-05-05Spring Boot高級教程之使用Redis實現(xiàn)session共享
這篇文章主要為大家詳細(xì)介紹了Spring Boot高級教程之使用Redis實現(xiàn)session共享,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Java中ThreadLocal避免內(nèi)存泄漏的方法詳解
ThreadLocal是Java中的一個線程本地存儲機制,它允許每個線程擁有一個獨立的本地存儲空間,用于存儲該線程的變量,本文主要介紹了ThreadLocal如何避免內(nèi)存泄漏,需要的朋友可以參考下2023-05-05Java中關(guān)于String StringBuffer StringBuilder特性深度解析
這篇文章主要介紹了Java中關(guān)于String StringBuffer StringBuilder特性深度解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Java語法基礎(chǔ)之運算符學(xué)習(xí)筆記分享
這篇文章主要為大家分享了Java語法基礎(chǔ)之運算符學(xué)習(xí)筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09Elasticsearch 基礎(chǔ)介紹及索引原理分析
這篇文章主要介紹了Elasticsearch 基礎(chǔ)介紹及索引原理分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07