Spring学习笔记:1(初步认识概念)
Spring的三大主要特征
spring主要特征有三个:控制反转(IOC),依赖注入(DI)和面向切面(AOP)。
IoC:Inverse of Control(控制反转)
1.对控制反转的理解
- 传统方式:若要使用某个对象,需要自己去负责对象的创建,即new方式
- 控制反转:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架
打个比喻:
- 传统方式:相当于你自己去市场new 了一只鸡,不过是生鸡,要自己拔毛,去内脏,再上香料,酱油,烤制,经过各种工序之后,才可以食用。
- 控制反转:相当于去肯德基(Spring)点了一只鸡,交到你手上的时候,已经五味俱全,你就只管吃就行了。
2.控制反转的主要形式有两种:依赖查找和依赖注入
- 依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。
- 依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)。
一.创建Spring项目
在IDEA中创建Spring项目,编译器会自动导入相关的jar包,如下图:
二.在 Packge【com】下新建一个【Source】类:
package com;public class Source {private String fruit;private String sugar;private String size;private String ice;public String getFruit() {return fruit;}public void setFruit(String fruit) {this.fruit = fruit;}public String getSugar() {return sugar;}public void setSugar(String sugar) {this.sugar = sugar;}public String getSize() {return size;}public void setSize(String size) {this.size = size;}public String getIce() {return ice;}public void setIce(String ice) {this.ice = ice;}
}
三.在 【src】 目录下新建一个 【applicationContext.xml】 文件,通过 xml 文件配置的方式装配我们的 bean
<?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"><bean name="source" class="com.Source"><property name="fruit" value="橙子"/><property name="sugar" value="正常糖"/><property name="size" value="大杯"/><property name="ice" value="多冰"/></bean>
</beans>
四.在 Packge【test】下新建一个【TestSpring】类:
package test;import com.Source;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestSpring {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Source source = (Source) context.getBean("source");System.out.println(source.getFruit());System.out.println(source.getSugar());System.out.println(source.getSize());System.out.println(source.getIce());}
}
代码结构图如下:
运行结果:
总结:
传统的方式:
通过new 关键字主动创建一个对象
IOC方式:
对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 IOC是控制反转 (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。
DI:Dependency Injection(依赖注入)
指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象
上面也解释了这个概念,其实现方式有三种:属性注入(setter注入),构造器注入和自动装配。
一.属性注入
1.重新创建一个Spring项目,在src目录下创建com和test包
2.在com包下创建Students类和Classes类
package com;public class Students {private String name;private String sex;private int age;private Classes classes;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Classes getClasses() {return classes;}public void setClasses(Classes classes) {this.classes = classes;}
}
package com;public class Classes {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
3.在src目录下创建applicationContext.xml文件,通过 xml 文件配置的方式装配我们的 bean
<?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"><!--属性注入--><bean name="students" class="com.Students"><property name="name" value="小关"/><property name="sex" value="男"/><property name="age" value="19"/><property name="classes" ref="classes"/></bean><bean name="classes" class="com.Classes"><property name="id" value="6"/><property name="name" value="六班"/></bean>
</beans>
4.在test包下创建测试类
package test;import com.Students;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestSpring {@org.junit.Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Students students = (Students) context.getBean("students");System.out.println(students.getName());System.out.println(students.getSex());System.out.println(students.getAge());System.out.println(students.getClasses().getId());System.out.println(students.getClasses().getName());}
}
运行结果如下图:
以上,就是属性注入。关键的是在类里面声明属性,写set方法,然后在xml里面配置bean和property的值。
二.构造器注入
构造器注入,就是在构造器里面注入依赖对象。其实跟属性注入差不多,先定义一个有参构造器,然后配置xml文件就行了。
1.在之前的基础上将Students类和Classes类进行修改
package com;public class Students {private String name;private String sex;private int age;public Students(String name,String sex,int age){this.name = name;this.sex = sex;this.age = age;}@Overridepublic String toString() {return "{" +"name='" + name + '\'' +", sex='" + sex + '\'' +", age=" + age +'}';}
}
package com;public class Classes {private Students students;public Classes(Students students){this.students = students;}@Overridepublic String toString() {return "Classes{" +"students=" + students +'}';}
}
2.修改applicationContext.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean name="classes" class="com.Classes"><constructor-arg ref="student"/></bean><bean name="student" class="com.Students"><constructor-arg value="小关"/><constructor-arg value="男"/><constructor-arg value="19"/></bean>
</beans>
3.修改测试类
package test;import com.Classes;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestSpring {@org.junit.Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Classes classes = context.getBean(Classes.class);System.out.println(classes.toString());}
}
运行结果如下:
三.自动装配
…博主也不是很懂,以后再补上。
AOP:Aspect Oriented Program(面向切面)
AOP 即 Aspect Oriented Program 面向切面编程
如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用。
在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
- 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
- 所谓的周边功能,比如性能统计,日志,事务管理等等
周边功能在 Spring 的面向切面编程AOP思想里,即被定义为切面。
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP。
AOP 的目的:
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
AOP 当中的概念:
转载于:https://blog.csdn.net/qukaiwei/article/details/50367761
- 通知(Advice)
就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。 - 连接点(JoinPoint)
这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。 - 切入点(Pointcut)
上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。 - 切面(Aspect)
切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。 - 引入(introduction)
允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗 - 目标(target)
引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。 - 代理(proxy)
怎么实现整套aop机制的,都是通过代理。 - 织入(weaving)
把切面应用到目标对象来创建新的代理对象的过程。
关键就是:切点定义了哪些连接点会得到通知
相关文章:

