写一下午的好多居然丢失。。。自动保存也只是保存丢失后的

那就不多写了,简单写:

Spring:(自己画的)

官网的:

写一个Spring的例子:

Eclipse

http://repo.spring.io/release/org/springframework/spring/4.3.9.RELEASE/

http://commons.apache.org/proper/commons-logging/download_logging.cgi

https://github.com/junit-team/junit4/wiki/Download-and-Install

IoC:

反向控制,依赖注入,实现主动方成为被动方,IoC容器启动时就实例化所有Beans,不用再等待使用JavaBean时去请求依赖的类,而是将曾经依赖的类注入到JavaBean中,实现实例化,Spring常用3种注入方式:1。接口(依赖类设置为接口,方便自动注入,也方便子类实现-(DIP原则/LSP原则))

2。gettersetter(JavaBean的定义,封装性)

3。构造器(全参)

IoC将耦合分离到配置文件中了。

AoP(两个流行的框架:Spring AOP和AspectJ)

应用横切关注点(cross-cutting concern):日志记录,性能统计,安全控制,权限管理,事务处理,异常处理,缓存,资源池管理。

横切简单说就是将多种需求分解不同方面,将业务夹在中间,OOP(面对对象编程)是从静态角度考虑程序结构,但AOP则是动态角度考虑程序的运行过程。

AoP实际上是一个目标类的代理类实现的,AOP在一个特定切点添加了增强处理,并回调了目标对象。

所以要先学习动态代理技术:

代理Proxy学习,为什么要用代理类?:它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

接口:

public interface IHello

{

void say(String name);

}

实现类:

public class HelloImpl implements IHello

{

@Override

public void say(String name){

System.out.println("Hello "+ name);

}

}

静态代理类 (可以对接口或抽象类):

public class HelloProxy implements Hello

{

private IHello hello;

public HelloProxy(){

hello=new HelloImpl(); //构造器注入,

}

@Override

void say(String name){

before();

hello.say(name);

after();

}

private before(){

System.out.println("before");

}

private after(){

System.out.println("after");

}

}

动态代理类(对接口,在Spring中,提供了多种代理,利用jdk中api,需要提供接口。而cglib是不需要的,可以直接创建类的Proxy,Jdk通过java.lang.reflect.Proxy来支持动态代理,一般情况下,使用方法newProxyInstanceof来创建Proxy类,而对于InvocationHandler,需要实现它的invoke方法,在调用代理对象中的每一个方法时,在代码内部,都是直接调用了InvocationHandler的invoke方法,而invoke方法根据代理类传递给自己的method参数来区分是什么方法。 该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值,该类还实现了invoke方法,该方法中的method.invoke(sub,args); 其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数):

JDK:

public class DynamicProxy implements InvocationHandler

{

private Object target;

public DynamicProxy(Object target){ //构造器注入

this.target=target;

}

@Override

public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{

before();

Object result=method.invoke(target,args);

after()

return result;

}

private before(){

System.out.println("before");

}

private after(){

System.out.println("after");

}

}

使用:

public static void main(String [] args){

Hello hello=new HelloImpl();

DynamicProxy dynamicProxy=new DynamicProxy(hello);

Hello helloProxy=(Hello)Proxy.newProxyInstance(

hello.getClass().getClassLoader(),hello.getClass().getInterfaces(),dynamicProxy);

helloProxy.say("you");

}

Proxy.newProxyInstance方法的参数:1.ClassLoader,2.实现类的所有接口,3.动态代理对象,最后还需要强制类型转换

重构(refactor)一下:

public class DynamicProxy implements InvocationHandler

{

private Object target;

public DynamicProxy(Object target){ //构造器注入

this.target=target;

}

@SuppressWarnings("unchecked") //Object强制转为泛型,编译会警告

public<T> T getProxy(){

return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);  //利用泛型的反射来获取。

}

@Override

/**

* 同过代理对象调用方法首先进入这个方法.

* @param proxy --指代我们所代理的那个真实对象

* @param method --指代的是我们所要调用真实对象的某个方法的Method对象,方法,被调用方法.

* @param args -- 方法的参数

*/

public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{

before();

Object result=method.invoke(target,args);

after()

return result;

}

private before(){

System.out.println("before");

}

private after(){

System.out.println("after");

}

}

使用:

public static void main(String [] args){

Hello hello=new HelloImpl();

DynamicProxy dynamicProxy=new DynamicProxy(hello);

//Hello helloProxy=(Hello)Proxy.newProxyInstance(hello.getClass().getClassLoader(),hello.getClass().getInterfaces(),dynamicProxy);

Hello helloProxy=dynamicProxy.getProxy();

helloProxy.say("you");

}

CGlib:

CGlib可以代理没有接口的类,提供MethodInterceptor实现类,并填充intercept方法,CGlib提供的是方法级别的代理,也可理解为对方法的拦截。

