自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 收藏
  • 关注

原创 Spring中 声明式事务管理

1事务概述1)在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术。2)事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行。3)事务的四个关键属性(ACID)①原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。②一致性(co

2020-09-27 11:49:50 532

原创 Spring中的JdbcTemplate

1. 概述为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法,通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。可以将Spring的JdbcTemplate看作是一个小型的轻量级持久化层框架,和我们之前使用过的DBUtils风格非常接近。2. 环境准备1 导入JAR包1)IOC容器所需要的JAR包commons-

2020-09-25 10:55:00 279

原创 以XML方式配置AOP切面

概述除了使用AspectJ注解声明切面,Spring也支持在bean配置文件中声明切面。这种声明是通过aop名称空间中的XML元素完成的。正常情况下,基于注解的声明要优先于基于XML的声明。通过AspectJ注解,切面可以与AspectJ兼容,而基于XML的配置则是Spring专有的。由于AspectJ得到越来越多的 AOP框架支持,所以以注解风格编写的切面将会有更多重用的机会。配置细节在bean配置文件中,所有的Spring AOP配置都必须定义在aop:config元素内部。对于每个切面而言,都

2020-09-24 21:35:43 332

原创 AOP中的通知

1.概述1)在具体的连接点上要执行的操作。2)一个切面可以包括一个或者多个通知。3)通知所使用的注解的值往往是切入点表达式。2.前置通知1)前置通知:在方法执行之前执行的通知2)使用@Before注解/** * @Before 将方法指定为前置通知 * 必须设置value,其值为切入点表达式 */ //@Before(value = "execution(public int com.atguigu.spring.day03_Spring.aop.

2020-09-23 21:22:51 503

原创 切入点表达式

1.作用通过表达式的方式定位一个或多个具体的连接点。2.语法细节1)切入点表达式的语法格式execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表]))2)举例说明表达式execution(* com.atguigu.spring.ArithmeticCalculator.*(…))含义ArithmeticCalculator接口中声明的所有方法。第一个※代表任意修饰符及任意返回值。第二个“*”代表任意方法。“…”匹配任意数

2020-09-23 20:34:19 2533 1

原创 动态代理

AOP前奏1.情景:数学计算器这里我们模拟一个计算器,添加日志功能。①执行加减乘除运算②日志:在程序执行期间追踪正在发生的活动2)常规实现存在的问题:①代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀。每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点。②代码分散: 以日志需求为例,只是为了满足这个单一需求,就不得不在多个模块(方法)里多次重复相同的日志代码。如果日志需求发生变化,必须修改所有模块。动态代理动态代理原理:代理设计模式的原理:使用一个

2020-09-23 19:51:43 127

原创 AOP概述与基本写法样例

AOP概述1)AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充。面向对象 纵向继承机制面向切面 横向抽取机制2)AOP编程操作的主要对象是切面(aspect),而切面用于模块化横切关注点(公共功能)。3)在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化

2020-09-23 19:47:07 1229

原创 Spring中关于注解的组件装配

1)需求Controller组件中往往需要用到Service组件的实例,Service组件中往往需要用到 Repository组件的实例。Spring可以通过注解的方式帮我们实现属性的装配。2)实现依据在指定要扫描的包时,context:component-scan 元素会自动注册一个bean的后置处 理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记 了@Autowired、@Resource或@Inject注解的属性。3..

2020-09-08 17:15:23 113

原创 Spring中通过注解配置bean

相对于XML方式而言,通过注解的方式配置bean更加简洁和优雅,而且和MVC组件化开发的理念十分契合,是开发中常用的使用方式。使用注解标识组件1)普通组件:@Component标识一个受Spring IOC容器管理的组件2)持久化层组件:@Repository标识一个受Spring IOC容器管理的持久化层组件@Controller(value = "aaa")public class UserController { @Autowired private UserSer

2020-09-08 17:01:00 208

原创 自动装配与兼容性

自动装配的概念1)手动装配:以value或ref的方式明确指定属性值都是手动装配。2)自动装配:根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入bean中。写几个类方便后续的测试:public class Emp { private Integer eid; private String ename; private Car car; private Dept dept; public Integer getEid() {

2020-09-04 16:40:18 121

原创 Spring中引用外部资源文件

1.xml中配置属性当我们导入druid和mysql的资源jar包后可以直接配置数据库连接对象<?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.

2020-09-04 11:32:48 269

原创 Spring中bean的生命周期

1)Spring IOC容器可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。2)Spring IOC容器对bean的生命周期进行管理的过程:① 通过构造器或工厂方法创建bean实例② 为bean的属性设置值和对其他bean的引用③ 调用bean的初始化方法④ bean可以使用了⑤ 当容器关闭时,调用bean的销毁方法3)在配置bean时,通过init-method和destroy-method 属性为bean指定初始化和销毁方法这里写..

