关于spring的简概
一、Spring入门操作
- IOC
- 创建对象
<bean id="user" class="com.itheima.domain.User"></bean> = User user = new com.itheima.domain.User();
- 创建对象的三种方式
1.无参构造函数创建独享
2.静态工厂创建对象
工厂类:com.itheima.factory.BeanFactory
静态方法:public static User createUser(){}
创建对象
<bean class="com.itheima.factory.BeanFactory" factory-method="createUser" />
3.普通工厂创建对象
工厂类:com.itheima.factory.BeanFactory
非静态方法:public User createUser(){}
创建工厂对象
<bean id="beanFactory" class="com.itheima.factory.BeanFactory" />
创建对象
<bean factory-bean="beanFactory" factory-method="createUser" />
- 工厂对象
能够创建对象的类,称之为工厂类。
静态工厂
创建对象的方法属于静态方法
普通工厂
创建对象的方法属于非静态方法
- 依赖注入
1.属性注入--->调用set方法 2.构造注入--->调用带参构造函数 3.注解注入 @Autowired、@Resource、@Value
- 依赖注入的三种方式代码
<!--
1.属性注入:调用set方法赋值(要求对应的属性必须有set方法)
-->
<bean id="accountService" class="com.bky.service.impl.AccountServiceImpl">
<!--
property:表示使用属性注入
调用setName给name赋值
name="":表示要调用的set方法,省略set,第一个字母小写
value="小红红":赋值,value只针对基本数据类型和字符串
-->
<property name="name" value="小明" />
<!--
age
-->
<property name="age" value="22" />
<!--
birthday
ref="date":如果要赋值的数据是一个Bean 对象,则使用ref引用
-->
<property name="birthday" ref="date" />
</bean>
<!--
Date date = new java.util.Date()
-->
<bean id="date" class="java.util.Date"></bean>
<!--
构造函数注入
-->
<bean id="accountService2" class="com.bky.service.impl.AccountServiceImpl">
<!--
构造函数注入
name="指定构造函数的入参名字"
-->
<constructor-arg name="name" value="小王" />
<constructor-arg name="age" value="25" />
<constructor-arg name="birthday" ref="date" />
</bean>
<!--
使用构造函数注入
指定下标
-->
<bean id="accountService3" class="com.bky.service.impl.AccountServiceImpl">
<constructor-arg index="2" ref="date" />
<constructor-arg index="0" value="小牛" />
<constructor-arg index="1" value="26" />
</bean>
<!--
使用构造函数注入
指定数据类型
-->
<bean id="accountService4" class="com.bky.service.impl.AccountServiceImpl">
<constructor-arg type="java.lang.String" value="小明"/>
<constructor-arg type="java.lang.String" value="深圳"/>
<constructor-arg type="java.lang.Integer" value="27" />
<constructor-arg type="java.util.Date" ref="date"/>
</bean> 使用注解注入
@Autowired :优先选择类型注入,如果类型相同,选择名字注入(by type)@Resource :优先选择名字注入,如果名字相同,选择类型注入 (by name)@Value :用于配置文件
二、Spring的相关注解
- 创建对象 :4个注解作用一样,用于创建对象
- @Component() 如果不写名字,id值默认=类名,第一个字母小写
@Component: 一般用于普通对象 @Controller:一般用于表现层的注解。 @Service: 一般用于业务层的注解。 @Repository:一般用于持久层的注解。
- @Bean:创建对象
作用在方法上,可以将方法的返回值交给SpringIOC容器管理
- 测试
@RunWith(SpringJUnit4ClassRunner.class) //创建测试容器,JUnit的扩展 @ContextConfiguration() //指定配置文件或者配置类
三、AOP
- AOP概念-->面向切面-->
简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
- AOP的底层原理:动态代理技术
/***
* 基于动态代理改造
* 动态代理:
* 特点:字节码随用随创建,随用随加载
* 分类:基于接口的动态代理,基于子类的动态代理
* 作用:不修改源码的基础上对方法增强
* 基于接口的动态代理:
* 提供者是:JDK官方
* 使用要求:被代理类最少实现一个接口。
* 涉及的类:Proxy
* 创建代理对象的方法:newProxyInstance
* 方法的参数:
* ClassLoader:类加载器。用于加载代理对象的字节码。和被代理对象使用相同的类加载器。固定写法。
* Class[]:字节码数组。用于给代理对象提供方法。和被代理对象具有相同的方法。和被代理对象实现相同的接口,就会具有相同的方法。固定写法
* InvocationHanlder:要增强的方法。此处是一个接口,我们需要提供它的实现类。通常写的是匿名内部类。
* 增强的代码随用随写。
*/
ProxyProducer proxyProducer = (ProxyProducer) Proxy.newProxyInstance(
Producer.class.getClassLoader(),
Producer.class.getInterfaces(),
new InvocationHandler() {
/**
* 执行被代理对象的任何方法都都会经过该方法,该方法有拦截的作用
* 参数的含义
* Object proxy:代理对象的引用。一般不用
* Method method:当前执行的方法
* Object[] args:当前方法所需的参数
* 返回值的含义
* 和被代理对象的方法有相同的返回值
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法参数
Float money = (Float) args[0];
//获取方法名字
String methodName = method.getName();
//定义一个对象,存储返回结果
Object result = null;
//销售提成25%
if(methodName.equals("saleProduct")){
result= method.invoke(producer,money*0.75f);
}else if(methodName.equals("saleProduct")){
//销售提成10%
result= method.invoke(producer,money*0.9f);
}
return result;
}
}
);
- AOP通知/增强
前置增强:目标方法执行前,执行增强操作(调用其他方法)
后置增强:目标方法执行完成后(return后),执行增强
异常增强:目标方法执行发生异常后执行增强
最终增强:目标方法执行,无论是否发生异常,都会执行
环绕增强:模拟了动态的整个执行过程,可以做到前置增强、
后置增强、异常增强、最终增强,还可以修改返回数据
- 声明式事务:基于AOP
1.配置数据源 2.配置事务管理器 3.配置事务管理规则[事务传播特性] 4.建立通知,指定执行事务控制的切点
关于spring的简概的更多相关文章
- Spring ApplicationContext 简解
ApplicationContext是对BeanFactory的扩展,实现BeanFactory的所有功能,并添加了事件传播,国际化,资源文件处理等. configure locations:(C ...
- quartz与spring boot-最简模式
多年前使用过quartz,今天又需要再用,而且是在spring boot框架下.很神奇,spring也是十年前用过的. 这里仅记录下完成的最快速和简单的操作,高级的使用以后有空弄明白了再写: 1.增加 ...
- Spring注解简析
JAVA 元注解 @Documented @Inherited @Retention @Target @Repeatable @Native 在java.lang.annotation包下,除了@Na ...
- MySQL简概
MySQL简介与概要 mysql 是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,现在已经被sun公司收购,支持FreeBSD.Linux.MAC.windows等多种操作系统.相比 ...
- Java并发编程(十)-- Java中的锁
在学习或者使用Java的过程中进程会遇到各种各样的锁的概念:公平锁.非公平锁.自旋锁.可重入锁.偏向锁.轻量级锁.重量级锁.读写锁.互斥锁.死锁.活锁等,本文将简概的介绍一下各种锁. 公平锁和非公平锁 ...
- 彗星撞地球 | 近25万倍压缩的精品3D动画
文章目录 写在前面 Prophecy<彗星撞地球> 下载地址 简概 注意 3D射击小游戏 下载地址 简概 写在前面 WareZ是个无形的组织,号称"不以赢利为目的纯技术团体&qu ...
- SpringMVC:HandlerInterceptor log 日志
springMVC:HandlerInterceptor拦截器添加系统日志(权限校验)代码收藏 - LinkcOne - CSDN博客https://blog.csdn.net/qq_22815337 ...
- ELK-全文检索技术-lucene
ELK : ELK是ElasticSearch,LogStash以及Kibana三个产品的首字母缩写 一.倒排索引 学习elk,必须先掌握倒排索引思想, 参考文档: https://www.cn ...
- Spring Boot(5)一个极简且完整的后台框架
https://blog.csdn.net/daleiwang/article/details/75007588 Spring Boot(5)一个极简且完整的后台框架 2017年07月12日 11:3 ...
随机推荐
- 关于connect: network is unreachable 问题的解决【转】
本文转载自:https://blog.csdn.net/liukun321/article/details/6662950 由于发现原创文章,在未署名作者及出处的情况下被转载.在以后所有的原创文章开头 ...
- C# 操作SQLServer SMO中遇到的几个问题
业务需求:需要读取数据库中的所有库,得到库之后可以再做后续操作.(win 7 vs2010 sqlserver2008r2) 在读取数据库名的时候,就需要用到Microsoft.SqlServer. ...
- html5--1.18 div元素与布局
1.18 div元素与布局 1.元素的分类2.div元素与布局 1.元素的分类 块元素:主要特征是会产生换行效果,自动与其他元素分离成两行:通常可以作为容器在内部添加其他元素. 已经学过的块元素有: ...
- [原创]Java集成PageOffice在线打开编辑word文件 - Spring Boot
开发环境:JDK1.8.Eclipse.Sping Boot + Thymeleaf框架. 一. 构建Sping Boot + Thymeleaf框架的项目(不再详述): 1. 新建一个maven p ...
- 【Codeforces】Round #460 E - Congruence Equation 中国剩余定理+数论
题意 求满足$na^n\equiv b \pmod p$的$n$的个数 因为$n \mod p $循环节为$p$,$a^n\mod p$循环节为$p-1$,所以$na^n \mod p$循环 ...
- rust borrow and move
extern crate core; #[deriving(Show)] struct Foo { f : Box<int> } fn main(){ let mut a = Foo {f ...
- CodeForces - 660F:Bear and Bowling 4(DP+斜率优化)
Limak is an old brown bear. He often goes bowling with his friends. Today he feels really good and t ...
- UOJ_21_【UR #1】缩进优化_数学
UOJ_21_[UR #1]缩进优化_数学 题面:http://uoj.ac/problem/21 最小化$\sum\limits{i=1}^{n}a[i]/x+a[i]\;mod\;x$ =$\su ...
- valgrind 代码检查,内存泄漏
使用平台 linux 下载 http://valgrind.org/ 文档 http://valgrind.org/docs/manual/manual.html 博客 https://www.osc ...
- 基于Qt Gui的Led控制显示程序
基于arm + linux的嵌入式软件开发,基本上的内容主要是:u-boot的移植,kernel的裁剪和相关驱动程序的设计,root-fs的制作,应用程序的设计,其中,应用程序主要包含两方面的内容:G ...