Bean
源码
https://github.com/cmdch2017/Bean_IOC.git
获取Bean对象
BeanFactory
Bean的作用域
第三方Bean需要用@Bean注解
比如消息队列项目中,需要用到Json的消息转换器,这是第三方的Bean对象,所以不能用@Component,而要用@Bean
AOP
如何生成切面方法的执行时间
execution表达式(一般方法)
表达式
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
modifiers-pattern: 方法的修饰符模式,例如 public, protected, private, * 等。
ret-type-pattern: 方法的返回类型模式。
declaring-type-pattern: 方法所在类的类型模式。
name-pattern: 方法名模式。
param-pattern: 方法参数模式。
throws-pattern: 方法抛出的异常模式。
举例
匹配在 com.example 包下的任何类中以 “find” 开头的方法,且返回类型为 List:”
execution(List com.example..*find*(..))
匹配包名为 com.example 下的任何类的任何方法:
execution(* com.example..*(..))
下面的代码中是为了记录方法的执行时间:
@Component
@Aspect
public class TimeAspect {
@Pointcut("execution(* org.wego.controller.*.*(..))")
private void pt() {
}
@Around("pt()")
public Object calTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object object = joinPoint.proceed();
long endTime = System.currentTimeMillis();
System.out.println(joinPoint.getSignature() + "执行时间:" + (endTime - startTime) + "ms");
return object;
}
}
annotation方法(灵活但麻烦,需要在使用的方法上加上注解,仅在处理不好描述execution表达式的时候)
MyLog
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyLog {
}
MyAspect
@Component
@Aspect
public class MyAspect {
@Pointcut("@annotation(org.wego.aop.MyLog)")
private void pt() {
}
@Around("pt()")
public Object calTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object object = joinPoint.proceed();
long endTime = System.currentTimeMillis();
System.out.println(joinPoint.getSignature() + "执行时间:" + (endTime - startTime) + "ms");
return object;
}
}
具体使用的地方