Spring AOP 实现类添加增强后,引用实现类的其他类无法创建Bean???

最近刚学Spring AOP,遇到一个问题
是这样的,有两个类A,B

 public class A{
    private B b;
    ......
}
 public class B implements C{
    private String name;
    ......
}

我的配置文件里是这样写的

 <bean id="b" class="cn.pojo.B" p:name="Jamie"></bean>
<bean id="a" class="cn.pojo.A" p:b-ref="b"></bean>

单单这个是没问题的

但是一旦为B类加上增强后(我加的是前置增强和后置增强)
增强代码没问题,单独测试的时候有效果,但是只要一加上创建A的bean的代码时,就会报错,显示无法创建A的bean实例,但是为什么我只要把A类里对B的引用的类型换成接口类型就可以了呢?
(就是private C b;)

然后我又测试了一下,干脆不要接口了,直接写,也不报错了,怎么又接口的时候,对于被增强的类的引用,它的类型要写接口类型呢?

 <bean id="aop1" class="com.duan.AOP1"></bean>
    <aop:config> 
        <aop:aspect ref="aop1">
                <aop:pointcut expression="execution(* com.pojo.*.*(..))" id="rpointer"/>
                <aop:before method="before" pointcut-ref="rpointer"/>
                <aop:after method="after" pointcut-ref="rpointer"/>
        </aop:aspect>
    </aop:config>

1个回答

用接口是一中规范的写法,大都是这样写,的约定俗成

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
spring AOP 实现日志管理

