Spring的Bean操做(注解方式):spring
注解:代码中特殊的标记,使用注解能够完成相关功能。
@注解名称(属性名称=属性值)
注解可使用在类、方法、属性上面。
主要用途:能够替代配置文件来建立对象和属性注入。express
在作ioc基本功能时,配置文件引入的schema约束为beans约束,而在作spring的ioc注解开发,引入新schema约束的context约束。编程
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
引入约束后,注解方式还须要在配置文件中开启注解扫描:缓存
<!-- 开启注解扫描:该配置扫描包中的类、方法、属性上是否有注解 --> <context:component-scan base-package="包名"></context:component-scan> <!-- 该配置只扫描属性上是否有注解 --> <context:annotation-config></context:annotation-config>
使用注解建立对象:在建立的类上方使用注解便可。安全
/** * 该注解中的value="test"至关于配置文件中的<bean id="test"...... */ @Component(value="test") public class Test{ }
建立对象含有四种注解方式:框架
四个注解的目前功能都是同样的。Spring种提供@Component的三个衍生注解:
@Controller:wen层 @Service:业务层 @Repository:持久层
该三种注解方式时为了让标注类自己的用途清晰。Spring后续版本会对其加强。性能
@Scope(Value="prototype"):多实例;做用范围。spa
@Component(value="test") @Scope(value="singleton")//单实例的 public class Test{ }
使用注解注入属性:prototype
使用注解方式的属性注入时不须要set方法,而是在须要注入的属性上方使用注解@Autowired便可。代理
除去@Autowired注解外还有另外一种注解方式:@Resource(name="指定注解类种的value值")
XML和注解方式混合使用:
建立对象操做使用配置文件方式实现。
注入属性的操做使用注解方式实现。
AOP:
面向切面编程。扩展功能不修改源代码实现。AOP采起横向抽取机制,取代了传统的纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)
aop操做相关术语:
Joinpoint(链接点):指那些被拦截到的点。在Spring中,这些点指的时方法,由于Spring只支持方法类型的链接点。
简述:指类中那些方法能够被加强,这些方法称为链接点。
Pointcut(切入点):指要对那些Joinpoint进行拦截的定义。
简述:指在类中能够有不少的方法被加强,实际加强的方法称为切入点。
Advice(通知/加强):加强的逻辑称为加强。所谓通知是指拦截到Joinpoint以后所要作的事情就是通知,通知分为:
前置通知:在方法以前执行。
后置通知:在方法以后执行。
异常通知:方法出现异常。
最终通知:在后置以后执行。
环绕通知(切面要完成的功能):在方法以前和以后执行。
Aspect(切面):是切入点和通知(引介)的结合。
简述:把加强应用到具体方法上,就是把加强用到切入点的过程称为切面。
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction能够在运行期为类动态的添加一些方法或Field。
Target(目标对象):代理的目标对象(要加强的类)。
Weaving(织入):是把加强应用到目标的过程。把advice应用到target的过程。
Proxy(代理):一个类被AOP织入加强后,就产生一个结果代理类。
Spring基于aspectj的xml方式的AOP操做:
在Spring中进行aop操做,须要使用aspectj来实现。aspectj是一个面向切面的框架,是一个基于Java语言的aop框架。
aspectj不是Spring的一部分,和Spring一块儿使用进行aop操做。Spring2.0以后新增了对aspectj支持。
使用aspectj来实现aop有两种方式:一、基于aspectj的XML配置。二、基于aspectj的注解方式。
AOP操做准备:
一、除去导入基本的jar包以外,还须要导入aop相关的jar包:
aopalliance.jar、aspectjweaver.jar、spring-aop.RELEASE.jar、spring-aspects.RELEASE.jar
二、建立Spring核心配置文件。须要导入aop约束。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>
使用表达式配置切入点:
一、切入点:实际加强的方法。
二、经常使用表达式格式:execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
例:execution(* 加强方法的全路径(..)) *:任意的修饰符
execution(* cn.test.aop.Test.*(..)) 类.*:对类中的全部方法加强
execution(* *.*(..)) *.*:对全部类中的全部方法进行加强
execution(* save*(..)) save*:匹配全部save开头的方法进行加强
<!-- 配置对象 --> <bean id="test" class="Test全路径"></bean> <bean id="zqtest" class="ZQTest全路径"></bean> <!-- 配置aop操做 --> <aop:config> <!-- 配置切入点 --> <!-- 对Test类中全部方法进行加强 --> <aop:pointcut expression="execution(* Test全路径.*(..))" id="pc1"></aop:pointcut> <!-- 配置切面 --> <!-- 把加强用到方法上 --> <aop:aspect ref="zqtest"> <!-- 配置加强类型 method:加强类中使用那个方法做为前置执行 pointcut-ref:做用在那个切入点上, 对应配置切入点的id值--> <aop:before method="方法名" pointcut-ref="pc1"/> <!-- 后置执行 --> <aop:after-returning method="方法名" pointcut-ref="pc1"/> <!-- 环绕执行 在环绕方法中用 ProceedingJoinPoint.proceed() 来执行被加强的方法--> <aop:around method="环绕方法名" pointcut-ref="pc1"> </aop:aspect> </aop:config>
基于aspectj的注解aop操做:
使用注解方式实现aop操做:先建立对象,而后开启AOP操做。在加强类上使用注解完成aop操做;并在加强的方法上使用注解完成加强配置。
<!-- 配置对象 --> <bean id="test" class="Test全路径"></bean> <bean id="zqtest" class="ZQTest全路径"></bean> <!-- 开启aop操做 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Aspect public class ZQTest{ //在方法上使用注解完成加强配置 @Before(value="execution(* Test类全路径.*(..))") public void fun(){ } }