Spring知识整理
Spring简介
- Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,用来管理和维护bean,其中的特点是IOC(控制反转) DI(依赖注入) AOP(面向切面) 容易和其他框架整合
spring的执行流程
创建一个spring对象的容器
利用构造函数创建spring容器内的对象(单例,lazy-init不能为true,如果为true 将会在第一次访问的时候创建)
执行一个对象的init方法
利用context.getBean()得到对象的时候,如果这个对象是多例的或者lazy-init为true的时候,会创建这个对象
调用业务逻辑方法
spring容器关闭的时候会执行对象的destroy方法(init和destroy方法都需要在配置文件中配置)
Spring通过配置文件生成类
在src文件夹下创建名字为applicationContext.xml文件
配置文件基本参数:
<bean id="helloWorld" class="com.test1.HelloWrold"></bean>
id : 唯一标识,Spring通过id来寻找对应的类
class : 类的具体位置
简单的生成一个类(配置文件如下)
<bean id="helloWorld" class="com.test1.HelloWrold"></bean>
静态工厂方法 (静态工厂类和实例工厂类中的区别就是生成对象的方法否是static方法)
<bean id="helloWorld2" class="method.factory.HelloWorldFactory" factory-method="getInstance"></bean>
- factory-method : 生成类的静态方法名
实例工厂方法
<bean id="helloWorldFactory" class="com.itheima12.spring.createobject.method.factory.HelloWorldFactory2"></bean> <bean id="helloWorld3" factory-bean="helloWorldFactory" factory-method="getInstance"></bean>
factory-bean : 工厂bean
factory-method : 工厂方法
别名
顾名思义: 一个对象的另一个名字,可以用他来创建对象
<alias name="" alias=""/>
name : 对应bean的id, alias : 别名
创建对象的时间
默认情况下为启动Spring容器时会创建对象(一个bean会创建一个类)
可以通过修改
<bean lazy-init="true">
来改变创建时间, 如果为true的话,会在 getBean()时创建对象
单例和多例
默认情况下,一个bean对应一个类, 这个类是单例的
- 因为这个类时单例的,所以在这个类中声明属性的话,这个属性是全局的(危险)
改变
<bean scope="prototype">
的Scope参数可以设置产生的类为多例的- 类的创建时间为getBean()时创建对象
init和destroy
配置文件:
<bean id="hello" class="com.test2.HelloWrold" init-method="init" destroy-method="destroy" lazy-init="true"></bean>
init和destroy为HelloWrold类中的方法
init方法会在构造方法执行完以后执行, destroy方法会在Spring容器关闭之前执行
DI(依赖注入)
即给类中的属性赋值
IOC(容器)和DI(依赖注入)的意义 : 是代码端完全的面向接口变成,不会在出现需要new出实现接口的某个类
- 不是用的话需要在java类中new出一个接口的实现类,然后在给message方法传递,如果使用Spring,就少了new实现类这个情况,变成了完全的面向接口
xml-set方式
在person中设置了常用的属性,然后设置其set方法, 在xml文件中注入所需要的值
xml-构造方法
在类中设置构造方法,通过构造方法来注入值
<constructor-arg index="1" value="ssss"></constructor-arg>
index : 代表第几个参数 value : 参数值
xml-继承
1.通过在子类中设置
parent="id"
属性来设置继承的父类,这样在父类注入的值可以从子类获取到2.直接在子类使用父类的set方法注入值
自定义注解
注解配置参数
注解配置参数只能用于引用类型
配置文件添加
<context:annotation-config></context:annotation-config>
在所需要的配置参数上添加
@Resource(name="student")
/@Autowired
/@Qualifier("student")
选项@Resource(name="student")
如果参数没有,会先和属性所在的属性名称与中的id做匹配,如果没有匹配上,则会按照属性的类型进行匹配
有
name=""
参数,会按照name参数跟bean的id进行匹配
@Autowired 按照类型进行匹配
@Qualifier("student") 按照id进行匹配
过程:当spring容器解析到
<context:annotation-config></context:annotation-config>
spring容器会在spring容器管理的bean的范围内查找这些类的属性上面是否加了@Resource注解
注解配置类
配置文件添加:
<context:component-scan base-package="com.itheima12.spring.scan"></context:component-scan>
,会扫描base-package下面所有的类,是否有@Component
,在扫描完以后会继续按照@Resource
注解进行赋值Dao层配置 :
@Repository("customerDao")
- 传递属性
@Resource(name="sessionFactory")
- 传递属性
service层配置 :
@Service("linkManService")
action层 :
@Controller("baseDictAction") @Scope("prototype")
上面三层的注解都是
@Component("")
的子类, 属于更加细节的划分, 括号内的是bean的id
AOP
- 将常用的,不变的非核心业务的东西生成AOP,减少代码重复,解耦.
动态代理
jdkProxy
通过jdk的内置的方法来设置代理类
代理类实现接口
InvocationHandler
传递进去目标类和代理类,在执行被代理方法之前或者之后执行代理类中的方法缺点:
初始功能单一,如果需要添加其他的方法,则会非常繁琐
- 定义一个接口,然后将需要代理的功能都实现这个接口,最后传递进去一个List, 再控制方法的执行顺序
如果方法太多的话,判断哪些方法需要被代理非常麻烦
解决功能单一方法的初始思想
cglib动态代理的方法
AOP概念
连接点 : 在方法的执行前后和抛出异常可以作为连接点,即将增强和目标方法连接的地方.
切入点 : 在某个方法被调用的时候,这个方法上的连接点变为切入点
增强 : 目标方法除了核心业务以外的所需要的方法, 比如在save()方法中,save()为核心方法,开启事务为非核心方法,可以抽离出来, 在AOP中开启事务就叫做增强
切面 : 除了目标方法所在的类以外其他的类
代理 : 将目标方法和增强结合在一起
织入 : 生成代理类的过程
代理
如果类实现接口,使用jkdproxy代理,如果没有实现接口,则会使用cglib来实现代理
<aop:config proxy-target-class="true">
强制使用cglib方式来生成代理类
xml配置
切入点表达式各个部分,后面加?的表示可以不写
增强的类型
前置增强 : 在目标方法执行之前
后置增强 : 在目标方法执行之后 抛出异常不执行, 可以设置
returning="val"
来获取返回值 , 配置文件和类中的参数名需要相同最终增强 : 不管是否有异常都会执行
异常增强 : 在抛出异常时执行 设置
throwing="ex"
来获取异常 配置文件和类中的参数名需要相同环绕增强 : 在目标方法前后都可以执行, 还可以控制目标方法是否执行
joinPoint.proceed();//调用目标方法
如果不写,则目标方法不会执行,即只会执行前置增强和环绕增强的前置方法
如果同时设置了环绕增强,前置增强,后置增强 , 则执行顺序如下图
无异常
有异常
注解配置
AOP权限管理
多个切面执行顺序和配置
执行顺序
- 前置增强按照配置顺序依次执行,后置增强按照配置顺序的倒序依次执行 即在目标方法执行前的增强按照配置顺序,执行后的增强按照配置顺序的倒序
执行图
Spring整合hibernate
eclipse中xml提示包名的插件 --- Rinzo
eclipse可以设置自动提示 window-preferences-java-editor-content Assist-auto activation
导入两者所需要的jar包
配置数据源和配置hibernate有两种方式可以选择, 分别为解析各自的配置文件和将配置信息写入到spring文件中
Spring的事务
Spring使用的是内置的事务,所以一般不需要自己定义事务
抽象类: 是将相同的东西实现了,不同的东西设置为抽象方法,让需要使用这些不同东西的类来实现各自具体的抽象方法
- 比如一个仪式的过程是领导讲话,个人讲话,奏国歌,那么我们可以将重复的东西,即领导讲话和奏国歌在抽象类中实现,个人讲话设置为抽象方法, 然后个人的类继承这个抽象类,实现各自的抽象方法即可.
Spring的事务就是使用了抽象类的方式,将各种事务中所相同的方法抽取出来,然后将不同的方法设置为抽象方法(即事务的核心业务),让需要使用事务的调用者自己实现核心业务.
Spring中事务的简单执行步骤即抽象类中实现了共有的操作,具体的事务操作交给具体的事务管理器
web
spring容器放在了ServletContext中,所以他的生命周期就是项目的生命周期
spring设计将spring容器放到了当前线程中
如果某个对象不在spring容器内(DI不能使用),可以使用
WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
获取到spring容器(根据key从ServletConetxt中获取)spring启动时dao层 1.service层的所有的对象就都创建完成了 2.service层的代理对象也创建完成了 3.action层的对象没有创建(多例)
struts2的class需要和spring中的id相同
spring回调
即Spring容器给你规定了规则,你在这个规则下编写代码,最后还需要将代码放回到容器中,等待Spring调用,而你自己不能调用
用在和hibernate结合,当你需要自己编写访问数据库的方法的时候就会使用
hibernateTemplate.execute(new HibernateCallback<T>() { @Override
public T doInHibernate(Session arg0) throws HibernateException, SQLException {
// TODO Auto-generated method stub
return null;
}
})
Spring知识整理的更多相关文章
- Spring Ioc知识整理
Ioc知识整理(一): IoC (Inversion of Control) 控制反转. 1.bean的别名 我们每个bean元素都有一个id属性,用于唯一标识实例化的一个类,其实name属性也可用来 ...
- js事件(Event)知识整理
事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下 鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- wifi基础知识整理
转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...
- 数据库知识整理<一>
关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...
- 【转载】UML类图知识整理
原文:UML类图知识整理 UML类图 UML,进阶必备专业技能,看不懂UML就会看不懂那些优秀的资料. 这里简单整理 类之间的关系 泛化关系(generalization) 泛化(generalize ...
- Linux进程管理知识整理
Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...
- js事件(Event)知识整理[转]
事件注册 平常我们绑定事件的时候用dom.onxxxx=function(){}的形式 这种方式是给元素的onxxxx属性赋值,只能绑定有一个处理句柄. 但很多时候我们需要绑定多个处理句柄到一个事件上 ...
随机推荐
- 我的第一个python web开发框架(4)——数据库结构设计与创建
小白做好前端html设计后,马上开始进入数据库结构设计步骤. 在开始之前,小白回忆了一下老大在公司里培训时讲过的数据库设计解说: 对于初学者来说,很多拿到原型时不知道怎么设计数据表结构,这是很正常的事 ...
- Fiddler屏蔽某些url的抓取方法
在用Fiddler调试网页的时候,可能某些频繁的ajax轮询请求会干扰我们,可以通过以下方法屏蔽某些url的抓取. 在需要屏蔽的url行上右键---->“Filter Now”-----> ...
- Android shared_preference操作
实例化SharedPreferences对象 //test :想要打开的SharedPreferences文件名 //Activity.MODE_PRIVATE:操作模式 MODE_PRIVATE | ...
- 【转】wireshark基本用法及过虑规则
Wireshark 基本语法,基本使用方法,及包过虑规则: 1.过滤IP,如来源IP或者目标IP等于某个IP 例子: ip.src eq 192.168.1.107 or ip.dst eq 19 ...
- 面向对象(OOP)--OOP基础与this指向详解
前 言 学过程序语言的都知道,我们的程序语言进化是从“面向机器”.到“面向过程”.再到“面向对象”一步步的发展而来.类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐 ...
- Laplace(拉普拉斯)先验与L1正则化
Laplace(拉普拉斯)先验与L1正则化 在之前的一篇博客中L1正则化及其推导推导证明了L1正则化是如何使参数稀疏化人,并且提到过L1正则化如果从贝叶斯的观点看来是Laplace先验,事实上如果从贝 ...
- 使用docker 解决一个小问题,你也可能用的到
以前一直觉得docker是运维用的工具,或者devops 用的工具,一般人应该用不上,直到最近发现docker 还有另外一个妙用,不管是什么语言. 这几天开会网络特别不好,nodejs npm 仓库 ...
- win10 uwp 分治法
其实我想说Path,因为最近在做一个简单的分治. 算法涉及到了一个平面几何的知识.就是三角形p1p2p3的面积等于以下行列式的二分之一: 而且当点P3 在射线P1P2的左侧的时候,表达式为正,右侧表达 ...
- Gradle sync failed 异常
今天开发过程中出现如下异常 Gradle sync failed: Connection timed out: connect. If you are behind an HTTP proxy, pl ...
- LVS+Keepalived高可用负载均衡集群架构实验-01
一.为什么要使用负载均衡技术? 1.系统高可用性 2. 系统可扩展性 3. 负载均衡能力 LVS+keepalived能很好的实现以上的要求,LVS提供负载均衡,keepalived提供健康检查, ...