首先请各位大牛请不要粘贴一个网址! ![图片说明](https://img-ask.csdn.net/upload/201708/08/1502198737_720560.png) 这是我没事做的一个基于AOP的日志管理, ============================ 实现原理是通过拦截 【整个实体类,也就是整个@RequestBody,比如Emp emp类】 通过获取Emp的类注解,写入【注解】【值】 ,进行操作日志 ============================== 然而,参数是实体类中的属性或者字段【id = 1,name=张三】 的时候,这个日志操作就无法进行了 **因为无法把参数重新在aop里面组装成实体类** 大牛们有没有什么好的想法?

spring AOP 织入没有加入注解的类方法

本人在做一个关于日志的功能,使用到spring aop。 但问题是作为切点的那个方法所在的类是一个抽象类,并且实现的子类并不是通过spring容器来注入的 我试了下其他有打注释标签的类,前置通知和后置通知都是可以执行的,证明我写的语法并没有错误,所以我判断是类的加载问题。 那有什么办法能够把相关的通知加上的吗? 贴上相关代码: 相关切面 @Aspect @Component("serviceMethodLogInterceptor") public class ServiceMethodLogInterceptor { @Autowired private SQLService sqlService; /** * 服务方法切入点 */ @Pointcut(value = "(execution(* com.snxun.hczz..*.*(..))) && (execution(@com.rop.annotation.ServiceMethod * *(..))) && (!execution(* com.snxun.hczz.log..*.*(..)))") public void serviceMethodPointcut() {} /** * 解析方法切入点 */ @Pointcut(value = "(execution(* com.snxun.hczz..SQLContext.*(..)))") public void analyseMethodPointcut() {} ..... } 要切入的对象 public abstract class SQLContext<T extends SQLParam> implements SQLAnalyses<T> { .... }

怎样用spring aop 拦截servlet

附件中的小例子可以用spring aop拦截普通类的方法,但是不能拦截servlet,可能是因为servlet是由web容器实例化而不是有spring容器实例化。请问怎样可以实现spring aop拦截servlet?或者怎样用spring实例化servlet?谢谢!

Spring AOP实现操作审计思路

aop能获取连接点的类、方法名、参数,但做审计的时候需要业务数据,如业务数据放在第一个参数里面,怎么样获取不同业务数据里面的指定属性值(获取方法名已知)? 别说一个一个判断然后强制转换,这样太麻烦。

spring使用注解实现aop

我想用spring的注解实现aop对某些类的某几个方法进行拦截!例如我只拦截save和update两个方法! @Pointcut("execution(* com.test..*(..)")这样的表达式似乎不行!只能拦截所有方法和某一个方法!应该用什么方法来实现我的需求?必须是使用注解的!

spring AOP中如何给通知传递参数

我想在不修改原对象代码的情况下,插入对域模型的数据搜集方法,需要传入1个参数。 例如:病人信息(PatientInfo)与病人信息操作日志(PatientInfoOperationLog),二者存在一对多的关系。 ORM映射配置中采用了级联,病人信息操作日志为被动插入操作。 在CreatePatientAction中采集病人信息的数据,并对病人信息执行显式的save。 这样看来,病人信息操作日志的信息与Action并没有什么关联,可以视为独立运作单元;而且,如果以后不打算采用这个日志的时候,可以修改配置直接修改或删除AOP和ORM映射配置就可以了。 前段时间考虑过spring是否可以注入方法,经过讨论发现是不可行的。这样我打算使用AOP,但我尝试了AOP配置,在没有传递参数的情况下,可以正常执行通知。但我需要配置2个对象之间的关系,不得不传入病人信息作为参数来完成任务,但不知道怎么配置这个参数。 我尝试过加入arg-names属性,但服务器启动时就报错,没加这个属性也会报错,因为通知调用的方法是有参数的。 而且还有个疑问,这个参数是否可以是一个已经实例化的引用?我需要的是这个引用,而不能是新创建的对象,因为这没有意义。 我的配置如下,这里是没有加arg-names属性: <aop:config> <aop:pointcut id="createPatient" expression="execution(* patient.base.action.CreatePatientAction.execute(..)) " /> <aop:aspect id="patientInfoLogPluginAspect" ref="patientInfoLogPlugin"> <aop:before pointcut-ref="createPatient" method="plugin" /> </aop:aspect> </aop:config> <bean id="patientInfoLogPlugin" class="patient.base.action.assit.PatientInfoOpeLogPlugin" /> PatientInfoOpeLogPlugin类代码如下: public void plugin(PatientInfo patientInfo){ log.setOperation(defaultOperation); log.setOperateTime(this.now()); log.setOperator("admin"); log.setPatientInfo(patientInfo); Set <PatientInfoOperationLog> logSet= new HashSet <PatientInfoOperationLog>(); logSet.add(log); patientInfo.setOperationLog(logSet); } 服务器启动错误概要信息如下: 有没有配置arg-names的情况都一样: …… Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut …… [b]问题补充:[/b] 请一楼给个例子我试试,谢谢! [b]问题补充:[/b] [size=small][color=blue]三楼whistler的例子是标准例子。看后我考虑了一下,如果对Service类的相关方法进行拦截,确实可以达到我想要的结果,而且还可以不受Struts2的自带拦截器影响。其实,我原来的想法集中在如何让AOP拦截Action了,但后来经过查询资料和测试,发现无法达到,因为Struts2本身也对Action做了处理,与AOP的拦截发生了冲突。如果不拦截Action,就没有这个问题了。 谢谢你、谢谢大家的回复![/color][/size]

Spring AOP没有起作用

接口IAccount: [code="java"] package study.spring.aop.account; import java.util.List; public interface IAccount { public List<String> getAllAccount(); public String getAccountById(String id); } [/code] 实现类: [code="java"] package study.spring.aop.account.impl; import java.util.List; import study.spring.aop.account.IAccount; public class AccountImpl implements IAccount { public List<String> getAllAccount() { // TODO Auto-generated method stub return null; } public String getAccountById(String id) { // TODO Auto-generated method stub return null; } } [/code] Advice类: [code="java"] package study.spring.aop.advice; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class MyBeforeMethodAdvice implements MethodBeforeAdvice { public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("方法调用之前..."); System.out.println("下面是方法调用的信息:"); System.out.println("所执行的方法是:" + method); System.out.println("调用方法的参数是:" + args); System.out.println("目标对象是:" + target); } } [/code] Spring 配置文件: [code="java"] <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans default-autowire="byName" default-lazy-init="true"> <bean id="account" class="study.spring.aop.account.impl.AccountImpl" /> <!-- 第一个拦截器--> <bean id="myBeforeAdvice" class="study.spring.aop.advice.MyBeforeMethodAdvice"/> <!-- 使用ProxyFactoryBean 产生代理对象--> <bean id="accountProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 设置目标对象 --> <property name="target"> <ref bean="account" /> </property> <!-- 这里是代理的接口 --> <property name="proxyInterfaces"> <list> <value>study.spring.aop.account.IAccount</value> </list> </property> <!-- 代理对象所使用的拦截器--> <property name="interceptorNames"> <list> <value>myBeforeAdvice</value> </list> </property> </bean> </beans> [/code] 测试代码: [code="java"] package study.spring.aop; import org.springframework.test.AbstractSingleSpringContextTests; import study.spring.aop.account.IAccount; public class SpringTest extends AbstractSingleSpringContextTests { @Override protected String[] getConfigLocations() { return new String[] { "classpath:applicationContext.xml" }; } public void testApp() { IAccount account = (IAccount) this.getApplicationContext().getBean("account"); account.getAccountById("1"); } } [/code] 运行测试代码,advice里的输出为什么没有打印,求指教,谢谢大家。

Spring AOP自动加载bean问题

代码如下: 接口类: package nh.spring.tools.dao; /* * 定义计算机接口类, */ public interface ICalc { public int add(int i,int j); public int div(int i,int j); } 实现类: package nh.spring.tools.dao; import org.springframework.stereotype.Controller; /** * 定义计算机接口实现类 * @author Administrator * */ @Controller public class CalcImpl implements ICalc { @Override public int add(int i, int j) { return i + j; } @Override public int div(int i, int j) { return i / j; } } 配置applicationcontext <?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-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- 设置spring自动扫描 --> <context:component-scan base-package="nh.spring.tools.*"></context:component-scan> <!-- 开启aop --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans> 配置切面 package nh.spring.tools.aop.aspects; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspects { @Before("execution(public int nh.spring.tools.dao.CalcImpl.*(int,int))") public void beforeMethod(){ System.out.println("the method start with :"); } } 测试类: package nh.spring.tools.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import nh.spring.tools.dao.CalcImpl; public class TestCalc1 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("CalcImpl1.xml"); CalcImpl iCalc = context.getBean(CalcImpl.class); int result = iCalc.add(10, 2); System.out.println(result+""); } } 报错 log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment). log4j:WARN Please initialize the log4j system properly. Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [nh.spring.tools.dao.CalcImpl] is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:348) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:335) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1088) at nh.spring.tools.test.TestCalc1.main(TestCalc1.java:13) 如果注销掉切面类的before注解,就可以正常执行,请问是怎么回事?

