Spring的菜鸡理解

首先说下,本人小菜鸡,后面你懂的,有说的不对的,还望各位大大指点。

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>
  • 这个配置里多了些东西,仔细看,还是有idclass两个属性的,在bean标签里多了 propetry标签,这个标签里有namevalue两个属性,这个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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值