首先说下,本人小菜鸡,后面你懂的,有说的不对的,还望各位大大指点。
Spring
本菜鸡经过一路杀怪,涨经验,捡装备,混到了今天这般饿不死的地步。闲暇之余,回顾下以前杀过的boss,也算温故知新吧。
Spring涉及的东西,在我看来还是很庞大。回顾过去,对它的感觉也只是在简历上写下它的大名。这到底是个什么玩意,今天一起来看下吧。
Spring 框架是一个开源的 Java 平台,它为容易而快速的开发出耐用的 Java 应用程序提供了全面的基础设施。
这个描述我觉得还是比较贴切的,因为我们只要用到spring的框架中,哪哪都有它,好像打不死的小强啊!我们的bean的管理、日志记录、事务提交等等等等,都有它。
百度了下关于Spring的知识,发现好多文章都是上来就说IOC、AOP,咱们不是介绍Spring吗,跟IOC和AOP有什么关系。想到了我刚刚学习的时候,上来就整一堆概念,整个人都瓦特掉了。
先来说说它能干什么吧
What can spring do?
spring有7大模块,并非只有我们听到的IOC和AOP,只是这二位比较常用,属于核心功能,其实就是用spring就是为了这二位。
IOC
- IOC 英文全称Inversion of Control,翻译过来就是反转of控制。这个针对的是bean,就是我们的类,接口等等,或者说就是我们创建的对象。字面意思理解下,把对象交给别人控制(绿油油的感觉),以前是我们控制bean,什么时候创建它,什么时候使用它,用完然后丢掉。现在不是这样了。现在是Spring帮你处理,你专心做业务逻辑就好了。
- Spring怎么知道我们要创建什么对象,在JAVA里,反射应该是可以获取到对象类型的,之前看过某篇文章的介绍,Spring就是通过反射获取到这个类,然后创建的对象,至于具体是怎么实现的,肯定比我这一句话要复杂的多得多。有兴趣的亲亲,建议您阅读源码。
- 常见的Spring配置文件的写法
<bean id="logAspect" class="com.log.LogAspect" />
id
表示你这个对象的名字是什么,class
指明这个类的位置
<bean id="connectionFactory
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="127.0.0.1" />
<property name="port" value="1234" />
<property name="password" value="123" />
<property name="timeout" value="600" />
<property name="poolConfig" ref="jedisPoolConfig" />
<property name="usePool" value="true" />
</bean>
- 这个配置里多了些东西,仔细看,还是有
id
和class
两个属性的,在bean
标签里多了propetry
标签,这个标签里有name
和value
两个属性,这个name就相当于我们创建的类里的属性,比如我一个User
类,然后它有id
,有username
。标签里name
的值就是我们的属性名,value
就是我们给这个属性赋的值。
AOP
- AOP 英文全称Aspect Oriented Programming ,面向切面编程。什么是切面,怎么面向切面编程。说到这个切面,我第一瞬间想到的就是面包的切面。先提到几个概念,方法前通知,方法后通知,环绕通知。
-
就是这玩意儿,这里是三块面包,这个切面就是面包的切面,面向切面编程,就是面向面包片操作呗。
第一个我们涂上芥末,第二个我们一边涂番茄酱,另一边涂沙拉酱。第三个我们呢,就不涂了吧。
- 如果我们从左往右吃,想象下,是不是吃到第一片结束的时候就会吃到芥末,吃到第二片开始的时候,会吃到番茄酱,之后是面包,最后是沙拉酱。说的都饿了。。。现在换下
- 第一片是我们的controller层,这个芥末就是我们的切面编程了,具体可以是记录下调用日志,看你的需要了,而且这个是只有执行完controller才会到这里来。这相当于是after之后执行的。
- 第二片是我们service层,前有番茄后有沙拉,而且是先到番茄再到面包,最后才是沙拉,这个番茄通知是service执行前就会执行的,沙拉通知是service执行后才会通知的。如果你想第二片的番茄换成沙拉,那么AOP的环绕通知是你需要的。就是说环绕通知是前后都会执行的。
- 具体到我们的代码里是要怎么搞呢
@Aspect
public class LogAspect{
//方法调用前执行-记录开始执行时间
@Before("execution(* com.web.controller.*.*(..))")
public void doBeforeInServiceLayer(JoinPoint joinPoint) {
//startTimeMillis = System.currentTimeMillis(); // 记录方法开始执行的时间
}
//方法调用后执行-记录结束执行时间
@After("execution(* com.web.controller.*.*(..))")
public void doAfterInServiceLayer(JoinPoint joinPoint) {
//endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间
String targetName = joinPoint.getTarget().getClass().getName(); //获取类名
String methodName = joinPoint.getSignature().getName(); //获取方法名
Object[] arguments = joinPoint.getArgs(); //获取参数列表
}
//环绕触发
@Around("execution(* com.web.controller.*.*(..))")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
}
}
@Aspect
这个注解表示这个是你的AOP,这个不能少
<bean id="logAspect" class="com.log.LogAspect" />
还记得这个吗,把你的切面放心的交给Spring吧,ok