不停服务器情况下怎么动态开启或者关闭spring aop

需求是记录指定方法的执行时间存oracle库,我就想到了spring aop 但是需还说,服务启动的时候(在没有好的方法的时候该功能暂且用aop)aop默认 是**关闭**的, 在前端jsp页面有一个开关。用户点击打开该开关的时候 aop才启动记录功能(为了节省服务器资源)。 但是 aop是在启动的时候把切面相关的bean都加载了(cglib里),如果启动的时候不开启aop,是不是这些bean就不加载了,那么再次开启怎么办,据说是需要热部署原理。哪位大神帮忙分析一下怎么实现?

使用Spring代理来实现AOP时,业务类一定要用到接口吗,我没有接口,直接是类难道不行?

<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true"> <property name="proxyTargetClass" value="true"></property> <property name="interceptorNames"> <list> // ... 暂时没有 </list> </property> </bean> <bean id="userServiceProxy" parent="proxyFactoryBean"> <property name="proxyInterfaces" value="com.tipf.project.service.UserService" /> <property name="target" ref="userService"></property> </bean> com.tipf.project.service.UserService这个是个类,而不是接口 启动服务器报错 UserService is not an interface 请问如何解决

spring aop中关于反射的问题

整个系统是mvc架构,有action、service、dao这三层。 在dao实现类中,现在有一个父类A,子类B,在父类中有一个save方法,方法上有一个注解。当调用save方法的时候,会被spring的aop拦截,通过反射机制,得到目标对象是子类,方法是父类中的save方法。 现在要取方法上的注解,取注解我是通过得到目标对象,再得到方法,再取注解。此时问题出来了,会报子类中没有save方法的错误。 这个错误报的是正确的,因为子类中确实没有save方法,之所以能够调用完全是因为继承的关系,但是并不能说子类就有save方法了。 在这样的情况下,大家是如何获取到save方法上的注解的。 子类覆盖父类的save方法这个方法除外。 请指教。

如何用AOP在不主动配置的情况下拦截实现某个接口的所有类的方法调用?

正在做一个项目,其中有个需求是实现一个aop,能够拦截dao层的所有crud操作(dao层的代码公司都是公司DAL框架自动生成的,全部继承了同一个父类,dao层的所有类继承了同一个父类),用户只需要添加相关依赖,然后不需要再写任何代码或者配置文件(比如说不能在各个类上注解或者像spring一样写xml配置文件),就可以实现拦截。这样一来,只要各个项目使用的是公司的DAL框架,并且依赖了我这个aop,那所有的增删方法查改都能被拦截并增强。 不知道这个功能是否能实现,有何好的思路?

一个关于Spring AOP的问题