shell example01
条件判断 if [[ -e ${1} ]]; thenecho "$(tput setaf 2) found ${1} $(tput sgr0)"cat ${1} elseecho "$(tput setaf 1) not found ${1} $(tput sgr0)"exit 1 fi//简化[[ -e ${1} && -e ${2} ]] && cat ${1} > ${2}//判断取反txt4.txti…

gradle教程 [原创](eclipse/ADT下 非插件 非Android Studio/AS)纯手打 第一篇:安装配置gradle...
一个bug 一个脚印的叫你们用gradle。 1介于网络上的很多资料都是老的 不适用与现在的新版本gradle 尤其是有些gradle方法改名了老的用不了 2介于网上都是粘贴复制并且零碎我很蛋疼啊,走了很多歪路才弄出来,所以我弄一个完全完整的版本 3我不但会写gradle…

java的static关键字
java的static关键字 静态变量和静态方法 static关键字最基本的用法是: 1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来 2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用&…

Spring学习笔记:2(IOC装配Bean之xml方式)
xml配置方式装配Bean 本文借鉴于:https://www.cnblogs.com/qdhxhz/p/6511887.html Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多)静态工厂实例化实例工厂实例化 代码如下: Bean1类(构造方法…

学习RPG Maker MZ开发创建并发布PC和移动端游戏
Complete RPG Maker MZ: Create and Publish for PC and Mobile 完整的RPG制造商MZ:为个人电脑和移动设备创建和发布 MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确…

CSS选择器总结
总结几种自己比较容易混淆的: 1. 后代选择器,写法是 E1 E2,如 ul li,选择的是所有后代,包括子后代、孙后代…; 2. 子选择器,写法 E1 > E2,只选择子后代,不包括孙后代元素…

OSChina 周六乱弹 —— 小明和网关超经典的故事~
2019独角兽企业重金招聘Python工程师标准>>> 周六,又到了瞎扯淡的时间了。周末,约会,男男女女,还有那啥那啥,你们懂得~ 男人和女人明显不同,这样才导致了异性相吸吗? 1. …

概念艺术绘画学习教程 Schoolism – Foolproof Concept Painting with Airi Pan
Schoolism——万无一失的概念绘画潘 大小解压后:3.19G 含课程素材文件 1920X1080 .mp4 语言:英语中英文字幕(根据原英文字幕机译更准确) 信息: 万无一失的概念绘画潘 本课程由概念设计师兼插画师潘开发,与大家分享她…

Mybatis复习笔记:1
关于模糊查找 模糊查找其实有两种基本操作(之前学的时候看的不太仔细,漏了…) 第一种 <select id"findByType" parameterType"String" resultType"com.domain.User">select * from product where product_type like #{produ…

文件只能安装一次
1 def get_mac_address(): 2 macuuid.UUID(int uuid.getnode()).hex[-12:] 3 return ":".join([mac[e:e2] for e in range(0,11,2)]) 获取计算机名字 1 import socket 2 socket.gethostname() linux下获取主机外网ip 1 import socket2 import fcntl3 impo…

Linux pipe函数
1. 函数说明 pipe(建立管道): 1) 头文件 #include<unistd.h> 2) 定义函数: int pipe(int filedes[2]); 3) 函数说明: pipe()会建立管道,并将文件描写叙述词由參数filedes数组返回。 fi…

操作系统知识点:全面
操作系统知识点:全面 https://www.jianshu.com/p/c3a3cc0254b1 https://www.jianshu.com/u/881ef7b85f62 posted on 2019-09-03 21:44 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11455906.html

在UE4中创建CG动画 How to create a movie in Unreal Engine 4 using Metahuman
MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小解压后:1.55 GB |时长:1h 16m 你会学到什么 如何在虚幻引擎4中创建CG动画 虚幻引擎4 Metahuman 使用metahuman在虚幻引…

