多种方法实现依赖注入
构造注入:
关键代码如下:
<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是⼀个轻量级的IoC和AOP容器框架。是为Java应⽤程序提供基础性服务的⼀套框架,⽬的是⽤于简化企业应⽤程序的开发,它使得开发者只需要关⼼业务需求。常见的配置⽅式有三种:基于XML的配置、基于注解的配置、...
spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和Classpath扫描 spring-expression:表达式语句 切面编程: spring-aop:面向切面编程,CGLB,JDKProxy spring-aspects:集成...
- 以RELEASE.jar结尾的包是spring框架class文件的jar包。 - 以RELEASE-jdoc.jar结尾的包是spring框架API文档的压缩包。 - 以RELEASE-sources.jar结尾的是Spring框架源文件的压缩包。 ### 在libs目录中,有四个...
Spring框架提供了一个容器,该容器可以管理应用程序的组件,还提供了IoC和AoP机制,实现组件之间解耦,提高程序结构的灵活性,增强系统的可维护和可扩展性。 在SSH整合开发中,利用Spring管理Service、DAO等组件,...
提取了Spring的核心逻辑,极大地简化了代码,并完善了Spring的核心功能,例如IoC和AOP,资源加载器,事件侦听器,类型转换,容器扩展点,Bean生命周期和作用域以及应用程序上下文,被保留。 如果这个项目可以为您...
tiny-spring是简化版的spring框架,能帮助您快速熟悉spring原型和掌握spring的核心原理。摘录了spring的核心逻辑,代码极度简化,保留spring的核心功能,如IoC和AOP,资源加载器,事件监听器,类型转换,容器扩展点...
Spring框架是一个开源的轻量级Java企业应用程序开发框架,它提供了IoC容器、AOP、事务管理、JDBC、ORM等重要特性。Spring使用ApplicationEvent和ApplicationListener两个核心接口实现了事件监听机制。开发者可以...
(1) spring-core.jar 这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。 (2) spring-beans.jar 这个...
概述Spring Aop在Spring框架中的布局举足轻重,主要用于实现事务,缓存,安全等功能。主要介绍以下三个方面: Spring AOP多种代理机制相关核心类介绍。 Spring Boot中AOP注解方式源码分析。 Spring Boot 1.x版本和2...
后端采用了Spring框架的IoC和AOP特性,提供了RESTful API接口,实现了用户管理、景点管理、预约管理等核心功能。前端使用Vue.js框架搭建了用户友好的界面,实现了数据展示、交互操作等功能模块。在系统实现过程中,...
以下是Spring框架的一些关键特性和组件: IoC容器(控制反转):。 Spring框架心得: 松耦合和依赖注入的优势: Spring的IoC容器和依赖注入机制带来了松耦合的设计,使得组件更容易替换和维护。 AOP的强大功能:...
Spring框架提供了广泛的功能,帮助开发者快速搭建高效、可维护、可扩展的企业级应用程序。Spring的核心特性包括依赖注入、面向切面编程、控制反转、以及各种集成支持。依赖注入(Dependency Injection,DI):Spring...
本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计来实现基于Spring框架的应用的安全控制方法。 关键词Spring;Acegi;认证;授权1引言 近年来,随着Internet技术的迅猛发展,计算机网络已...
在该项目中,我们将使用Spring框架提供的IoC和AOP特性,实现对象的依赖注入和面向切面编程,提高代码的可维护性和可扩展性。同时,我们还将使用Spring Security框架提供的安全认证和权限控制功能,保障商城后台的...
核心概念:深入探讨了 Spring 的核心概念,如控制反转(IoC)和面向切面编程(AOP),以及它们如何改善应用程序的设计和结构。 Spring 容器:介绍了 Spring 容器的不同类型,包括 BeanFactory 和 ...
Spring框架是Java领域中一个非常重要的开源框架,它致力于解决...Spring框架以其非侵入式的设计、控制反转(IoC)和面向切面编程(AOP)等核心特性,极大地简化了Java应用的开发过程,提高了代码的可维护性和可扩展性。
本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计来实现基于Spring框架的应用的安全控制方法。关键词Spring;Acegi;认证;授权引言近年来,随着Internet技术的迅猛发展,计算机网络已深入到...
spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器。 其核心是IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC...