spring框架中Ioc和AoP使用扩展

多种方法实现依赖注入
构造注入:
关键代码如下:
<constructor-arg type="dao.UserDaoImpl">
<ref bean="dao.UserDao"/>
</constructor-arg>
一个<constructor-arg>元素构造表示构造方法的一个参数,且使用时不区分顺
序。无法区分时可以通过设值<constructor-arg>元素的index属性指定该参数的
位置索引,位置从0开始。<constructor-arg>元素还提供了type属性用来指定
参数的类型,避免字符串和基本数据类型的混淆。
构造注入的时效性好,在对象实例化时就得到所依赖的对象,便于在对象的初
始化方法中使用依赖对象;但受限于方法重载的形式,使用灵活性不足。设值
注入使用灵活,但时效性不足,并且大量的setter访问器增加了类的复杂性,
spring并不倾向于某种注入方式,用户 应该根据实际情况进行合理的选择。
当然spring提供的注入方式不只这两种,只是这两种最普遍。

使用p命名空间实现属性注入
P命名空间的特点是使用属性而不是子元素的形式配置Bean的属性,从而简
化了Bean配置。
使用p命名空间改进配置,注意使用前要先添加p命名空间的声明。
关键代码如下:
xmlns:p="http://www.springframework.org/schema/p"
<!--使用p命名空间注入属性值-->
<bean id="stu3" class="entity.Student" p:name="李四" p:age="33"></bean>
语法:
p:属性名=”属性值”
对于使用Bean的属性,使用如下方式:
语法:
p:属性名-ref=”Bean的id”
注入不同数据类型
Spring提供了不同的标签来实现各种不同类型参数的注入,这些标签对弈设值
注入和构造注入都适用。
在本章节,对于构造注入,只需将所介绍的标签添加到<constructor-arg>与
</constructor-arg>中间即可
注入直接量(基本数据类型、字符串)
对于基本数据类型及其包装类、字符串,出来可以使用value属性,还可
以通过,<value>子元素进行注入,关键代码如下:
<property name="name">
<value>zhangsan</value>
</property>
如果属性值中包含了XML中的特殊字符(&、<、>、”、’、),则注入时需 要进行处理。通常可以采用两用办法:
XML预定义的实体引用
符号
实体引用
符号
实体引用
<
<

'
>
>
"
"
&
&


使用<![CDATA[]]>标记或把特殊字符替换为实体引用




引用其他Bean组件
Spring中定义的Bean可以互相引用,从而建立依赖关系,除了使用ref
属性,还可以通过<ref>子元素实现,关键代码如下:
<property name="dao">
<ref bean="userdao"/>
</property>
<ref>标签中的bean属性用来指定要引用的Bean的id。除了bean属性,
还有一个lcocal属性,关键代码如下:
<property name="dao">
<ref local="userdao"/>
</property>

使用内部Bean
如果一个Bean组件仅在移除需要使用,可以把它定义为内部Bean。
关键代码如下:
<property name="dao">
<bean class="dao.UserDao"/>
</property>
注入集合类型的属性:
对于list或数组类型的属性,可以使用<list>标签注入,关键代码如下:
<property name="ceshi">
<list>
<value>测试1</value>
<value>测试2</value>
</list>
</property>
<list>标签中间可以使用<value>、<ref>等标签注入集合元素,甚至是
另一个<list>标签,对于Set类型的属性,可以使用<set>标签注入。
对于Map类型的属性,可以使用以下注入方式:

<property name="ceshi">
<map>
<entry>
<key><value>football</value></key>
<value>足球</value>
</entry>
<entry>
<key><value>basketball</value></key>
<value>篮球</value>
</entry>
</map>
</property>
如果Map中的键或值是Bean对象,可以把上面的<value>换成<ref>
对于Properties类型的属性,可以使用以下方法注入
<property name="ceshi">
<props>
<!-- 定义Properties中的键值对 -->
<prop key="football">足球</prop>
<prop key="basketball">篮球</prop>
</props>
</property>
注入null和空字符串值
可以使用<value></value>注入空字符串值,使用<null/>注入null值, 关键代码如下:
<property name="name">
<!-- <value></value> -->
<null></null>
</property>
其他增强类型;
前置增强      MethodBeforeAdvice