MyBatis复习笔记2:配置文件详解
配置文件详解 属性(properties) MyBatis可以使用 properties 来引入外部 properties 配置文件的内容 resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 properties 有三种方式使用: 1、通过 reso…

Android ActionBarDrawerToggle、DrawerLayout、ActionBar 结合
ActionBarDrawerToggle是一个开关。用于打开/关闭DrawerLayout抽屉 ActionBarDrawerToggle 提供了一个方便的方式来配合DrawerLayout和ActionBar。以实现推荐的抽屉功能。 即点击ActionBar的homebutton,就可以弹出DrawerLayout抽屉。 在Activity中的两个回调函数中使…

【转】statfs获得硬盘使用情况 模拟linux命令 df
原文网址:http://blog.csdn.net/mociml/article/details/5335474 说明:本文以主要为转载内容,同时加入了我在使用过程中遇到问题对其的修正!!!!!!!࿰…

SQL常见的面试题
SQL常见的面试题 https://www.jianshu.com/p/558f2113bb62 posted on 2019-09-03 21:55 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11455959.html

Mybatis入门:4(多表查询操作)
多表查询操作 Mybatis的多表操作 表之间的关系有几种:一对多、一对一、多对一、多对多 举例: 用户和订单就是一对多——一个用户可以下多个订单 订单和用户就是多对一——多个订单属于同一个用户 人和身份证号就是一对一 一个人只能有一个身份证号 一个身份证号只…

Python for虚幻引擎编辑器工具脚本学习教程
Python for Unreal Engine Editor Tools Scripting MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:23节课(4h 8m) |大小解压后:2.7 GB 含课程文件…

C++ Windows进程管理
功能: 1.各个进程启动、挂起、恢复、停止等 2.监听进程的运行状态,进程退出(正常、非正常)时,通知用户 3.异步队列 4.线程安全 进程管理器类: #ifndef __ProcessManager_ProcessManager_H__ #define __Proc…

shell中和||的使用方法
&&运算符:command1 && command2&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果…

SQL中内连接、外连接、交叉连接
SQL中内连接、外连接、交叉连接 SQL连接可以分为内连接、外连接、交叉连接。 数据库数据: book表 stu表 1.内连接 1.1.等值连接:在连接条件中使用等于号()运算符比较被连接列的列值,其查询结果中列…

Blender从头开始装配和动画制作低多边形风格的FPS手臂
Rigging and Animating Low Poly FPS Arms in Blender MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:21节课(4h 56m) |大小解压后:3.16 GB 含课程…

Mybatis复习笔记3:映射文件详解
映射文件详解 参数处理(#和$的区别) #{}:可以获取map中的值或者实体对象属性的值;${}:可以获取map中的值或者实体对象属性的值; select * from person where id${id} and name#{name} # 控制台输出&…
TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总
CCS与仿真器连接问题 实际使用过程中。仿真器和CCS连接可能出现这样或那样的问题,或许你的连接非常成功,没碰到过什么问题。但我的问题的确不少,可能与电脑配置有关吧,也可能与人品有关吧。 以下的自己的一些错误和解决方法总…

Mysql备份与还原及优化方法
Mysql备份一般采用mysqldump命令,命令形式一般如下:$ mysqldump –hhostname –uuser –ppassword–Pport db_name > db_name.sql默认情况下,不备份存储过程和函数,若要备份存储过程和函数,要加上-R选项,…

HashTable和HashMap的区别详解
HashTable和HashMap的区别详解 一、HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的&…

Unity电子游戏优化终极指南 The Ultimate Guide to Video Game Optimisation
大小解压后:5.2G 含课程文件 时长9h 1280X720 MP4 语言:英语中英文字幕(根据原英文字幕机译更准确) 电子游戏优化终极指南 信息: 学会从你的Unity游戏开发项目中挤出每一帧表现 你会学到什么 –如何为游戏制定绩效预算并坚持下…

Mybatis复习笔记:4
关于Mybatis中的一些注意点 一.关于实体类属性 当我们封装的时候我们一般要求实体类中和数据库的列名保持一致。 如果不一致将会导致查询结果为空。 解决属性名和数据库中表的字段名不一致的方法 1.在sql语句中给数据库中的字段起别名 如: <select id"…

USB_HID C#测试例程
USB_HID C#测试例程 报告模式(按键、LED、ADC) 一、简介 Usb无处不在,而hid则免驱,使用更加方便,本方案主要是基于STM32F10X系列单片机的usb hid开发,计算机软件采用VS2013 C#开发。 二、接线图示意 三、开…