1、Spring的了解
     Spring是一个轻量级的IOC/DI和AOP容器的开源框架。可以实现Java模块化开发,贯穿表现层,业务层,逻辑层,实现各层之间的解耦合关系。
     IOC,控制反转,将程序中手动创建对象的控制权交由Spring框架来管理,从而实现对象之间解耦合
     AOP,面向切面编程,将功能代码从业务逻辑代码中分离,使之可以更专注于业务
2、AOP的实现方式
     AOP的实现方式有两种:JDK动态代理和cglib实现
     如果目标对象实现了接口,默认情况下采用JDK的动态代理实现AOP,也可以强制使用cglib实现AOP
     如果目标对象没有实现接口,必须采用cglib,Spring会自动在JDK动态代理和cglib之间切换
3、JDK动态代理如何实现
     JDK动态代理,只能对实现了接口类生成代理,而不是针对类,该目标类型实现的接口都将被代理。原理是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。具体步骤如下:
    ①、定义一个实现接口InvocationHandler类
    ②、通过构造函数,注入被代理类
    ③、实现invoke(Object proxy,Method method,Object[] args) 方法
    ④、在主函数中获得被代理类的类加载器
    ⑤、使用Proxy.newProxyInstance()产生一个代理对象
    ⑥、通过代理对象调用各种方法

具体的实现代码如下:

①、定义个接口,及对应接口的实现类

public interface Subject {
public void say();
public void sayHello(String str);
}
public class RealSubject implements Subject{
@Override
public void say() {
System.out.println("just say");
}
@Override
public void sayHello(String str) {
System.out.println("say Hello" + str);
}
}

②、定义一个实现接口InvocationHandler类,通过构造函数,注入被代理类,实现invoke(Object proxy,Method method,Object[] args) 方法

在主函数中获得被代理类的类加载器,使用Proxy.newProxyInstance()产生一个代理对象,通过代理对象调用各种方法

public class DynamicProxy implements InvocationHandler{

    private Object subject;

    public DynamicProxy(Object subject) {
this.subject = subject;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在代理真实对象前我们可以添加一些自己的操作
System.out.println("before do something");
System.out.println("method=" + method);
//当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
method.invoke(subject, args);
//在代理真实对象后我们可以添加一些自己的操作
System.out.println("after do something");
return null;
} public static void main(String[] args) {
//我们要代理的真实对象
Subject realSubject = new RealSubject();
//我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的
InvocationHandler hander = new DynamicProxy(realSubject);
/*
* 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数
* 第一个参数realSubject.getClass().getClassLoader() ,我们这里使用realSubject这个类的ClassLoader对象来加载我们的代理对象
* 第二个参数realSubject.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
* 第三个参数handler, 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
*/
Subject dynamicProxySubject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), hander); System.out.println(dynamicProxySubject.getClass().getName());
dynamicProxySubject.say();
dynamicProxySubject.sayHello("haha");
}
}

4、Spring中Bean的作用域
     在默认的情况下,Spring IOC容器只会对Bean创建一个实例
     Spring提供了5中作用域,通过@Scope注解来设置
    ①、singleton(单例):在Spring IOC容器中仅存在一个Bean实例,默认的Scope设置
    ②、prototype(多例):每次从容器中调用Bean时,都会返回一个新的实例
    ③、request(请求):用于web开发,将Bean放入request范围,request.setAttribute
(“XXX”),在用一个request获得同一个Bean
    ④、session(会话):用于web开发,将Bean放入Session范围,在同一Session获得同一个Bean
    ⑤、globalSession(全局会话):一般用于Porlet应用环境,分布式系统存在全局session概念,如果不是porlet环境等同于Session

Java开源框架知识整理的更多相关文章

  1. 初识轻量级Java开源框架 --- Spring

    初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spri ...

  2. 【通信】Netty JBOSS提供的一个java开源框架

    Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序dsf. 也就是说,Netty 是一个基 ...

  3. java部分基础知识整理----百度脑图版

    近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...

  4. Java Web架构知识整理——记一次阿里面试经历

    惭愧,从一次电面说起.我个人在某国企做一名软件设计师,国企大家都懂的,待遇一般而且没啥意思,做的方向基本都是操作系统.驱动和工具软件的开发,语言基本都是C/C++.最近也想跳槽,刚好有幸得到了一次阿里 ...

  5. MyBatis框架知识整理

    MyBatis框架 一.介绍: MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]! 和数据库打交道的技术有: 原生的JDBC技术---> Spring ...

  6. 《开源公开课分享》:Java开源框架案例分享

        缺乏高端技术人才?缺乏开发标准?    代码复用性低?技术风险难于把控?     招聘成本高?培训成本高?    假设想法不够雄伟,那么就会局限于细节:假设一開始就铺很大的摊子,将会失去控制: ...

  7. Flex Cairngorm框架知识整理

    简介: Cairngorm是一个开源的Flex项目,为FLex提供了一个类似MVC的体系结构框架,它是Flex RIA开发的最好框架之一.使用Cairngorm框架可以大大提高开发和维护的效率. Ca ...

  8. 关于学习java虚拟机的知识整理一:jvm内存区域

    之前由于考研,对于虚拟机的认识疏忽了太多,现在重新整理回顾一下. 如上图所示,jvm的内存区域(运行时数据区)共分为5处:方法区(Method Area).虚拟机栈(vm Stack).本地方法栈(N ...

  9. Java开源框架推荐(全)

    Build Tool Tools which handle the buildcycle of an application. Apache Maven - Declarative build and ...

随机推荐

  1. sql server中的全局变量,常用的没有多少...以后看看就行

    全局变量格式:  @@*** 这些变量有系统维护,不需要我们自己定义,一般都是用来查看信息. 在存储过程中 用得最多的 @@error,判断有没有错误信息. 一.@@version:查看版本信息 二. ...

  2. cookie,localStorage和sessionStorage的区别

    cookie已经很久没有用过了,一直觉得session Storage和local Storage更加好用一些.

  3. 【SparkStreaming学习之三】 SparkStreaming和kafka整合

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  4. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

  5. hdu2054 通过率低是有理由的

    这虽然是一道水题,但却巨坑,他题面上不说数据范围,也没有说数据类型,事实就是数据范围巨大,整型实型都有,所以必须用字符串去写,但是又涉及到小数,所以还要删除小数后面多余的0,比如1==1.0000,这 ...

  6. appium+python3+pycharm踩得坑2

    没相当刚把上一个错误解决,这个马上就解决了: selenium.common.exceptions.WebDriverException: Message: A new session could n ...

  7. 用AtomicStampedReference解决ABA问题

    在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然 ...

  8. zentao安装升级

    ------------------------一键安装8.4.1版本-------------------------------------1.查看操作系统版本[root@kvm-180 soft ...

  9. PyGame实现情人节表白利器

    前提:写不出那么那个的话哇,随便写写,随便看看,重在代码(文章末尾有免费完整源代码) 实验环境: pygame 1.9.4 pycharm python3.6 实现思路: pygame.display ...

  10. 2019十大安卓手游折扣平台app排行榜

    2019游戏版号陆续开放,玩家又有许多好游戏可以玩了. 小编就以当前最热门的十个游戏来点评手游折扣平台App排行榜吧! 排名第一的游戏: 少年西游记-新征程 老平台,集成SDK,良心平台,覆盖全网游戏 ...