后置增强      AfterReturningAdvice

异常抛出增强  ThrowsAdvice
异常抛出增强的特点是在目标方法抛出异常时织入增强处理。
通过ThrowsAdvice接口实现异常抛出增强,ThrowsAdvice接口中并
没有定义任何方法,但是我们在定义异常抛出的增强方法时必须遵守
以下方法签名:
void afterThrowing(Method method, Object[] args, Object obj, NullPointerException ex)
这里方法名必须是afterThrowing。方法的入参只有最后一个是
必须的,前三个参是可选的,但是前3个参数要么都提供,要么
一个也不提供。
环绕增强      MethodInterceptor
通过MethodInterceptor接口实现环绕增强。
环绕增强在目标方法的前后都可以织入增强处理。环绕增强是功能最
强大的增强处理,spring把目标方法的控制权全部交给了它,在环绕
增强处理中,可以获取或修改目标方法的参数、返回值。可以对它进 行异常处理,甚至可以决定目标方法是否执行。
注意:还需要在applicationContext.xml文件中进行aop相关的配置

        <aop:config>
<aop:pointcut expression="execution(public void *User())"
id="addoptpointcut"/>
<aop:advisor advice-ref="logbefore" pointcut-ref="addoptpointcut" />
</aop:config>

        <aop:config>
<aop:pointcut expression="execution(*
spring_basic.UserService.*(..))" id="userServiceOptPointcut"/>
<!--
<aop:advisor advice-ref="exceptionAdvice"
pointcut-ref="userServiceOptPointcut" />
-->
<aop:advisor advice-ref="logger"
pointcut-ref="userServiceOptPointcut" />
</aop:config>

使用注解定义增强;
前置增强      @Before("execution(* service.*.*(..))")

  后置增强 @AfterReturning(pointcut="execution(* service.*.*(..))", returning="result")

  异常抛出增强  @AfterThrowing(pointcut="execution(* service.*.*(..))", throwing="ex")

  环绕增强      @Around("execution(* service.*.*(..))")

  注意:还需要在applicationContext.xml文件中添加如下配置

        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
基于Schema配置定义切面


首先:添加普通的类,里面按要求编写方法

  public class Logger {

public void before(JoinPoint jp){

}
public void after(JoinPoint jp, Object result){

}
public void aterThrowing(JoinPoint jp, Exception ex){

}
public Object aroundExecute(ProceedingJoinPoint pjp) throws Throwable{

}

  }

  其次:在applicationContext.xml中配置aop-aspect相关的配置

        <aop:config>
<aop:pointcut expression="execution(* service.*.*(..))"
id="optpointcut"/>
<aop:aspect ref="mylogger">
<aop:before method="before" pointcut-ref="optpointcut" />
<aop:after-returning method="after" returning="result"
pointcut-ref="optpointcut" />
<aop:after-throwing method="aterThrowing" throwing="ex"
pointcut-ref="optpointcut" />
<aop:around method="aroundExecute"
pointcut-ref="optpointcut"/>
</aop:aspect>
</aop:config>
总结:
Spring提供了设值注入,构造注入等依赖注入的方式
使用p命名空间简化属性注入的配置
Spring提供的增强处理类型包括前置增强、后置增强、异常抛出增强、环绕增强等
使用注解方式定义切面可以简化配置工作,常用注解有@Aspect、@Before等。通过配
置文件中添加<app:aspectj-autoproxy/>元素,就可以启用对于@AspectJ注解的支持
也可以通过Schema形式将POJO的方法配置陈切面

猜你喜欢

转载自killerqiao.iteye.com/blog/2358635