SpringAop的依賴注入方式
SpringAop依賴注入
1.Spring
它是一個輕量級和IOC(DI)和AOP的 容器框架:
- IOC:控制反轉 現(xiàn)在創(chuàng)建bean的方式,是交給spring幫我們創(chuàng)建。(理解)
- DI:依賴注入 spring它是容器框架,是一個bean(裝對象的)容器框架,spring幫我創(chuàng)建好對象之后,在把我們創(chuàng)建好的對象 注入到相應的類里面
- AOP:面向切面編程,Spring框架的AOP機制可以讓開發(fā)者把業(yè)務流程中的通用功能抽取出來,單獨編寫功能代碼。在業(yè)務流程執(zhí)行過程中,Spring框架會根據(jù)業(yè)務流程要求,自動把獨立編寫的功能代碼切入到流程的合適位置。
AOP使用場景:
- ? 事務管理
- ? 日志管理
- ? 性能控制
2.spring的DI依賴注入
2.1.根據(jù)構造器注入:
- 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進行無縫銜接
- autowired默認是根據(jù)類型匹配,如果類型匹配不上在根據(jù)名字匹配
- 而Resource默認根據(jù)名字匹配,名字匹配不上就匹配類型
如果你用的是Spring的注解,盡量全部使用Spring的標簽
- AutoWired與Resource都表示注入對象
- AutoWired他是SPring提供的注解,@Resource是sun公司提供注解
- AutoWired默認是根據(jù)類型匹配,如果類型匹配不上在根據(jù)名字匹配
- 建議大家使用Autowried 因為他是Spring提供的注解,他能和Spring進行無縫銜接集成,
- 而Resource默認根據(jù)名字匹配,名字匹配不上就匹配類型
3.Spring里面的AOP功能
3.1 AOP簡述
- 定義: 面向切面編程(面向方面編程)
- Spring使用動態(tài)代理織入。
- Spring支持我們在方法的前后添加增強代碼。
- Aop的功能作用Spring的兩個核心之一,也可以是Spring非常重要的功能。
3.2 Spring中aop的實現(xiàn)
1.若目標對象實現(xiàn)了若干接口,spring使用JDK的java.lang.reflect.Proxy類代理。
2.若目標對象沒有實現(xiàn)任何接口,spring使用CGLIB庫生成目標對象的子類。
3.使用該方案時需要注意:
- 對接口創(chuàng)建代理優(yōu)于對類創(chuàng)建代理,因為會產(chǎn)生更加松耦合的系統(tǒng)。對類代理是讓遺留系統(tǒng)或無法實現(xiàn)接口的第三方類庫同樣可以得到通知,這種方案應該是備用方案。
- 標記為final的方法不能夠被通知。spring是為目標類產(chǎn)生子類。任何需要被通知的方法都被復寫,將通知織入。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>-->
<!--<!–關閉通知–>-->
<!--<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ù)的構造方法來創(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>
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java調(diào)取創(chuàng)藍253短信驗證碼的實現(xiàn)代碼
這篇文章主要介紹了Java調(diào)取創(chuàng)藍253短信驗證碼的實現(xiàn)代碼,需要的朋友可以參考下2018-04-04
Maven項目啟動報錯error in opening zip file的解決方
這篇文章主要介紹了Maven項目啟動時常見的`errorinopeningzipfile`錯誤,分析了其根本原因在于JAR文件損壞,文章提供了多種解決方法,包括刪除損壞的JAR文件、清理本地倉庫、檢查磁盤錯誤、手動下載等,需要的朋友可以參考下2025-10-10
spring-boot-maven-plugin:unknown的完美解決方法
這篇文章主要介紹了spring-boot-maven-plugin:unknown的完美解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題
這篇文章主要介紹了springboot集成druid,多數(shù)據(jù)源可視化,p6spy問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