先说一下情况:小弟现正用Spring AOP实现日志记录功能,上面交待Web层,Service层,Dao层都要记录,所以打算在Web层只记一下用户请求的情况,也就是说用户请求哪个Action时,记录一下操作步骤,Service层记录方法调用时的参数及返回值以及异常情况,Dao层上面交待要记录最终SQL(这个小弟现在还不知道怎么实现)。 在此只说一下Web层的日志记录,其它的略过了。我是这样的,先定义一个名为ActionName的annotation,有一个value属性,这个value属性的值就表示该Action方法的功能说明。然后我定义一个Pointcut匹配该annotation。到这里一切都没问题,能正常拦截并代理Action方法,但是前提是必须使用CGLIB! 我记得好像Spring能自动地判断目标方法并决定是使用动态代理还是CGLIB代理实现的。但是我在配置文件中如果不强制使用CGLIB代理则程序运行报错呢? 下面是我的代码: LogHandler类 package com.delver.bms.log.util; import java.lang.reflect.Method; import java.sql.Timestamp; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import com.delver.bms.exception.BusinessException; import com.delver.bms.log.annotation.ActionName; import com.delver.bms.log.annotation.TaskScheduling; import com.delver.bms.log.dao.IAppLogDao; import com.delver.bms.log.to.AppLog; import com.delver.bms.util.AutoID32; import com.delver.bms.util.TenantUtil; import com.ibm.crl.mmt.datamodel.MTUtilFactory; import com.ibm.crl.mmt.exception.MTException; /** * 日志记录切面类 * * @author yue.ch * */ @Aspect public class LogHandler { private IAppLogDao appLogDao; public void setAppLogDao(IAppLogDao appLogDao) { this.appLogDao = appLogDao; } /** * 定义切入点,匹配使用@ActionName注解的方法 * @param actionName @ActionName注解value值(功能解释) */ @Pointcut("@annotation(actionName)") public void annotationMethod(ActionName actionName) { } /** * 定义切入点,匹配使用@TaskScheduling注解的方法 * @param taskScheduling @TashScheduling注解value值(功能解释) */ @Pointcut("@annotation(taskScheduling)") public void annotationTaskMethod(TaskScheduling taskScheduling) { } /** * 定义切入点,匹配Service层方法 */ @Pointcut("execution(* com.delver.bms.*.service.*.*(..))") public void serviceMethod() { } /** * 定义切入点,排除UserDetailsServiceImpl类 */ @Pointcut("!within(com.delver.bms.identity.service.UserDetailsServiceImpl)") public void identityServiceMethod(){} /** * 定义切入点,排除日志记录功能模块的Service层方法 */ @Pointcut("!execution(* com.delver.bms.log.service.*.*(..))") public void logServiceMethod(){} /** * 定义切入点,排除日志记录功能模块的Dao层方法 */ @Pointcut("!execution(* com.delver.bms.log.dao.*.*(..))") public void logDaoMethod(){} /** * 定义切入点,匹配Dao层方法 */ @Pointcut("execution(* com.delver.bms.*.dao.*.*(..))") public void daoMethod(){} /** * 系统任务调度方法前置通知(记录任务调度方法功能说明及执行) * * @param joinPoint * @param taskScheduling */ @Around("annotationTaskMethod(taskScheduling)") public void aroundTaskScheduling(ProceedingJoinPoint joinPoint, TaskScheduling taskScheduling) throws Throwable { System.out.println("ddd"); } /** * Action方法前置通知(记录Action方法功能说明) * * @param joinPoint * @param actionName */ @Before("annotationMethod(actionName)") public void beforeActionLog(JoinPoint joinPoint, ActionName actionName) { System.out.println("ddd"); } /** * Service方法环绕通知 * * @param joinPoint * @return */ @Around("serviceMethod() && identityServiceMethod() && logServiceMethod()") public Object aroundServiceLog(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("ddd"); } /** * Dao方法环绕通知(记录SQL) * * @param jointPoint * @return */ @Around("daoMethod() && logDaoMethod()") public Object aroundDaoLog(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("ddd"); } 配置文件: <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="appLogDao" class="com.delver.bms.log.dao.AppLogDaoiBatis"> <property name="sqlMapClient" ref="sqlMapClient" /> </bean> <bean id="appLogManager" class="com.delver.bms.log.service.AppLogManagerImpl"> <property name="appLogDao" ref="appLogDao" /> </bean> <bean id="appLogInfo" class="com.delver.bms.log.web.AppLogInfo" scope="prototype"> <property name="appLogManager" ref="appLogManager" /> <property name="tenantManager" ref="tenantManager" /> </bean> <!-- 系统日志处理类 --> <bean id="appLogHandler" class="com.delver.bms.log.util.LogHandler"> <property name="appLogDao" ref="appLogDao" /> </bean> </beans> 异常信息: java.lang.NoSuchMethodException: $Proxy51.visit() at java.lang.Class.getMethod(Unknown Source) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(AnnotationValidationInterceptor.java:55) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:41) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123) 下面略。。。 [b]问题补充:[/b] 我希望的是Service层,Dao层用动态代理,web层用CGLIB代理,是不是不能实现?我试过配多个<aop:config>,但是只要其中有一个配置了proxy-target-class="true",就全都用CGLIB实现了,网上搜了下,貌似确实是这样的。还有,CGLIB代理与动态代理在运行期性能上有区别吗?

