spring

Posted m97i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

















































































































以上是关于spring的主要内容,如果未能解决你的问题,请参考以下文章

Springspring事务失效的12种场景

SpringSpring MVCMyBatis

SpringSpring Data JPA

SpringSpring系列4之Spring支持JDBC

SpringSpring底层核心原理解析

SpringSpring 网络原因导致日志下载失败