1.springaop应用----增强一个方法—增强一个类/对象
- 1.到官网查看文档
- 2.@AspectJ
AOP--------面向切面的目标
spring aop -----手段
AspectJ --------手段
由于spring2.5实现aop由诟病,所以借助了AspectJ 语法style
构建Aspect步骤:- 1.@EnableAspectJAutoProxy
- 2.配置一个类加上@Component加入bean容器
- 3.@Aspect声明一个切面
- 4.方法的集合称为一个@Pointcut,里面连接点(连接点的最小单位称之方法,一个表达式可以实现多个连接点)
- 5.aop通知@Before(方法名)等(一个术语):
切入连接点的时机或内容
切点和连接点和通知所在的类称为一个切面–Aspect
2.源码
//所以代理对象在初始化的时候已经代理放到了map中调用了refresh()----preInstantiateSingletons()---getBean(beanName)----doGetBean()---getSingleton(beanName)
//initializeBean完成了目标对象到代理的改变(BeanPostProccessor),
//singletionObjects.put(beanName,singletionObject)存入了map
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext(Appconfig.class);
//看源码得出getBean---map.get("KEY")
UserDao user = ac.getBean(UserDao.class);
//user对象被改变(代理)
user.query();
- aop把我们原来的对象user改变了,从目标对象target改变为了proxy,bean中只存在了改变的对象.
- proxy有两种方法:
- 1.直接获取一个代理对象 //getBean
- 2.首先产生一个目标对象然后对目标对象进行代理返回代理对象 //doCreateBean(){}
aop原理理解:(在中间一步)spring会调用采用BeanPostProccessor接口对它返回一个代理对象(底层通过2方法完成(1.cglib 2.jdk状态代理))