spring的基本配置和使用
這里不講spring整合別的框架 先單純使用spring
Spring是一個輕量級控制反轉(IoC)和面向切面(AOP)的容器框架
IoC:Inversion of Control 控制反轉,也就是將實例化對象的控制權交由spring容器 ,實現了解耦
接口和實現類之間需要通過spring容器來建立聯系 如果需要增加新的功能 原有的實現類不能滿足要求,根據開閉原則 不修改原有的類 可以拓展新的類
如果不使用spring容器,那么所有接口的引用指向實現類的對象實例的代碼,要手動全部更改成指向新的實現類的對象實例 這會非常麻煩 也 違反了開閉原則
也就是 原本是? UserDao dao=new UserDaoImpl();? 要改成? ?UserDao? dao=new UserDaoImpl2();
如果使用了spring容器管理 只要修改spring容器中 這個接口對應的實現類就可以了 不需要更改全部的代碼? 大大降低了 耦合度 提高了拓展性
DI:Dependency Injection 依賴注入?
既然對象的實例化全部交由spring容器管理 我們不能直接new了,那么怎么得到我們想要得對象實例呢
這就是通過spring的依賴注入, spring可以通過xml或者注解實現依賴注入,在Ioc的基礎上 交給spring管理的類 ,spring會創建這個類的實例對象 并且是默認是單例的
也就是你多個類中依賴注入的對象 都是同一個對象? 可以手動設置為多例 每次注入都創建一個新的對象
AOP:面向切面編程
在實際業務中 經常會有一些每個業務都需要執行的相同代碼,比如權限判斷,或者想對所有方法進行增強 加入事務管理 或者 日志記錄
我們可以將這些重復的相同代碼 或者要新增的功能 定義一個切面類 然后配置要進行攔截哪些類的哪些方法,也就是在執行目標方法之前會先執行切面類中的方法?
然后執行目標方法,或者執行完目標方法之后再執行切面類中的方法 都可以設置
其實AOP就是動態代理模式的實現 如果要攔截的類 繼承了接口 會使用JDK動態代理否則使用Cglib代理 來創建目標類的代理對象
然后根據我們在切面中配置的方法 在執行目標方法之前或之后調用我們配置的方法? 從而實現了不修改原有的類 進行了拓展和增強
---------------------------------------------------------------------------
基本概念講完了 接下來開始配置??
首先在src根目錄下 建一個名字隨意 默認applicationContext.xml的配置文件 我一般改成spring.xml
這就是一個空的配置文件?
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"></beans>首先使用XML方式實現控制反轉和依賴注入
<bean name="名字唯一"? class="類的完整路徑"?>
<property name="類中屬性名" ref="引用別的bean標簽的name或者id屬性的值"? value="如果這個屬性是普通屬性 如string或者Integer 直接賦值就行" />
<!-- 給類中屬性注入值? 也就是依賴注入 -->
</bean>
這樣子就完成了一個類交給spring容器管理 ,?<property>標簽 注入屬性不是必須的
如果使用了這個注入 類中的屬性 必須提供set方法 才能注入
這是bean標簽的其他屬性:
scope="singleton或者prototype"? ? ? ?singleton默認的單例模式,prototype多例 每次都會創建一個新的實例
lazy-init="true"? ? ? ??spring容器默認初始化會實例化所有管理的類對象
init-method="類中自定義方法名"? ? ?初始化時調用的方法
destroy-method="類中自定義方法名"? ?對象銷毀時調用的方法 在容器關閉時會銷毀 如果有多個實例對象 將不會銷毀
接下來用注解方式? 實現控制反轉,將類交給spring容器管理和依賴注入?
首先在配置文件中加上?
<context:component-scan base-package="包名,包名"/>?
這將掃描指定包下的所有類和子包的類? 如果有注解的 也將被spring管理
然后在類上 加上這幾個注解的其中一個
@Repository("名字 相當于bean標簽的name"):使用持久化類,dao類
@Service("名字 相當于bean標簽的name"):業務層類,service類
@Controller("名字 相當于bean標簽的name"):控制層,springMvc中的控制器
@Component("名字 相當于bean標簽的name"):組件,其他類
這四個注解功能一樣 只不過有語義區別?
依賴注入 只需要在對應的屬性上 加上@Autowired 會根據屬性名在spring容器中找對應名字的類 然后注入對象
如果根據名字沒有找到 會根據類型找相匹配的類 然后注入對象
如果想指定注入的類,的對象? 可以加一個@Qualifier("名字") 會優先注入這個名字的類的對象
這樣也實現了將一個類交給spring管理
其他注解
@Scope:設置作用域
@PostConstruct:在實例化后執行的方法
@PreDestroy:在對象銷毀之前執行的方法
-------------------------------
上面實現了Ioc? 接下來實現AOP
AOP概念:
切面:將公共的,但是與業務無關的代碼抽象出一個單獨的類,則該類為切面。
通知:攔截到切入點時,需要執行的代碼,切面中的每一個方法,則稱為通知.
連接點:所謂連接點是指那些被攔截到的點,也就是要攔截的類中的方法?
切入點:攔截的一系列連接點的集合。
通知:
前置通知:在執行切入點之前執行的方法
后置通知:在執行完切入點之后執行的方法
最終通知:在后置通知之前執行,執行完畢后才執行后置通知
例外通知:切入點方法發生異常時執行
環繞通知:相當于前置和后置的結合
首先講注解的實現方式
首先要在配置文件中 加上?<aop:aspectj-autoproxy/>? 啟用 apo注解支持
定義一個類 作為切面類 加上注解?@Component 交給spring管理 再加上@Aspect 定義為切面類
@Before("切入點方法名()"):聲明一個前置通知
@AfterReturning("切入點方法名()"):聲明一個后置通知
@After("切入點方法名()"):聲明一個最終通知
@AfterThrowing("切入點方法名()"):聲明一個異常通知
@Around("切入點方法名()"):環繞通知 會影響后置通知的返回值和異常通知
@Order:聲明切面的執行順序,值越小,優先級越高 這個加在類上
@Pointcut:聲明一個切入點
一般定義在一個空的方法上 配置指定的篩選規則 然后其他通知方法就可以引用這個切入點
例子:@Pointcut("execution(方法修飾符 方法返回值 方法所屬類 匹配方法名 ( 方法中的形參表 ) 方法申明拋出的異常 )")
每個部分都支持使用*號表示匹配全部,方法所屬類是寫完整類路徑名
通知和切入點都加在對應的方法上就行 這樣在調用原本的對象的方法時會進行攔截 執行切面中配置好的通知的代碼
然后xml方式實現aop
<aop:config>
<aop:pointcut expression="切入點表達式,and args(參數名)這樣是表示輸入參數 " id="唯一即可 通知標簽才能引用" />
<aop:aspect ref="引用已經交給spring管理的切面類的id">
<aop:通知類型? method="切面類中方法名" pointcut-ref="引用已經定義好的切入點" returning="obj,如果這個通知有返回值就寫這個" />
</aop:aspect>
</aop:config>
這就是spring的基本使用和配置? 還算是比較簡單的
?
?
轉載于:https://www.cnblogs.com/java888/p/10778576.html
總結
以上是生活随笔為你收集整理的spring的基本配置和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WMI测试器
- 下一篇: 网络协议 8 - TCP协议(上):性恶