AOP指在程序运行期间动态地将某段代码切入到指定位置进行运行的编程方式 -- 动态代理 简单使用 步骤: 1.导入AOP模块:Spring AOP -- spring-aspects 2.定义一个业务逻辑类,运行期间打印日志 3.定义一个日志切面类 通知方法: (1)前置通知(@Before):在目标方法运行之前运行 (2)后置通知(@After):在目标方法运行之后运行(无论方法正常结束还是异常结束) (3)返回通知(@AfterReturning):在目标方法正常返回之后运行 (4)异常通知(@AfterThrowing):在目标方法出现异常以后运行 (5)环绕通知(@Around):动态代理,手动推进目标方法就行 4.给切面类的目标方法标注何时何地运行(通知注解) 5.将切面类和业务逻辑类都加入到容器中 6.告诉Spring哪个类是切面类 -- 给切面类加上 @Aspect 注解 7.开启AspectJAutoProxy -- 在配置类加上 @EnableAspectJAutoProxy 注解 //配置类 @Configuration @EnableAspectJAutoProx.... Spring注解驱动开发之AOP Java
传统配置文件 (1)编写xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 包扫描,只要标注了@.... Spring注解驱动开发 Java
配置文件 主配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 引入外部properties resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 --> <properties resource="db.properties"></properties> <!-- settings包含很多重要的设置项 setting:用来设置每一个设置项 name:设置项名 value:设置项取值 --> <settings> <!-- 驼峰命名法 --> <setting name="mapUnderscoreToCamelCase" value="tru.... MyBatis MyBatis
配置 webmvc.xml <!-- 配置DispatcherServlet --> <servlet> <servlet-name>SpringDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置DispatcherServlet的一个初始化参数:配置SpringMVC配置文件的名称和路径 --> <!-- 实际上也可以不通过contextConfigLocation来配置SpringMVC的配置文件,而使用默认的 默认的配置文件为:/WEB-INF/<servlet-name>-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-val.... SpringMVC SpringMVC
核心包:beans、context、core、expression 日志包:com.springsource.org.apache.commons.logging-1.1.1 老版要求的包:com.springsource.org.apache.log4j-1.2.15 配置文件 applicationContext.xml(位置和名称任意,建议用这个并放在src下) <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置对象 --> <.... Spring Spring
ORM(Object/Relation Mapping): 对象/关系映射 ORM 主要解决对象-关系的映射 ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。 ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中. 配置文件 元数据(xxx.hbm.xml) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 配置表与实体对象的关系 --> <!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了. --> <hibernate-mapping pac.... Hibernate Java
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助Reflection API取得任何类的内部信息,并直接操作任意对象的内部属性和方法。 加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过镜子看到类的结构,所以,我们形象地称之为:反射。 获取Class实例的方式 加载到内存中的运行时类,会缓存一段时间,在此时间内,我们可以通过不同的方式获取此实例 方式1:调用运行时类的属性 Class c = Person.class; 方式2:通过运行时类的对象,调用getClass() Person p = new Person(10,""); Class c = p.getClass(); 方式3:调用Class的静态方法forName(String classpath),参数为完整的类名 Class c2 = Class.forName("com.wu.compare.Person"); 方式4:通过类加载器获取 Clas.... Java反射机制 Java
概述 一、网络编程中有两个主要问题 1.如何准确定位网络上一台或者多台主机,定位主机上的特定应用 2.找到主机后如何可靠高效地进行数据传输 二、网络编程中的两个要素 1.IP和端口号 2.提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层 网络通信协议 传输层中两个非常重要的协议 (1)传输控制协议TCP(Transmission Control Protocol) 使用TCP协议前,须先建立TCP连接,形成传输数据通道 传输前,采用“三次握手”方式,点对点通信,是可靠的 TCP协议进行通信的两个应用进程:客户端、服务端 在连接中可进行大数据量的传输 传输完毕,须释放已建立的连接,效率低 (2)用户数据报协议UDP(User Datagram Protocol) 将数据、源、目的封装成数据包,不需要建立连接 每个数据报的大小限制在64k内 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的 可以广播发送 发送数据结束时无需释放资源,开销小,速度快 IP地址(InetAddress) 唯一的标识Internet上的计算机(通信实体) 本地回环.... 网络编程 Java
File类 1.File类的一个对象,代表一个文件或文件目录(俗称:文件夹) 2.File类声明在java.io包下 3.设计到文件写入、读取操作需要使用IO流 常用构造器 (1)public File(String pathname):以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果是相对路径,则默认的当前路径在系统属性user.dir中存储 (2)public File(String parent,String child):以parent为父路径,child为子路径创建File对象 (3)public File(File parent,String chlid):根据一个父File对象和子文件路径创建File对象 常用方法 (1)public String getAbsolutePath():获取绝对路径 (2)public String getPath():获取路径 (3)public String getName():获取名称 (4)public String getParent():获取上传文件目录路径。若无,返回null (5)public lo.... IO流 Java
集合、数组都是对于多个数据进行存储操作的结构,简称Java容器(内存层面的存储) 数组存储的特点: (1)一旦初始化之后,其长度就确定了 (2)数组一旦定义好,其元素的类型也就确定了 (3)数组中提供的方法非常有限 Collection接口 -- 单列集合,存储单个数据 通用方法: (1)add(E e) (2)size() (3)addAll(Collection c) (4)isEmpty() (5)clear() (6)contains(Object obj):判断时会调用obj所在对象的equals()方法,自定义对象可重新该方法 (7)containsAll(Collection c) (8)remove(Object obj) (9)removeAll(Collection c) (10)retainAll(Collection c):求交集并返回给当前集合 (11)equals(Collection c) (12)hashCode() (13)toArray() (14)iterator() 迭代器 (1)hasNext():仍有元素可以迭代,则返回 (2)next():.... 集合 Java
1.Comparable ——自然排序 Comparable接口使用举例 像String、包装类实现了Comparable接口,重写了comparaTo(obj)方法,给出了比较两个对象大小的方式 像String、包装类重写了comparaTo(obj)方法后,进行了从小到大的排序 重写compareTo(obj)的规则: 如果当前对象大于形参对象obj,则返回正整数 如果当前对象小于形参对象obj,则返回负整数 如果当前对象等于形参对象obj,则返回零 对于自定义类,如果需要排序,可以让自定义类实现Comparable接口,重写CompareTo(obj)方法,在该方法中指定如何排序 public class Person implements Comparable{ private int age; private String name; public Person(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public .... Java比较两个对象的大小 Java
JDK1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是: 可变性:像日期和时间这样的类应该是不可变的 偏移性:Date中的年份是从1900开始的,而月份都从0开始 格式化:格式化只对Date有用,Calendar则不行 此外,它们也不是线程安全的;不能处理闰秒等 1.LocalDate(本地日期)、LocalTime(本地时间)、LocalDateTime(本地时间日期) (1)new() / * now(Zoneld zone):静态方法,根据当前时间创建对象/指定时区的对象 (2)of():静态方法,根据指定日期/时间创建对象 (3)getDayOfMonth() / getDayOfYear():获取月份天数(1-30)/获得年份天数(1-366) (4)getDayOfWeek():获得星期几(返回一个DayOfWeek枚举值) (5)getMonth():获得月份,返回一个Month枚举值 (6)getMonthValue() / getYea.... Java8之后的日期类 Java
1.特点 (1)String声明为final的,不可被继承 (2)String实现了Serializable接口,表示字符串是支持序列化的;实现了Comparable接口,表示字符串可以比较大小 (3)String内部定义了final char[] value用于存储字符串数据 (4)代表不可变字符序列 -- 不可变性 a.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值 b.当对现有的字符串进行连接操作是,也需要指定内存区域赋值,不能使用原有的value进行赋值 c.当调用String的replace()方法修改指定字符或者字符串时,也需要指定内存区域赋值,不能使用原有的value进行赋值 (5)通过字面量的方式给一个字符串赋值,此时的字符串值声明在字符串常量池中 (6)字符串常量池中是不会存储相同内容的字符串的 2.实例化方式 (1)字面量:此时的字符串值声明在字符串常量池中 (2)构造器:此时保存的是地址值.... Java常用类 -- String Java
安全问题 例子:假设有三个窗口在卖票,票数一共有100张 问题:卖票过程中出现了重票,错票 -->出现了线程安全问题 原因:当某个线程在操作共享数据时,还未操作完,此时其他线程加入进来,也对共享数据进行了操作 解决方法:当线程a在操作共享数据时,其他线程不能参与,当线程a操作完毕之后,其他线程才能操作共享数据,即使线程a阻塞了也不会改变这种情况 --> 使用同步机制解决 public class Window implements Runnable{ private int ticket = 100; @Override public void run() { while (true) { if (ticket > 0) { System.out.println(Thread.currentThread().getName()+"卖票,票号为:"+ticket); ticket--; }else { break; } } } } public class WindowTest { public static void main(String[] args) { Win.... 线程安全问题 Java
1.继承Thread类 (1)创建一个继承与Thread类的子类 (2)重写Thread类的run()方法 (3)创建Thrad类的子类对象 (4)通过此对象调用start()方法 -> 启动线程,调用线程的run()方法 public class ThreadTest { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); } } class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { if (i%2 == 0) { System.out.println(i); } } } } Thread的常用方法 (1)start():启动当前线程;调用当前线程的run()方法 (2)run():通常需要重写Thread中的此方法,将创建的线程要执行的操作声明在此方法中 (3)currentThread():静态方法.... Java多线程的创建方式 Java
1.主题 Appearance&Behavior -> Appearance 2.设置鼠标滚轮修改字体大小 Editor -> General 3.设置鼠标悬浮提示 Editor -> General 4.自动导包功能 Editor -> General -> Auto Import 5.显示行号和分隔符 Editor -> General -> Appearance 6.忽略大小写提示 Editor -> General -> Code Completion 7.设置字体 Editor -> Font 8.设置字符集 Editor -> FileEncodings 9.开启自动编译 Bulid,Execution,Deployment -> Compiler IntelliJ IDEA常用配置 IntelliJIDEA
接口 除了定义全局常量和抽象方法之外,还可以定义静态方法,默认方法 //静态方法 public static void demo(){ } //默认方法,public可以省略 public default void show() { } (1)接口中定义的静态方法,只能用接口来调用 (2)接口中定义的默认方法可通过接口的实现类调用 (3)如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中同名同参数的方法 --> 类优先原则 Lambda表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 //常规写法 Comparator<Integer> comparable = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2).... JDK8新特性 Java
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 1.单例模式 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 (1)饿汉式 public class Singleton { //1.私有化的构造器 private Singleton() { } //2.内部创建类的对象 //4.要求此对象也必须声明为静态的 private static Singleton instance = new Singleton(); //3.提供公共的静态方法,返回类的对象 public static Singleton getInstance() { return instance; } } (2)懒汉式(线程不安全) public class Singleton { //1.私有化的构造器 private Singleton() { } //2.声明当前类的对象,没有初始化 //4.要求此对象也必须声明为静态的 private static Singleton instan.... 设计模式 Java
冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 原理: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 public static int[] BubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j.... 常见排序算法 Java
二分查找 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 public static void binarySearch(int[] arr, int target) { int start = 0; int end = arr.length - 1; boolean flag = true; while (start <= end) { int middle = (start + end) / 2; if (arr[middle] == target) { flag = false; System.out.println(middle); break; .... 常见查找算法 Java