spring学习日志三
一、回顾
1.1 依赖注入的方式。
- set方法来注入 <property name=”属性名” />
- 构造方法来注入<construtor-arg index=”” />
1.2 依赖注入的数据类型。
- 基本类型和字符串 value
- 对象类型 ref <bean></bean>
- 集合List set
- map类型 <entry key= value=>
- array类型
1.3 引入属性文件.<context: property-placeholder location=”classpath:*.properties”>
1.4 自动注入。 autowire=”byName | byType | default | no ”
1.5 bean的作用域 scope=”singleton | prototype”
1.6 注解. @Repository (持久化) @Service (业务层) @Controller (控制层) @Component (组件) ,这四个功能都是一样的。
@Autowired (自动注入 先按照类型注入,再按照名称注入) @Resource (自动注入 按照名称先注入,再按照类型注入。如果没有起名,那么它的名称就是属性的名称。)
二、AOP面向切面编程
Aop的前提:1.代理 2.AOP
1.动态代理模式
代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上.
示例:
创建接口ArithmeticCalculate
public interface ArithmeticCalculate {
/**
* 加法
* @param a
* @param b
* @return
*/
public double add(double a,double b);
/**
* 减法
* @param a
* @param b
* @return
*/
public double sub(double a,double b);
/**
* 乘法
* @param a
* @param b
* @return
*/
public double mul(double a,double b);
/**
* 除法
* @param a
* @param b
* @return
*/
public double div(double a,double b);
}
创建接口的实现类
package com.zhiyou100.ykq.aop.proxy;
//1.使用代理(了解) 2.使用spring的aop。
public class ArithmeticCalculateImp implements ArithmeticCalculate {
//在每个方法中加入日志信息。
@Override
public double add(double a, double b) {
double result=a+b;
System.out.println("result:"+result);
return result;
} @Override
public double sub(double a, double b) {
double result=a-b;
System.out.println("result:"+result);
return result;
} @Override
public double mul(double a, double b) {
double result=a*b;
System.out.println("result:"+result);
return result;
} @Override
public double div(double a, double b) {
double result=a/b;
System.out.println("result:"+result);
return result;
} }
创建代理类并实现接口来代理需要被代理的对象
//调用处理程序:InvocationHandler
public class ArithmeticCalculateLogProxy implements InvocationHandler{
//被代理的对象 明星
private Object target; public ArithmeticCalculateLogProxy(Object target) {
this.target = target;
} /**
* mothod: 正在被调用的方法
* args: 正在执行的方法所需要的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName=method.getName();
System.out.println("the method "+methodName+" begin with "+Arrays.asList(args));
//method:方法
//target:目标对象
Object result=method.invoke(target, args);//回调
System.out.println("the method add end result:"+result);
return result;
} //得到代理对象。 经纪人
public Object getProxy() {
//loader: 得到代理对象的类加载器。
//interfaces: 代理对象 要代理的方法由哪些。
//h: 当执行这些方法时,会调用该类中invoke方法
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
} }
测试
public class Test {
public static void main(String[] args) {
ArithmeticCalculate target=new ArithmeticCalculateImp();//创建的王宝强
ArithmeticCalculateLogProxy proxy=new ArithmeticCalculateLogProxy(target);
ArithmeticCalculate p=(ArithmeticCalculate) proxy.getProxy(); //宋喆
p.sub(15, 25);//1.首先执行invoke方法
}
}
2.AOP模式
2.1使用注解来完成
加入依赖的jar包文件

创建一个接口ArithmeticCalculate
public interface ArithmeticCalculate {
// 加法
public double add(double a,double b);
// 减法
public double sub(double a,double b);
// 乘法
public double mul(double a,double b);
// 除法
public double div(double a,double b);
}
创建实现以上接口的类
@Component
public class ArithmeticCalculateImp implements ArithmeticCalculate {
//在每个方法中加入日志信息。
@Override
public double add(double a, double b) {
double result=a+b;
System.out.println("result:"+result);
return result;
} @Override
public double sub(double a, double b) {
double result=a-b;
System.out.println("result:"+result);
return result;
} @Override
public double mul(double a, double b) {
double result=a*b;
System.out.println("result:"+result);
return result;
} @Override
public double div(double a, double b) {
if(b==2) {
throw new RuntimeException("出错了");
}
double result=a/b;
System.out.println("result:"+result);
return result;
} }
创建一个切面类
//切面类
@Aspect
@Component
public class LogAspect {
//*:通配的是访问修饰符
//..:通配的是方法的参数,一般三个及以上
//连接点(joinpoint)
//Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
//前置通知
@Before(value="execution(* com.zhiyou100.xz.aspectj.*.*(..))")// 第一个*代表类,第二个*代表类中的方法
public void aa(JoinPoint joinPoint) { //在ArithmeticCalculateImp中add方法前执行
Object[] args=joinPoint.getArgs();
String name=joinPoint.getSignature().getName();
System.out.println("zhiyou-->the method "+name+" begin with"+Arrays.asList(args));
} //@AfterReturning
//后置通知
@After(value="execution(* com.zhiyou100.xz.aspectj.*.*(..))")
public void bb(JoinPoint joinPoint) {
String name=joinPoint.getSignature().getName();
//joinPoint.getTarget();
System.out.println("zhiyou-->the method "+name+"end result:");
} //返回通知
@AfterReturning(value="execution(* com.zhiyou100.xz.aspectj.*.*(..))",returning="result")
public void cc(Object result) {
System.out.println("======"+result);
} //异常通知
@AfterThrowing(value="execution(* com.zhiyou100.xz.aspectj.*.*(..))",throwing="e")
public void dd(Exception e) {
System.out.println("异常了:"+e.getMessage());
}
}
在spring的配置文件app.xml中开启切面注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <!-- 包扫描 -->
<context:component-scan base-package="com.zhiyou100.xz.aspectj"></context:component-scan> <!-- 开启切面注解 -->
<aop:aspectj-autoproxy />
</beans>
测试
public class Test {
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("app.xml");
ArithmeticCalculate a=(ArithmeticCalculate) app.getBean("arithmeticCalculateImp");
a.div(10, 5);
}
}
2.2使用xml的方式来完成
把第一种方式中的接口、接口的实现类以及切面类中的注解全部删除,然后新建spring的配置文件app2.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd ">
<!-- 定义被通知的程序类 -->
<bean id="ari" class="com.zhiyou100.xz.aspectj.xml.ArithmeticCalculateImp"></bean> <!-- 定义切面类的bean -->
<bean id="logAspect" class="com.zhiyou100.xz.aspectj.xml.LogAspect"></bean> <!-- 配置切面 -->
<aop:config>
<!-- 定义表达式切点 -->
<aop:pointcut expression="execution(* com.zhiyou100.xz.aspectj.xml.*.*(..))" id="pointcut"/>
<!-- 定义切面 -->
<aop:aspect ref="logAspect">
<!-- 定义前置通知 -->
<aop:before method="aa" pointcut-ref="pointcut"/>
<aop:after method="bb" pointcut-ref="pointcut"/>
<aop:after-returning method="cc" pointcut-ref="pointcut" returning="result"/>
<aop:after-throwing method="dd" pointcut-ref="pointcut" throwing="e"/>
</aop:aspect>
</aop:config> </beans>
测试
public class Test2 {
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("app2.xml");
ArithmeticCalculate a=(ArithmeticCalculate) app.getBean("ari");
a.div(10, 5);
}
}
spring学习日志三的更多相关文章
- spring 学习(三):aop 学习
spring 学习(三):aop 学习 aop 概念 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 3 aop底层使用动态代 ...
- MyEclipse Spring 学习总结三 SpringMVC
MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring学习总结三——SpringIOC容器三
一:spring容器自动装配注入 为了减少xml中配置内容,可以使用自动装配注入,代替setter注入,只需要在 bean对象配置中添加属性autoWire即可,那么在类中就会自动扫描setXXX() ...
- Spring学习(三)--Spring的IOC
1.BeanFactory和FactoryBean BeanFactory是一个接口类,定义了IOC容器最基本的形式,提供了IOC容器所应该遵守的基本服务契约. FactoryBean是一个能产生或者 ...
- Spring学习系列(三) 通过Java代码装配Bean
上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...
- Spring 学习(三)AOP
(1)AOP概述 - AOP:面向切面编程,扩展功能不修改源代码实现 - AOP采取横向抽取机制,取代了传统的纵向继承体系重复性代码 (2)AOP底层原理 原始方法------->纵向继承体系 ...
- <黑马新秀>Spring学习日志
# 用于梳理Spring知识点 Spring是分层的Java EE应用全栈轻量级开源框架,以IoC(Inverse Of Control反转控制)和AOP(Aspect Oriented Progra ...
- 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】
一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...
随机推荐
- Python之手把手教你用JS逆向爬取网易云40万+评论并用stylecloud炫酷词云进行情感分析
本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767 写在前面: 文章有点长,操作有点复杂,需要代码的直接去文末即可.想要学习的需要有点耐心 ...
- [003] - JavaSE面试题(三):JavaSE语法(1)
第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [003] - JavaSE面试题(三):JavaSE语法(1) 第1问:& 和 & ...
- mybatis-3-核心配置文件
全局配置文件:mybatis-config.xml 1.引入外部配置文件(properties) date.properties外部配置文件 driver = com.mysql.cj.jdbc.Dr ...
- Springboot+Mybatis+小程序
思维导图: 项目效果图 一览界面: 新增界面:
- sqldbx配置连接Oracle 12C数据库
本地开发环境: Windows10 64位.Oracle 12C客户端 32位.sqlDBX (32位) =============================================== ...
- RegOpenKeyEx
对注册表的操作是通过句柄来完成的,在对某个键下的键值进行操作的时候首先将该键进行打开,然后使用键句柄进行引用该键,操作完后要进行关闭: 注册键的根键不需要打开,他们的句柄是固定的,直接拿来用就是了. ...
- Maven的属性,${project.basedir},${project.build.directory}:项目构件输出目录,默认为 target/
内置属性 主要有两个常用内置属性:${basedir}项目的根目录(包含pom.xml文件的目录),${version}项目版本 POM属性 用户可以使用该属性引用POM文件中对应元素的值,常用的PO ...
- Java学习常用链接
最全的Jenkins插件开发教程 最最最全的Jenkins插件开发教程_邪恶八进制-CSDN博客_jenkins插件开发 代理FQ工具Shadow socks https://www.blog-chi ...
- Ghost ,博客系统代名词
Ghost 博客系统是前 WordPress 的一些优秀员工的创业项目.项目仍然采用 100% 开源,加上官方的收费托管的商业模式,目前已经发展成为一个非常的博客系统. 为了更好的方便读者理解 Gho ...
- C# 事件与继承
在窗体编程过程中,常常会封装一个基类,包含未来业务中常用的属性.方法.委托.事件等,但是事件作为一个特殊的委托,只能在声明类中调用,派生类都不可以调用,所以在基类中必须实现一个虚函数,实现事件的调用, ...