一、基於註解的方式配置bean/bean的裝配
- 常用的註解
@Component:標識爲一個組件
@Repository:標識爲一個持久層的組件
@Service:標識爲一個業務層的組件
@Controller:標識爲一個表現層的組件
@AutoWired:自動裝配
@Qualifier:具體的指定要裝配的bean的id值 - 開啓註解配置
<context:component-scan base-package="基包"></context:component-scan> use-default-filters="true/false":是否使用默認的過濾 <context:include-filter type="annotation/assignable"expression="註解的全類名/組件類的全類名"/> <context:include-filter>需要配合 use-default-fiters="false"來使用 <context:exclude-filter type="annotation/assignable"expression="註解的全類名/組件類的全類名"/>
- @AutoWired
- 優先匹配兼容的類型來進行注入.如果有多個兼容的類型匹配,則再嘗試使用被注入的屬性名跟ioc容器中bean的id值進行匹配。
- required: 默認情況下,被 @AutoWired 標註的屬性必須要被裝配.可以使用required="false"來改變默認的行爲.
- 可以使用@Qualifier來具體指定要裝配的bean的id值.
二、AOP
1. 動態代理
-
動態代理實現的方式:
jdk動態代理 基於接口實現代理
cglib動態代理 基於子類的方式實現代理
javassist動態代理 基於子類的方式實現代理 -
jdk的動態代理
public Object getLoggingProxy(){ //定義代理對象 Object proxy ; /** * loader: ClassLoader 類加載器 * interfaces: 目標類的所接口,目的是獲取接口中的方法 * h: InvocationHandler */ ClassLoader loader = proxy.getClass().getClassLoader(); Class[] interfaces = proxy.getClass().getInterfaces(); InvocationHandler h = new InvocationHandler() { /** * proxy:代理對象 在invoke方法中一般不會用 * method:正在調用的方法 * args:調用方法傳入的參數 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); //加日誌 System.out.println("ATGUIGU===>The method "+methodName+" begins with "+ Arrays.asList(args)); //執行目標方法 Object result = method.invoke(proxy, args); //加日誌 System.out.println("ATGUIGU===>The method "+methodName+" ends with " + result ); return result; } }; proxy = (Object) Proxy.newProxyInstance(loader, interfaces, h); return proxy ; }
2.SpringAOP
- 切面
將橫切關注點模塊化後形成切面. - 通知
前置通知
後置通知
返回通知
異常通知
環繞通知
3. 基於註解方式配置AOP
4. 基於xml方式配置AOP
- 切面的優先級
如果是基於註解的方式,可以使用@Order(值)來指定切面的優先級.值越小優先級越高
如果是基於xml的方式,可以使用order屬性來指定切面的優先級. - 重用切入點表達式
- 切面的優先級
Spring 事務管理
1. 基於註解
- 配置事務管理器以及開啓事務註解
tx:annotation-driven中 transaction-manager的默認值是transactionManager,如果當前事務管理器的id值就是transactionManager,那麼transaction-manager的配置可以省略.如果當前事務管理器的id值不是transactionManager,那麼就必須在transaction-manager中指定當前的事務管理器的id值。 - @Transactional
該註解可以加到類上,也可以加到方法上。加到類上的對當前類中所有的方法都起作用。如果類與方法上都加了該註解,則方法上的優先於類上的. - 事務的屬性