Spring学习笔记2
一、什么是AOP
面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
在不影响原来功能代码的基础上,使用动态代理加入自己需要的一些功能(比如权限的验证,事务的控制,日志的记录等等),移除之后,并不影响原来的功能
面向切面编程是通过动态代理实现的,是对面向对象思想的补充。
可以提供声明式的事务管理。
aop的advice有哪些
1)before:在执行切入的方法之前,执行代码
2)after returning:在执行切入的方法正常执行(没有异常)之后,执行代码
3)after throwing:在执行切入的方法发生异常的时候,执行代码
4)after:在执行切入的方法无论是否发生异常,都必须最后执行代码
二、配置切点和切面
1)找到需要加事务的方法(方法的定位,可以类似于通配符来定位)
execution(public * cn.com.bochy.dao.impl.UserDaoImpl.insertUser(..))
开发中,事务的处理是在service层处理的,所以必须切入service层
execution(public * cn.com.bochy.service.impl.*.*(..))
2)找到之后,在方法开始之前,需要加上事务
对应advice:before
3)在方法运行中如果有异常,回滚
对应advice:after throwing
4)在方法运行中没有异常,提交
对应advice:after returning
5)无论是否有异常,关闭释放资源
对应advice:after
<!-- 注解方式完成dao层和service层的自动注入 --> <context:component-scan base-package="com.zy"></context:component-scan> <!-- 打开动态代理 --> <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> <!-- <bean name="myaop" class="com.zy.aop.MyAop"></bean> 配置切点和切面 <aop:config> 配置切点 *返回值任意 ..表示参数任意 以service中的login方法为切点 返回值任意 参数任意 <aop:pointcut expression="execution(public * com.zy.dao.impl.UserDaoImpl.login(..))" id="mypoint" /> 配置切面 <aop:aspect ref="myaop"> 在切面上配advice 执行时机不同 <aop:before method="mybefore" pointcut-ref="mypoint"/> <aop:after method="myafter" pointcut-ref="mypoint"/> <aop:after-returning method="myafter2" pointcut-ref="mypoint"/> <aop:after-throwing method="myafter3" pointcut-ref="mypoint"/> </aop:aspect> </aop:config> -->
切面类
package com.zy.aop; import org.apache.log4j.Logger; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Component @Aspect public class MyAop { //写方法 Logger log = Logger.getLogger(this.getClass()); @Before("mypoint()") public void mybefore(){ System.out.println("该方法在登陆之前执行"); log.info("有人准备登录系统"); } @After("mypoint()") public void myafter(){ System.out.println("该方法在登陆之后执行"); log.info("系统完成一次登录过程"); } @AfterReturning("mypoint()") public void myafter2(){ System.out.println("切点无异常后会执行"); log.info("系统登录无异常"); } @AfterThrowing("mypoint()") public void myafter3(){ System.out.println("切点有异常后会执行"); log.info("系统登录有异常"); } //定义切点--写注解---写在某个方法上 @Pointcut("execution(public * com.zy.dao.impl.UserDaoImpl.login(..))") public void mypoint(){}//傀儡 无任何意义 }
Test类
package test; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.zy.service.impl.UserServiceImpl; public class MyTest2 { @Test public void show(){ ClassPathXmlApplicationContext cxc = new ClassPathXmlApplicationContext("spring.xml"); //调用service再切service就会出问题 UserServiceImpl bean = cxc.getBean("userServiceImpl", UserServiceImpl.class); //默认类名首字母小写 bean.login("小白", "123456"); //test[login()] ---- service----dao } }
SpringMVC返回json
@ResponseBody @RequestMapping("/get") public Object getUser(){//研究springMVC下怎样让一个方法返回json格式数据 return us.getUserone(); } //{"uid":2,"username":"rose","password":"654321","address":"韩国","uu":null} //1到springMVC json包 //2spring.xml中配置 <mvc:annotation-driven ></mvc:annotation-driven>(没有这个会406) //3controller中方法返回值改为Object //4在controller中方法上加@ResponseBody