2020-09-03 17:30:38 166

原创 Spring中bean的作用域

作用域scope配置项作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围。例如,当你希望每次IOC容器返回的Bean是同一个实例时,可以设置scope为singleton;当你希望每次IOC容器返回的Bean实例是一个新的实例时,可以设置scope为prototype。scope配置项有5个属性,用于描述不同的作用域。① singleton使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每

2020-09-03 10:54:19 218

原创 FactoryBean测试

Spring中有两种类型的bean,一种是普通bean,另一种是工厂bean,即FactoryBean。工厂bean跟普通bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂bean的getObject方法所返回的对象。工厂bean必须实现org.springframework.beans.factory.FactoryBean接口。这里我们写一个Car类用于测试:public class Car { private String brand; private Doubl

2020-08-20 21:55:22 222

原创 spring中xml里的集合属性

在Spring中可以通过一组内置的XML标签来配置集合属性,例如:< list>< map>和< set>。数组和List配置java.util.List类型的属性,需要指定< list>标签,在标签里包含一些元素。这些标签 可以通过< value>指定简单的常量值,通过< ref>指定对其他Bean的引用。通过< bean>指定内置bean定义。通过< null/>指定空元素。甚至可以内嵌其他集合。数组

2020-08-20 21:01:10 737

原创 Spring中在xml文件为对象赋值的几种方式

这里先写一个学生类进行实验:public class Student { private Integer id; private String name; private Integer age; private Long cellphone; public Student() { } public Student(Integer id, String name, Integer age, Long cellphone) { th

2020-08-19 10:54:33 1154

原创 NoUniqueBeanDefinitionException No qualifying bean of type...

Spring报错:Exception in thread “main” org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.atguigu.spring.mod.Person] is defined: expected single matching bean but found 2: person,persontwoat org.springframewor

2020-08-18 10:51:26 461

原创 Optional类

Optional实际上是个容器,它是一个装一个对象的容器。这个对象可能是个空,可能是非空。数组和集合是装多个对象的容器。1、创建Optional对象的方法:(1)Optional.of(xx); 只能装非空对象(2)Optional.ofNullable(x); 装可以是null的对象(3)Optional empty() 直接返回一个空箱子对象2、如何取出Optional容器中的对象(1)get() 必须配合of(xx)使用,因为这里面的

2020-08-17 14:36:46 291

原创 Stream操作:创建,处理,终结

Stream接口:实现类IntStreamDoubleStreamLongStream一、创建Stream1、方式一:通过集合创建集合对象.stream()2、方式二:通过数组工具类ArraysArrays.stream(数组对象)3、方式三:Stream接口的静态方法of方法,产生一个有限流Stream.of(…)4、方式四:Stream接口的静态方法(1)generate方法,产生无限流(2)Stream iterate(T seed, UnaryOperator f)

2020-08-17 14:03:35 182

原创 Stream概述

StreamAPI:StreamAPI是用来处理数据,处理集合等容器中的数据,处理操作有:查询、筛选、删除、过滤、统计、映射等。希望能够用类似于SQL语法的形式对Java内存中的数据进行处理。SQL是对数据库中的数据进行处理。Stream本身不负责存储数据,存储数据是用集合,数组等数据结构。Stream只负责对数据进行处理、加工。Stream的操作分为三步:1、创建Stream:告知Stream数据的来源是哪里?2、加工处理:这个过程可以很多步 0~n3、终结操作:收集结

2020-08-17 10:57:19 544

原创 方法引用和构造器引用

lambda表达式是用来简化匿名内部类的一种函数式编程的语法。只有SAM接口才能使用lambda表达式方法引用和构造器引用是用来简化lambda表达式。只有当lambda表达式满足一些特殊情况时,才能使用方法引用和构造器引用。条件:(1)当Lambda体的实现是通过调用一个现有的方法来完成功能时(2)要求函数式接口的抽象方法返回值类型与该方法的返回值类型要对应。(3)要求函数式接口的抽象方法的形参列表与该方法的形参列表对应或者要求函数式接口的抽象方法的形参列表的第一个形

2020-08-17 10:10:12 257

原创 Lambda表达式:自定义函数式接口

自定义函数式接口:1、声明一个接口,只能包含一个抽象方法2、给这个接口加@FunctionalInterfacepublic class TestDefineFunctionalInterface { public static void main(String[] args) { //IntCalc tools形参,函数式接口,可以Lambda表达式赋值 /* * (1)抽象方法:int cal(int a , int b); * (2)如何实现抽象方法 * 例如

2020-08-17 09:28:37 650

原创 Lambda表达式的使用演示:BiFunction

JDK1.8时Map接口增加了一个方法:default void replaceAll(BiFunction<? super K,? super V,? extends V> function)public class Test05Lambda3 { @Test public void test01(){ HashMap<String,Employee> map = new HashMap<>(); map.put("张三", new Employee("

2020-08-15 12:48:54 503

原创 Lambda表达式的使用演示:Supplier和Consumer

Supplier和Consumerpublic class Test04Lambda2 { @Test public void test01(){ /* * Java8中,有一个新的类:Stream类型,它代表一个数据加工流 * java.util.stream.Stream<T>接口 * static <T> Stream<T> generate(Supplier<T> s) * * 这个静态方法的形参:Su

2020-08-15 12:22:55 489

原创 Lambda表达式语法

函数式接口:SAM接口Single Abstract Method,即该接口中只有一个抽象方法需要实现,当然该接口可以包含其他非抽象方法(默认方法和静态方法,或者是从Object继承的方法)。回忆之前学过的接口:(1)Runnable(2)Comparable(3)Comparator(4)Iterable(5)Iterator(6)Collection,Set,List,Map,Queue,Deque…(7)Serializable(8)Externalizable(9)FileF

2020-08-15 12:06:31 340

原创 反射应用:动态读取子类的泛型父类的泛型实参

在运行时读取某个类的泛型实参步骤:(1)获取Class对象(2)获取泛型父类Type type = clazz.getGenericSuperclass();ParameterizedType type = (ParameterizedType) clazz.getGenericSuperclass();(3)获取类型实参Type:代表Java的所有类型(1)Class:代表的是普通的类型,没有泛型信息的(2)ParameterizedType:参数化类型 例如:Father&

2020-08-12 12:43:02 207

原创 反射应用:动态读取注解

在运行时读取某个注解信息一个完整的注解,有三个要素:(1)声明(2)使用(3)读取像@Override,@SuppressWarings,@Deprecated等这些是JRE中声明的,也是由编译器读取的像@Test,@Before…等这些注解是JUnit声明和读取的像@author,@param…等这些注解是JRE中声明的,由javadoc.exe读取的…我们程序员只负责使用。如果我们自定义的注解,那么声明和读取我们就要自己编写了获取类上面的注解步骤:(1)获取Class对象

2020-08-12 10:59:08 156

原创 反射应用:动态的调用方法

在运行时可以调用任意对象的任意方法Method:invoke(对象,实参列表)步骤:(1)获取Class对象(2)得到方法Method对象public class Test09Method { @Test public void test01()throws Exception{ //(1)获取Class对象:四种方式之一 Class clazz = Class.forName("com.atguigu.ext.demo.AtGuiguDemo"); //(2)得到

2020-08-12 10:24:43 228

原创 反射应用:动态的设置或获取属性值

在运行时可以为任意对象的任意属性赋值,或者获取任意对象的任意属性的值Field类:(1)set(Object obj, Object value)(2)Object get(Object obj)(3)setAccessible(true)建议大家编写类时保留无参构造。(1)创建对象方便(2)继承时也方便子类构造器默认调用父类的无参构造(3)反射创建也方便步骤:(1)获取某个类型的Class对象(2)创建实例对象(3)为某个属性赋值①先获取某个属性Field对象②设置

2020-08-12 09:01:49 321

原创 反射应用:动态创建对象

在运行时能够创建任意引用数据类型的对象方式一:使用Class对象直接new对象步骤:(1)获取某个类型的Class对象(2)通过Class对象来创建这个Class所代表的类型的对象当AtGuiguDemo没有无参构造时java.lang.InstantiationException: com.atguigu.ext.demo.AtGuiguDemoCaused by: java.lang.NoSuchMethodException: com.atguigu.ext.demo.AtGuigu

2020-08-12 08:43:47 246

原创 反射应用:获取类的详细信息

1、在运行时能够获取任意类型的详细信息后期的时候,在框架中,例如:spring框架,会帮我们管理很多的类,而这些类不是spring写的,而是我们写的,然后在运行期间spring取加载获取的。步骤:(1)获取这个类的Class对象(2)获取类的信息①包名②类名③类的修饰符Modifier④直接父类⑤父接口们⑥属性们⑦构造器们⑧方法们一切皆对象:(1)所有类型在内存中都是Class对象(2)所有的属性都是Field对象private int age;属性类型:Fie

2020-08-11 12:13:45 258

原创 Class对象

1、java.lang.Class类型:所有的Java类型(包括基本数据类型、引用数据类型、void)被加载到内存后,或者是编译器自动编译生成的class字节码,最终都会用一个Class对象来表示。即,所有的Java类型,在内存中都表示为一个Class对象。2、如何获取Class对象?4种 重点(1)类型名.class优点:最简洁缺点:要求编译期这个类型就要存在(2)对象.getClass()这个方法在java.lang.Object类型中声明的,返回对象的运行时类型

2020-08-11 12:11:24 218

原创 使用类加载器加载类路径

类加载器的作用:1、本质工作:加载类2、顺便可以用它来加载“类路径下”的资源文件例如:src下(编译后对应bin)有一个资源文件,配置文件:jdbc.properties如何获取某个类的类加载器对象?1、获取某个类的Class对象2、通过Class对象调用getClassLoader()方法获取类加载器对象ClassLoader类加载器的类型:getResourceAsStream(“资源文件的路径名”)SourceFolder:源代码文件夹,一般会单独用一个config这种Sou

2020-08-11 12:09:43 869

原创 类的加载与初始化

类的加载:1、加载:把字节码读取到内存2、连接(1)验证(2)准备:例如:给类变量(静态变量)在方法区分配内存,非final的赋默认值,但是如果是final的,直接赋常量值。(3)解析虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程这里1,2完成时,在方法区中已经有一个能够代表当前类的Class对象。3、类的初始化 ()类的加载大多数情况下是1、2、3一起完成的,但是有的时候3、初始化不一起完成。回忆:()是由编译器自动收集(1)静态变量的显式赋值(2)静态代码块的

2020-08-10 11:04:29 276

原创 UDP协议编程

UDP:非面向连接的,不可靠的,基于数据报的传输协议DatagramSocketDatagramPacket发送端接收端实际中,一般是服务器客户端推送消息。当客户端连接服务器,服务器就获取的客户端IP地址和端口号,服务器就给客户端推送广告消息发送端:DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)参数一:要发送的数据的字节数组参数二:从字节数组的哪个下标开始参数三:发送几

2020-08-04 14:15:29 223

原创 TCP协议编程:群聊

群聊客户端:public class TestServer { private static ArrayList<Socket> online = new ArrayList<Socket>(); public static void main(String[] args) throws IOException { //1、开启服务器 ServerSocket server = new ServerSocket(9999); while(true){.

2020-08-04 13:58:17 255

原创 TCP协议编程:客户端文件上传

从客户端发送文件到服务器端(1)接收客户端的连接(2)接收文件名.后缀名思考:存哪里 ①在当前项目中找一个位置存储,例如:upload文件夹如何解决文件名重名的问题 文件名需要处理,加入时间戳或其他的唯一编码的UUID等值.后缀名需要保留,因为它代表文件的类型(3)接收文件内容(4)反馈结果思考:这里既要接收文件名.后缀名,又要接收文件内容。这里既有 文本信息“文件名.后缀名”,又有其他类型的数据“文件内容”,只能选择字节流。如何区别,文件名.后缀名 与

2020-08-04 12:13:03 189

原创 TCP协议编程:多次通信单词反转

服务器端:(1)接收客户端的连接(2)接收客户端的词语(3)把词语“反转”返回给客户端(2)(3)多次,直到客户端发送"bye"为止public class TestServer { public static void main(String[] args) throws IOException { //1、开启服务器 ServerSocket server = new ServerSocket(8989); //2、接收一个客户端的连接 Socket socket

2020-08-04 09:32:09 197

原创 TCP协议编程:一来一回

TCP:客户端,主动连接服务器Socket(InetAddress address, int port)Socket(String host, int port)步骤:1、连接服务器Socket socket = new Socket(“192.168.30.142”,9999);2、发送或接受数据3、断开连接客户端给服务器发送一个“你好”,服务器回复“欢迎你登录”客户端:public class TestClient { public static void mai

2020-08-04 09:08:07 150

原创 NIO工具类

io:阻塞式IOnio: JDK1.4–>JDK1.7非阻塞式的IOPath(接口):类似于File,用路径名表示一个目录或文件Paths:工具类,用来创建Path接口的对象Files工具类,操作文件或目录的工具类:(1)Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING);(2)delete(Path path) 功能类似于File类的delete() 不同的地方是会报异常,当文件不存在时del

2020-08-03 18:32:16 309

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除