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 ...
随机推荐
- C语言:类型转换
1.自动类型转换:将小范围数据类型转换为大范围的数据类型 2.赋值号两边的数据类型不一致时,会自动将右边的数据类型转换为左边的数据类型.若右边数据的类型级别高,则根据左边变量的长度截取低字节数据部分 ...
- 解决 Github 打不开或打开很慢的问题
解决 Github 打不开或打开很慢的问题 方法一 一.确定 github 网站的 ip 打开网址:http://github.com.ipaddress.com/ 192.30.253.112 gi ...
- 《深入剖析Tomcat》源码
<深入剖析Tomcat>翻译自<How Tomcat Works> 可以到官网下载:https://brainysoftware.com/download 官网下载比较慢,我就 ...
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- ASP.NET Datalist制作显示效果和img的数据库存储
1. 具体实现效果如下图: 2.首先使用datalist控件编辑模板,在属性面板选择RepeatColumns="3" RepeatDirection="Horizont ...
- nuxt服务部署到云上全程记录
首先,在使用脚手架nuxt-app中创建项目时,箭头选用不起作用,这是因为git bash在windows中交互问题,临时的解决办法是换用cmd 登录云服务器后,首先安装nodejs yum inst ...
- webrtc编译
webrtc编译 最近研究 libmediasoupclient,而 libmediasoupclient 又依赖 libwebrtc,所以首先就想着先在windows上编译一个webrtc的库,先是 ...
- noip模拟29[简单的板子题](虽然我不会)
\(noip模拟29\;solutions\) 这次考试给我最大的伤害,让我意识到了差距 这场考试可以说是非常的简单,就是简单到,看两眼,打个表就有结果了 但是呢?我考得非常的完蛋,只有30pts 据 ...
- postman之get请求
get请求:
- zookeeper的简介和相关命令操作
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...