先看下:Singleton

Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。” //一个系统只能有一个计时工具或ID(序号)生成器。
Java单例模式例子,不能使用new关键字实例化对象:
1
2
3
4
5
6
7
8
9
10
11
12
public class SingletonClass{
    private static volatile SingletonClass instance=null;
    public static SingletonClass getInstance(){
            synchronized(SingletonClass.class){
                if(instance==null){
                    instance=new SingletonClass();
                }
            }
        return instance;
    }
    private SingletonClass(){}
}

Java学习08 (第一遍) - SpringMVC的更多相关文章

  1. Java学习07 (第一遍) - Spring MVC

    跳过Struts2,直接学习Spring MVC MVC,自己画的 属性(Property/Attribute),事件(Event),方法(method/procedure),函数(Function) ...

  2. Java学习05 (第一遍) - JSP与Servlet

    JSP 客户端发出Request请求,JSP容器将JSP转译为Servlet的源码,再编译加载到内存执行,结果Response到客户端. Request->JSP->Servlet(jav ...

  3. Java学习06 (第一遍) - JSP与Servlet

    EL(Expression Language) <% User user=(User)session.getAttribute("user"); Dept dept=user ...

  4. Java学习04 (第一遍)

    封装.抽象.继承和多态.封装:在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属 ...

  5. Java学习03 (第一遍)

    Java是面向对象的语言,函数是面向过程语言的叫法,比如C语言,在Java中一般称之为方法. 构造方法的作用是实例化对象,每个类中都有,即使不写程序也会分配一个默认无参数的构造方法. Java中都是对 ...

  6. Java学习01 (第一遍)

    java se - 桌面 java ee - 网页 Jdk :Jre 区别Jdk-开发环境必要Jre-运行环境需要Jdk包含Jre,安装完Jdk就可以了 Javac Demo1.java-Javac ...

  7. Java学习02 (第一遍)

    巩固基础: byte 1个字节 -128到127 = 2^(字节数*8-1),转变2进制,01111111(负127)到11111111(正127) ,存在正负零(00000000),正零保留,负零补 ...

  8. Java学习记录第一章

    学习Java第一章的记录,这一章主要记录的是Java的最基础部分的了解知识,了解Java的特性和开发环境还有Java语言的优缺点. 计算机语言的发展大概过程:机器语言--->汇编语言---> ...

  9. JAVA学习的第一周

    这是发表的第一篇博客,关于Java编程的学习体会如下 1.了解Java的产生与发展时机:1995左右出现Java语言,然后Java的最主要的特点是"跨平台".对于跨平台我不太理解, ...

随机推荐

  1. Power BI中DAX的动态计算方差

    我花了一点时间试图解决一个棘手的DAX表达式,那就是如何动态计算方差,下面我们认识一下这两个函数: PARALLELPERIOD  和 SAMEPERIODLASTYEAR  它能实现我们想要的结果, ...

  2. Python多进程并发操作中进程池Pool的应用

    Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...

  3. Python的深copy和浅copy

    浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 浅copy: a = [1, 2, ...

  4. 我发起了一个 操作系统 GUI 和 Tcp / IP 包 的 开源项目 DeviceOS

    操作系统 如果 不需要 处理 复杂多样 的 硬件 兼容性, 其实 并不算 大项目, 可以算 毕业设计 . 但是, GUI 和 Tcp / IP  这两个 部分 的 实现逻辑 很多 很复杂,  这  2 ...

  5. [综] meanshift算法

    Meanshift,聚类算法 http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.html 记得刚读研究生的时候,学习的第一个算法就是 ...

  6. 手把手教你实现 Google 拓展插件(转自实验楼)

    一.课程简介 1.1 实验介绍 本课程的实验环境由实验楼提供,Google 浏览器拓展的运行环境为 Google 浏览器.在本实验中,你将了解如何制作一个属于你自己的 Google 拓展插件. 课程实 ...

  7. NTP搭建

    NTP(Network Time Protocol,网络时间协议),用于同步它所有客户端时钟的服务.NTP服务器将本地系统的时钟与一个公共的NTP服务器同步然后作为时间主机提供服务,使本地网络的所有客 ...

  8. php中正则表达式详解

    概述 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配.替换.截取匹配的字符串.常用的语言基本上都有正则表达式,如JavaScript.java等.其实,只有了解一种语言的正 ...

  9. 常用JVM命令

    查看当前所有jvm进程 ./jps -l -m ./jps -l -m -v 查看jvm进程内存堆使用情况 ./jstat -gc $pid 生成java虚拟机当前时刻的线程快照 jstack -l ...

  10. 安装zookeeper遇到的问题

    最近在安装zookeeper的时候遇到了一个问题:调用./zkServer.sh start之后,使用命令telnet localhost 2181,显示访问被拒绝.然后使用netstat查看监听21 ...