Java学习08 (第一遍) - SpringMVC
写一下午的好多居然丢失。。。自动保存也只是保存丢失后的
那就不多写了,简单写:
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
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的更多相关文章
- Java学习07 (第一遍) - Spring MVC
跳过Struts2,直接学习Spring MVC MVC,自己画的 属性(Property/Attribute),事件(Event),方法(method/procedure),函数(Function) ...
- Java学习05 (第一遍) - JSP与Servlet
JSP 客户端发出Request请求,JSP容器将JSP转译为Servlet的源码,再编译加载到内存执行,结果Response到客户端. Request->JSP->Servlet(jav ...
- Java学习06 (第一遍) - JSP与Servlet
EL(Expression Language) <% User user=(User)session.getAttribute("user"); Dept dept=user ...
- Java学习04 (第一遍)
封装.抽象.继承和多态.封装:在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属 ...
- Java学习03 (第一遍)
Java是面向对象的语言,函数是面向过程语言的叫法,比如C语言,在Java中一般称之为方法. 构造方法的作用是实例化对象,每个类中都有,即使不写程序也会分配一个默认无参数的构造方法. Java中都是对 ...
- Java学习01 (第一遍)
java se - 桌面 java ee - 网页 Jdk :Jre 区别Jdk-开发环境必要Jre-运行环境需要Jdk包含Jre,安装完Jdk就可以了 Javac Demo1.java-Javac ...
- Java学习02 (第一遍)
巩固基础: byte 1个字节 -128到127 = 2^(字节数*8-1),转变2进制,01111111(负127)到11111111(正127) ,存在正负零(00000000),正零保留,负零补 ...
- Java学习记录第一章
学习Java第一章的记录,这一章主要记录的是Java的最基础部分的了解知识,了解Java的特性和开发环境还有Java语言的优缺点. 计算机语言的发展大概过程:机器语言--->汇编语言---> ...
- JAVA学习的第一周
这是发表的第一篇博客,关于Java编程的学习体会如下 1.了解Java的产生与发展时机:1995左右出现Java语言,然后Java的最主要的特点是"跨平台".对于跨平台我不太理解, ...
随机推荐
- 算法复杂度中的O(logN)底数是多少
前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多少.算法中log级别的时间复杂度都是由于使用了分治思想,这 ...
- jQuery-2.DOM---节点插入
DOM内部插入append()与appendTo() 动态创建的元素是不够的,它只是临时存放在内存中,最终我们需要放到页面文档并呈现出来.那么问题来了,怎么放到文档上? 这里就涉及到一个位置关系,常见 ...
- day03字符串
字符串 1.方法详细内容 方法 强制转换 ##### 1.大小写转换 Value.upper() / value.lower() new_value=value.upper() print(new_v ...
- vue2中使用mint-ui,性别选择
安装需要的组件 import { DatetimePicker,Toast,Popup,Picker } from 'mint-ui'; templete部分 <div class=" ...
- 《C语言程序设计》编程总结汇总
<C语言程序设计>编程总结汇总 院系: 专业年级: 班级名称: 学号: 姓名: 指导教师: 完成时间: 自我评价: 计算机科学与技术专业教研室 2018 年秋季学期 第四周编程总结 题目4 ...
- centos安装jdk步骤
1.官网或wget下载 jdk-8u172-linux-x64.tar.gz,解压到/usr/local/java目录: cd /home/tar wget xxxxxxx cp /home/tar/ ...
- [转] Linux运维常见故障排查和处理的技巧汇总
作为linux运维,多多少少会碰见这样那样的问题或故障,从中总结经验,查找问题,汇总并分析故障的原因,这是一个Linux运维工程师良好的习惯.每一次技术的突破,都经历着苦闷,伴随着快乐,可我们还是执着 ...
- PythonStudy——名称空间 Name space
# 名称空间:就是名字与地址的对应关系,可以被Python解释器遍历查找,采用堆栈存储方式 # 三种名称空间# Built-in:内置名称空间:系统级,一个:随解释器执行而产生,解释器停止而销毁# G ...
- windows openssh server 安装试用
使用Windows的可能会知道win10 的已经包好了openssh 服务,但是对于其他机器win 7 windows 2008 ,就需要其他的方法了 还好powershell 团队开发了支持wind ...
- JS笔记汇总
注释必须要多写! 1.方便后台看 2.方便自己查错和优化 事先先沟通约定好,比如交互的数据格式需求是怎么样的啊,功能模块的逻辑是怎么样的等等.提前先和产品还有后台沟通好. JSON内不能包含注 ...