多种方法实现依赖注入
构造注入:
关键代码如下:
<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的方法配置陈切面
分享到:
相关推荐
在Spring框架中,依赖注入(Inversion of Control, IoC)和面向切面编程(Aspect Oriented Programming, AOP)是两大核心特性。本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 #...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
Spring 3.1 是一个非常重要的Java框架,它在企业级应用开发中广泛使用,尤其在控制反转(IOC)和面向切面编程(AOP)方面。这些概念是Spring框架的核心特性,帮助开发者实现松耦合和代码复用,提高了应用程序的可...
在Java世界里,Spring框架是应用最广泛的轻量级框架之一,它的核心特性包括IOC(Inversion of Control,反转控制)和AOP(Aspect Oriented Programming,面向方面编程)。这两个概念是Spring框架的灵魂,极大地提升...
4. **Spring框架的应用**:Spring作为实现IoC和AOP的常用工具,会详细讲解如何配置和使用Spring容器。 5. **重构过程**:分享重构从旧版CurrencyExchange到使用IoC和AOP的新版CurrencyExchange2的具体步骤和考虑因素...
Spring框架是Java开发中不可或缺的一部分,它通过提供控制反转(IOC)和面向切面编程(AOP)等核心特性,极大地简化了企业级应用的构建。让我们深入探讨这两个概念及其在Spring中的实现机制。 首先,Spring的控制...
Spring核心IoC和AOP的理解 本文主要介绍了Spring核心IoC和AOP的相关知识,涵盖了IoC和AOP的概念、特点、优点和应用场景等方面的内容。...Spring框架的 IoC和AOP机制使得程序更加灵活、更加易于维护和扩展。
Spring IOC和AOP的原理及实例详解 在软件开发中,控制反转(IOC)和面向切面编程(AOP)是两种非常重要的设计...Spring框架正是基于这两种模式的思想设计的,提供了多种类型的IOC容器和AOP框架,可以满足不同的需求。
- **依赖注入 (DI)** 和 **面向切面编程 (AOP)** 是Spring框架的两个核心特性,它们分别解决了对象依赖管理和横切关注点的问题。 - **DI** 的典型实现方式包括Setter注入和构造器注入。 - **AOP** 通过定义切入点、...
在Spring框架中,控制反转通常指的是依赖注入(Dependency Injection, DI)这一技术,通过这种方式,对象的创建和依赖关系的管理交由Spring容器负责。 - **目的**:通过将对象的创建和依赖关系的管理交给外部容器来...
Spring框架是中国际上广泛使用的Java企业级应用开发框架,它为开发者提供了丰富的功能,包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)、数据访问、事务管理、Web...
Spring框架的核心特性主要体现在Spring...总的来说,Spring框架的IOC和AOP是强大的工具,它们通过设计模式和创新的编程思想,解决了传统开发中的许多问题,使开发者能更专注于业务逻辑,从而提高了开发效率和软件质量。
在Spring框架中,IOC容器负责创建和管理对象,并提供了一种机制来将对象注入到应用程序中。 六、Spring实现AOP 在Spring框架中,可以使用AspectJ库来实现AOP。AspectJ库提供了一种注解方式来定义切面(aspect),...
Spring 框架是 Java 开发中的一个核心组件,它为开发者提供了丰富的功能,包括依赖注入(IOC)、面向切面编程(AOP)以及回调机制。让我们深入了解一下这些概念。 **Spring IOC(Inversion of Control,控制反转)*...
Spring框架是Java企业级应用开发中广泛使用的开源框架,其核心特性包括控制反转(IoC)和面向切面编程(AOP)。同时,注解作为Java语言的特性,在Spring中也扮演着重要的角色。Spring IOC、AOP、注解以及相关的知识...
Spring框架是Java开发中的核心组件,它以依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)为核心,极大地简化了企业级应用的开发工作。在这个“spring练习AOP与IOC...
Spring框架是Java开发中最常用的轻量级框架之一,它的核心组件包括IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这些jar包是实现Spring IOC和AOP功能的基础,下面将...
【Spring 概述】 ...总的来说,Spring 框架通过其轻量级特性、IoC 和 AOP 等机制,为 Java 应用程序开发提供了一种高效、灵活且易于管理的解决方案。无论是服务器端应用还是其他类型的 Java 应用,都能从中受益。
综上所述,IOC 和 AOP 是两种重要的软件设计模式和技术,它们有助于提高软件系统的可维护性、可扩展性和灵活性。在实际开发中,合理利用这两种技术能够帮助开发者更好地组织代码结构,降低系统复杂度,提高开发效率...