-
JSR-250标准注解,推荐使用@Resource来代替Spring专有的@Autowired注解。只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将 @Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略查看全部
-
1.ApplicationContextAware 1.1 接口方法:setApplicationContext 1.2 作用:通常用来获取上下文对象,声明全局变量后在方法中对变量进行初始化并供其他方法调用 1.3 实现过程:创建一个类并实现ApplicationContextAware接口,重写接口方法public void setApplicationContext(ApplicationContext applicationContext);在xml文件中配置该类;当spring加载该配置文件时即调用接口方法 2.BeanNameAware 2.1 接口方法:setBeanName 2.2 作用:获取声明的类名,声明全局变量后在方法中对变量进行初始化并供其他方法调用 2.3 实现过程:创建一个类并实现BeanNameAware接口,重写接口方法public void setBeanName(String name);在xml文件中配置该类;当spring加载该配置文件时即调用接口方法 综合测试: 1.创建一个类,同时实现ApplicationContextAware和BeanNameAware接口并重写其方法。声明一个全局变量beanName并在方法setBeanName对其初始化; 2.在setApplicationContext方法中使用参数applicationContext的getBean方法(方法参数为成员变量beanName,即this.beanName)获取bean的名称并打印其hashcode 3.将1中创建的类配置到xml文件中 4.创建单元测试,读取xml文件并执行测试方法,通过上下文信息直接获取bean并打印出其hashcode 结论:在加载xml文件时即加载其配置的bean并调用其中的方法,最后的hashcode相同,说明获取的bean是同一个。查看全部
-
AspectJ小结 一、配置@AspectJ - xml方式 <aop:aspectj-autoproxy></aop:aspectj-autoproxy> - 注解方式 @Component @Aspect 二、Pointcut @Pointcut 使用@Pointcut注解,方法的返回值类型必须是void 三、Advice 1.Before advice 2.After returning advice 3.After throwing advice 4.After (finally) advice 5.Around advice 6.给advice传递参数 7.Advice的参数及泛型查看全部
-
★advisor就像一个小的自包含的方面,只有一个advice ★切面自身通过一个bean表示,并且必须实现某个advice接口,同时,advisor也可以很好的利用AspectJ的切入表达式 ★Spring通过配置文件中<aop:advisor>元素支持advisor实际使用中,大多数情况下它会和transactional advice配合使用 ★为了定义一个advisor的优先级以便让advice可以有序,可以使用order属性来定义advisor的顺序 advisors的使用场景: 通常会用在一个环绕通知中 我们可以统计方法的调用次数或者调用频率,或是某种情况下需要对调用次数进行控制。 比如这里我们可以在函数尝试调用4次的时候抛出一个异常实现查看全部
-
配置切入点Pointcut(001) 切入点的配置就是配置业务类中的哪些方法在执行前后会调用切面中的方法,切入点是和通知advice配合使用,配置了切入点,通知才会知道在哪些业务类的哪些方法执行 <aop:pointcut expression="execution(* com.imooc.aop.schema.advice.biz.*Biz.*(..))" id="moocPiontcut"></aop:pointcut> <br> <br> expression配置方式介绍:<br> <br> execution用于匹配方法执行的连接点查看全部
-
举个形象的例子,我有一个空着的水杯(list),而你没有,那你是null,我的size为0。你想装水需要去买个水杯(new ArrayList();),我就可以直接装水(list.add(水))。你要是没有杯子直接倒水,水就流出去啦(空指针异常)。所以用做判断的时候经常连用 list!=null && list.size()!=0 。查看全部
-
@Bean默认是单例的 为了指定范围,使用@Scope注解,singleton,prototype(每次请求都会创建一个新的对象,为了区分,应该查看对象的hashcode,而类的hashcode是一样的), 采用哪种代理方式proxyMode查看全部
-
【编码技巧】:输入syso之后,按ALT+/就直接输入System.out.println("");查看全部
-
听的好头大啊!查看全部
-
introductions(简介):简介允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象 由 <aop:aspect>中的<aop:declare-parents>元素声明该元素用于声明所匹配的类型拥有一个新的parent 说白了就是为那些匹配的类加上一个接口,并且加上实现查看全部
-
@Autowaird注解: 可以使用@Autowaird注解那些众所周知的解析依赖性接口, 比如:BeanFactory,ApplicationContext,Environment,ReaourceLoader,ApplicationEventPublisher,and MessagSource 比如可以声明一个ApplicationContext的一个引用,并使用@Autowaird注解,就可以在当前类中得到IOC的上下文信息,并可以使用上下文信息查看全部
-
Spring的API实现AOP功能
1、这是Spring1.2的历史用法,现在Spring4.0仍然支持。
2、这是SpringAOP的基础
使用Spring的API实现AOP的原因:Schema-based(配置文件)和AspectJ实现AOP完全可以满足我们使用AOP的功能,使用API是因为这是SpringAOP的基础,可以加深我们应用和了解SpringAOP的理解(无论是注解方式、还是XML配置文件的方式,最终实现的基础都是和API密切关系的)。
3、现在SpringAOP的用法也是基于历史的,只是更简便了(在Spring1.2时配置文件很多,还需要了解各种配置)。
Spring的API
一、Pointcut(作为一个接口,有几个实现类)
1、Pointcut接口的实现类之一:NameMatchMethodPointcut,根据方法名字进行匹配。
2、该类有一个成员变量:mappedNames(它是一个集合,存放用于匹配的方法的名称),匹配方法的集合。
配置文件的例子:(sa开头的所有方法进行切入)
二、Before advice(原理:单独写一个前置通知的类,并实现MethodBeforeAdvice接口,并实现该接口的方法,)
1、一个简单的通知类型。
2、执行逻辑方法前被调用,不需要MethodInvocation对象。
3、前置通知可以在连接点执行之前插入自定义行为,但不能改变返回值。
案例:(会使用到后面的知识,暂时编写这些)
public class MoocBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] object, Object target) throws Throwable {
System.out.println("前置通知的方法:" + method.getName() + " " + target.getClass().getName());
}
}
三、Throws advice
1、如果连接点(执行的业务方法)出现异常,throws advice在方法返回后被调用。
2、如果throws-advice的方法抛出异常,那么它将覆盖原有异常。
3、接口org.springframework.aop.ThrowAdvice不包含任何方法,仅仅是一个声明,其实现类一定要实现类似这样的方法,void afterThrowing([Method, args, target],ThrowableSubclass);
Throws advice发生异常的说明
public void afterThrowing(Exception ex);//只有一个异常。
public void afterThrowing(RemoteException ex);//另外一种类型的异常。
public void afterThrowing(Method method,Object[] args(目标参数),Object target(对象),Exception ex);
public void afterThrowing(Method method,Object[] args(目标参数),Object target(对象),ServletException ex(其他类型的异常));
结论:异常通知(如上)方法参数里必须有异常,其他参数可有可无的。
抛出异常通知案例:
public class MoocThrowsAdvice implements ThrowsAdvice{
public void afterThrows(Exception ex){
System.out.println("抛出异常通知执行了");
}
public void afterThrows(Method method,Object[] object,Object target,Exception ex){
System.out.println("抛出异常通知执行了");
}
}
四、After Returning advice
1、返回后通知必须实现org.springframework.aop.AfterReturningAdvice接口(它和基于配置文件的配置方式是一样的)
2、可以访问返回值(但不能修改返回值)、被调用的方法、方法的参数和目标。
3、如果抛出异常,将会抛出拦截器链,替代返回值。
返回后通知案例
public class MoocAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("返回后通知方法执行了"+method.getName()+" "+target.getClass().getName()+" "+returnValue);
}
}
五、Interception around advice(环绕通知)
1、Spring的切入点模型使得切入点可以独立与advice重用,以针对不同的advice可以使用相同的切入点(和之前基于XML配置文件的AOP实现方式是一样的,切入点可以放在外面单独地去定义,通过Point reference,在每一个业务逻辑方法中都可以引用相同的切入点,当然,每个Advice也可以定义自己的Point cut)。
案例:
public class MoocMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object obj = null;
System.out.println("环绕前通知实现了");
obj = invocation.proceed();
System.out.println("环绕后通知实现了");
return null;
}
}
六、Introduction advice(和XML配置中的Introduction advice一样的功能)
1、Spring把引入通知作为一种特殊的拦截通知。
2、如果使用API实现AOP,则需要IntroductionAdvisor和IntroductionInterceptor这两个接口。
3、Introduction advice仅适用于类,不能和任何其它切入点一起使用。
如下为基于XML配置的Introduction advice内容
一个Spring test suite的例子
1、如果调用lock()方法,希望所有的setter方法抛出LockedException异常(使用场景:如使物体不可变,AOP典型例子)
2、需要完成繁重任务的IntroductionInterceptor,不是去实现该接口,而是使用org.springframework.aop.support.DelegatingIntroductionInterceptor
查看全部 -
基于Schema-based配置的AOP实现
Spring所有的切面和通知器都必须放在<aop:config>内(可以配置多个<aop:config>元素),每一个<aop:config>可以包含aspect,pointcout和advisor元素(它们必须按照这个顺序进行声明)。
<aop:config>的配置大量使用了Spring的自动代理机制。
该配置的含义:一个类作为切面来声明,切面Id是myAspect,也就是说程序执行某个功能模块时,通过pointcut和Joinpoint执行该切面的功能。
案例:两个类,一个类作为切面类,另一个作为业务类。(注意:<beans>中添加约束,xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
)
代码:
<?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"
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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<bean id="aspectImooc" class="aspect.AspectImooc"></bean>
<bean id="ServiceImooc" class="aspect.ServiceImooc"></bean>
<aop:config>
<aop:aspect id="aspectImoocAop" ref="aspectImooc"></aop:aspect>
</aop:config>
查看全部 -
1.ApplicationContextAware 1.1 接口方法:setApplicationContext 1.2 作用:通常用来获取上下文对象,声明全局变量后在方法中对变量进行初始化并供其他方法调用 1.3 实现过程:创建一个类并实现ApplicationContextAware接口,重写接口方法public void setApplicationContext(ApplicationContext applicationContext);在xml文件中配置该类;当spring加载该配置文件时即调用接口方法 2.BeanNameAware 2.1 接口方法:setBeanName 2.2 作用:获取声明的类名,声明全局变量后在方法中对变量进行初始化并供其他方法调用 2.3 实现过程:创建一个类并实现BeanNameAware接口,重写接口方法public void setBeanName(String name);在xml文件中配置该类;当spring加载该配置文件时即调用接口方法 综合测试: 1.创建一个类,同时实现ApplicationContextAware和BeanNameAware接口并重写其方法。声明一个全局变量beanName并在方法setBeanName对其初始化; 2.在setApplicationContext方法中使用参数applicationContext的getBean方法(方法参数为成员变量beanName,即this.beanName)获取bean的名称并打印其hashcode 3.将1中创建的类配置到xml文件中 4.创建单元测试,读取xml文件并执行测试方法,通过上下文信息直接获取bean并打印出其hashcode 结论:在加载xml文件时即加载其配置的bean并调用其中的方法,最后的hashcode相同,说明获取的bean是同一个。
查看全部
举报