标签:决定 接口设计 第一个 参数 bug data return spec spring
互相之间的引用通过接口来体现
不new对象 通过容器获得对象
spring两大核心===============
控制反转IOC/依赖注入DI
面向切面AOP
=============================
applicationContext.xml spring配置文件->
<bean id="conDisk" class="dao.impl.ConDisk">
<property name="data">
<value> 值 </value>
</property>
</bean>
//data是类的属性 value是赋值
读配置文件返回对象
ApplicationContext context=new ClassPathXmlApplicationContext("*.xml");
context.getBean("biz"); //返回Object
日志==========
log4j包
Logger logger=Logger.getLogger( 当前类.class);
logger.debug(String);
//logger.error(String);
AOP=================> 添加xsd
增强Advice //比如日志Logger 在方法的前后添加
切入点Pointcut //某个类的方法的增强功能的位置
连接点Joinpoint
切面Aspect //指的是增强和切入点的组合
代理Proxy
目标对象Target //比如增强的对象
织入Weaving //编码过程
<bean id="serviceLogging" class="com.pb.aop.ServiceLogging"></bean>
<bean id="userService" class="com.pb.service.UserService"></bean>
<aop:config>
<aop:pointcut id="servicePointcut" expression="execution(public * com.pb.service.*.*(..))" />
<aop:aspect ref="serviceLogging">
<aop:before method="beforeService" pointcut-ref="servicePointcut"/>
<aop:after-returning method="afterReturning" pointcut-ref="servicePointcut" returning="returnVal"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="servicePointcut" throwing="ex"/>
<aop:after method="after" pointcut-ref="servicePointcut"/>
<aop:around method="around" pointcut-ref="servicePointcut"/>
</aop:aspect>
</aop:config>
表达式匹配规则 针对方法====================
public * addUser(com.pb.entity.User) //匹配所有返回值的类型的addUser方法
public void *(com.pb.entity.User) //匹配公共无返回值的所有方法
public void addUser(..) //匹配所有参数的方法
* com.pb.service.*.*(..) //匹配com.pb.service包下所有类的所有方法
* com.pb.service..*(..) //匹配com.pb.service包及子包下所有类的所有方法
增强方法的参数 joinpoint jp======================
jp.getTarget() //得到增强目标的类名
jp.getSinature().getName() //得到增强目标的方法名
jp.getArgs()[0] //得到增强目标的第一个参数的值
方法之后执行的增强方法可以得到返回值 ===========================
aop:after-returning returning="result"
在方法里增加返回值
增加增强方法的参数并且调用
spring AOP的主要工作========================
通过Advice增强 描述横切逻辑和方法的具体织入点(方法前,后,两端等)
通过Pointcut切点 指定在哪些类的哪些方法上织入横切逻辑
通过Aspect切面 将Pointcut切点和Advice增强两者结合起来
利用jdk动态代理结束或GCLib为目标Bean创建织入切面的代理对象
AOP的动态代理================
jdk动态代理 面向接口设计
java.lang.reflect.InvocatuinHandler 定义增强 invoke方法的调用
java.lang.reflect.Proxy 创建代理对象
CGLib动态代理
JAVA源代码--->编译后的字节码文件CLASS-->运行时虚拟机JVM加载CLASS到内存
不需要源代码 直接生成二进制字节码文件
继承重写 需要代理的类不能被常量final修饰
面向接口
一个接口做代理 为所有实现类增强
创建速度快 执行速度慢
面向具体类型
在运行过程中 动态创建子类 实现代理 在子类中调用代理 调用原装核心业务 实现增强
不能有final修饰 无法继承重写
创建速度慢 执行速度快
spring框架决定调用代理
如果是接口和实现类 创建jdk动态代理
如果是没有接口和实现类 则创建CGLIB代理
手动设置代理
在spring配置文件中
<aop:config proxy-target-class="true"> //默认是false
</aop:config>
true直接对目标对象做代理 ---- CGLIB
标签:决定 接口设计 第一个 参数 bug data return spec spring
原文地址:http://www.cnblogs.com/m97i/p/7514038.html