1. 程式人生 > >6.IoC和AOP使用拓展

6.IoC和AOP使用拓展

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&amp;g</value>
		</property>
	</bean>

xml5個預定義實體引用

符號 實體引用
< &lt;
> &gt;
& &amp;
&apos ;
" &quot ;

(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>