新人求助:springAOP自动代理配置

如下,这是源码 接口 ``` package test.spring.aop.bean; public interface Eatable { public void eat(); } ``` 实现类 ``` package test.spring.aop.bean; public class EatLunch implements Eatable { public void eat() { System.out.println("吃午饭..."); } } ``` 通知 ``` package test.spring.aop.bean; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; import org.springframework.aop.MethodBeforeAdvice; public class EatHelper implements MethodBeforeAdvice,AfterReturningAdvice{ public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable { System.out.println("吃完饭去刷牙了。。"); } public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable { System.out.println("要吃饭了,去洗手了。。"); } } ``` Spring配置文件 app3.xml ``` <?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:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd"> <!-- SpringAOP学习 Spring自动代理 --> <bean id="eatLunch" class="test.spring.aop.bean.EatLunch"></bean> <!-- SpringAOP学习之配置文件第1步 配置通知bean--> <bean id="eatHelper" class="test.spring.aop.bean.EatHelper"> </bean> <!-- SpringAOP学习之配置文件第2步 配置切点通知者--> <bean id="eatHelperAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice" ref="eatHelper"></property> <property name="pattern" ref=".*eat"></property> </bean> <!-- SpringAOP学习之配置文件第3步 自动代理对象--> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"> </bean> </beans> ``` junit测试类 ``` package test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import test.spring.aop.bean.Eatable; public class Test_SpringAop2 { @Test public void test1(){ ApplicationContext appCtx = new ClassPathXmlApplicationContext("app3.xml"); Eatable eatable = (Eatable)appCtx.getBean("eatLunch"); eatable.eat(); } } ``` 运行之后junit报错,如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eatLunch' defined in class path resource [app3.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'eatHelperAdvisor' defined in class path resource [app3.xml]: Cannot resolve reference to bean '.*eat' while setting bean property 'pattern'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '.*eat' is defined 采用手动代理配置可以得到正确结果,如下: ![图片说明](https://img-ask.csdn.net/upload/201609/26/1474871781_421978.png)

spring的aop是怎么样的原理?

spring的aop实现原理和运行过程,请结合代码来具体说明一下给从来没学过aop的人也能听明白,别简单的说 动态代理和反射。。。

在已经配置了SpringAOP的情况下,通过其他方法管理AOP是否生效

这个AOP的作用是拦截service层,制作假数据的(数据源在内网) 有什么办法可以通过识别上下文中的某个变量来修改这个AOP的初始状态,使他在项目启动时不生效? 跟踪了一上午的源码,自己弄得会报错然后就弄其他的去了

怎么把一个jar包里的类交给spring管理并进行aop

我对spring不太熟悉,所以也不知道这个需求是不是有点奇怪:现在有个jar包,我们自己写的类继承自jar包里的某个类,平时使用就是new一个对象出来,能不能将jar包里的这个类让spring管理进行aop,这样子类调用父类的方法都能切到?如果spring不行有没有其它方法实现这个需求(对于子类必须是透明的,还是照常new使用,只是调用父类方法能被拦截)?

Spring AOP实现日志入库时,日志方法开不了事务

最近需要给接口代码加日志入库排查问题,切面切进日志方法之后,发现开不了子事务,求大佬指点,谢谢了 ![控制台信息](http://img.bbs.csdn.net/upload/201705/04/1493890790_499594.png) 日志方法: ![日志方法](http://img.bbs.csdn.net/upload/201705/04/1493890933_386838.png) XML配置: ![XML配置](http://img.bbs.csdn.net/upload/201705/04/1493892016_914650.png) 另:有个小疑问![关于表达式的小疑问](http://img.bbs.csdn.net/upload/201705/04/1493892137_574256.png) 这个表达式是指,service包下所有类的所有方法是吧?和别人意见有点冲突,望指正 技术问答和论坛不一样吗。。。为什么论坛里面没人回答、、技术论坛之前提的还有人回复,还是我变丑了?

Spring aop 为什么注解方式获取的并无法进入?Autowired getBean

请问下我配置的AOP写日志 为什么private static ApprovalService approvalService = SpringContextHolder.getBean("approvalService"); 这样获取bean就可以进入切面, @Autowired private ApprovalService approvalService; 用注解就不行呢?

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

立即提问
相关内容推荐