6.IoC和AOP使用拓展
阿新 • • 發佈:2019-01-14
1.多種方式實現依賴注入
1.1 構造注入
(1).為業務類新增
public class UserServiceImpl implements UserService {
private UserDao dao;
public void setDao(UserDao dao) {
this.dao = dao;
}
public UserServiceImpl(UserDao user)
{
this.dao=user;
}
public UserServiceImpl()
{}
public void addNewUser(User user) {
dao.save(user);
}
}
(2).配置檔案將DAO物件以構造注入的方式注入
<bean id="userDao" class="dao.impl.UserDaoImpl">
<bean id="userService" class="service.impl.UserServiceImpl">
<!-- 通過定義的單參構造為userService的dao屬性賦 值 -->
<constructor-arg>
<!-- 引用id為userDao的物件為userService的dao屬性賦值 -->
<ref bean="userDao" />
</constructor-arg>
</bean>
一個constructor-arg元素表示構造方法的一個引數,且使用時不區分順序。如果出現混亂,也可以用index元素指定改引數的位置索引,位置從0開始,還提供了type屬性來指定引數的型別,避免字串和基本資料型別的混淆
1.2使用p名稱空間實現屬性注入
需先宣告p名稱空間的宣告
<bean id="user" class="entity.User"
p:username="張三" p:age=“23” p:email= "[email protected]"/>
<bean id="userService" class="service.impl.UserServiceImpl"
p:dao-ref="userDao"/>
1.3注入不同資料型別
(1).注入直接量(基本資料型別,字串)
//使用<![CDATA[]]標記處理XML特殊字元>
<bean id="hellos" class="HelloSprng.HelloSpring">
<property name="name">
<value><![CDATA[P&G]]></value>
</property>
</bean>
//把xml特殊字元替換為實體引用
<bean id="hellos" class="HelloSprng.HelloSpring">
<property name="name">
<value>p&g</value>
</property>
</bean>
xml5個預定義實體引用
符號 | 實體引用 |
---|---|
< | <; |
> | >; |
& | &; |
’ | &apos ; |
" | " ; |
(2).引用其他Bean元件
bean指入
<bean id="dao" class="dao.impl.UserDaoImpl"></bean>
<bean id="service" class="service.impl.UserServiceImpl">
<property name="dao">
<ref bean="dao">
</property>
</bean>
local指入:
<bean id="dao" class="dao.impl.UserDaoImpl"></bean>
<bean id="service" class="service.impl.UserServiceImpl">
<property name="dao">
<ref local="dao">
</property>
</bean>
區別:Spring的配置檔案可以拆分多個的,使用local屬性只能在同一個配置檔案中檢索Bean的id,而使用bean屬性可以在其他配置檔案中檢索id
(3).使用內部Bean
一個Bean元件僅在一處需要使用,可以把它定義為內部Bean·
<bean id="service" class="service.impl.UserServiceImpl">
<property name="dao">
<bean class="dao.impl.UserDaoimpl"/>
</property>
</bean>
(4).注入集合型別的屬性
list標籤:
<bean id="user" class="HelloSprng.HelloSpring">
<property name="hobbies">
<list>
<value>足球</value>
<value>籃球</value>
</list>
</property>
</bean>
set標籤:
<bean id="user" class="HelloSprng.HelloSpring">
<property name="hobbies">
<set>
<value>足球</value>
<value>籃球</value>
</set>
</property>
</bean>
map型別:
<bean id="user" class="HelloSprng.HelloSpring">
<property name="hobbies">
<map>
<entry>
<key><value>足球</value></key>
<key><value>籃球</value></key>
</entry>
</map>
</property>
</bean>
Properties標籤:
<bean id="maps" class="HelloSprng.HelloSpring">
<property name="maps">
<props>
<prop key="football">足球</prop>
<prop key="basketball">籃球</prop>
</props>
</property>
</bean>
(5)注入null和空字串
空字串
```bash
<bean id="null" class="HelloSprng.HelloSpring">
<property name="name"><value></value></property>
</bean>
null
<bean id="null" class="HelloSprng.HelloSpring">
<property name="text"><null/></property>
</bean>
2.Spring其他增強型別
2.1異常丟擲增強
異常丟擲增強的特點是在目標方法丟擲異常時織入增強處理。
異常類
public class UserServiceLogger {
private static final Logger log = Logger.getLogger(UserServiceLogger.class);
public void afterReturning(JoinPoint jp, Object e) {
log.info("呼叫" + jp.getTarget() + "的 " + jp.getSignature().getName()
+ "方法。方法返回t值" + result);
}
}
spring配置檔案關鍵程式碼·
<bean id="theLogger" class="aop.UserServiceLogger"></bean>
<!-- 配置切面 -->
<aop:config>
<!-- 定義切入點 -->
<aop:pointcut id="pointcut"
expression="execution(public void addNewUser(entity.User))" />
<!-- 引用包含增強方法的Bean -->
<aop:aspect ref="theLogger">
<!-- 將before()方法定義為前置增強並引用pointcut切入點 -->
<aop:after-throwing method="afterReturning"
pointcut-ref="pointcut" returning="e" />
</aop:aspect>
</aop:config>
method:將異常類的方法定義為丟擲異常
pointcut-ref:引入切入點
throwing:注入異常例項
使用aop:after-throwing元素可以定義異常丟擲異常
2.2最終增強
最終增強的特點是無論方法丟擲異常還是正常一處,該增強都會得到執行,類似於異常處理機制中finally的作用,一般用於釋放資源
異常類
public class UserServiceLogger {
private static final Logger log = Logger.getLogger(UserServiceLogger.class);
public void afterReturning(JoinPoint jp) {
log.info(jp.getSignature().getName()
+ "方法結束執行");
}
}
spring配置檔案
<bean id="theLogger" class="aop.UserServiceLogger"></bean>
<!-- 配置切面 -->
<aop:config>
<!-- 定義切入點 -->
<aop:pointcut id="pointcut"
expression="execution(public void addNewUser(entity.User))" />
<!-- 引用包含增強方法的Bean -->
<aop:aspect ref="theLogger">
<!-- 將afterReturning()方法定義為後置增強並引用pointcut切入點 -->
<!-- 通過returning屬性指定為名為result的引數注入返回值 -->
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result" />
</aop:aspect>
</aop:config>
2.3環繞增強
異常類
public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable {
logger.info("呼叫" + jp.getTarget() + "的" + jp.getSignature().getName()
+ "方法。方法入參:" + Arrays.toString(jp.getArgs()));
try {
Object result = jp.proceed();
logger.info("呼叫" + jp.getTarget() + "的"
+ jp.getSignature().getName() + "方法。方法返回值:" + result);
return result;
} catch (Throwable e) {
logger.error(jp.getSignature().getName() + "方法發生異常:" + e);
throw e;
} finally {
logger.info(jp.getSignature().getName() + "方法結束執行。");
}
}
spring配置檔案
<bean id="theLogger" class="aop.UserServiceLogger"></bean>
<!-- 配置切面 -->
<aop:config>
<!-- 定義切入點 -->
<aop:pointcut id="pointcut"
expression="execution(public void addNewUser(entity.User))" />
<!-- 引用包含增強方法的Bean -->
<aop:aspect ref="theLogger">
<aop:around methid="aroundLogger" pointcut-ref="pointcut">
</aop:aspect>
</aop:config>