一、回顾

1.1 依赖注入的方式。

  1. set方法来注入 <property name=”属性名” />
  2. 构造方法来注入<construtor-arg index=”” />

1.2 依赖注入的数据类型。

  1. 基本类型和字符串 value
  2. 对象类型  ref       <bean></bean>
  3. 集合List set
  4. map类型 <entry key= value=>
  5. 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学习日志三的更多相关文章

  1. spring 学习(三):aop 学习

    spring 学习(三):aop 学习 aop 概念 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 3 aop底层使用动态代 ...

  2. MyEclipse Spring 学习总结三 SpringMVC

    MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...

  3. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  4. Spring学习总结三——SpringIOC容器三

    一:spring容器自动装配注入 为了减少xml中配置内容,可以使用自动装配注入,代替setter注入,只需要在 bean对象配置中添加属性autoWire即可,那么在类中就会自动扫描setXXX() ...

  5. Spring学习(三)--Spring的IOC

    1.BeanFactory和FactoryBean BeanFactory是一个接口类,定义了IOC容器最基本的形式,提供了IOC容器所应该遵守的基本服务契约. FactoryBean是一个能产生或者 ...

  6. Spring学习系列(三) 通过Java代码装配Bean

    上面梳理了通过注解来隐式的完成了组件的扫描和自动装配,下面来学习下如何通过显式的配置的装配bean 二.通过Java类装配bean 在前面定义了HelloWorldConfig类,并使用@Compon ...

  7. Spring 学习(三)AOP

    (1)AOP概述 - AOP:面向切面编程,扩展功能不修改源代码实现 - AOP采取横向抽取机制,取代了传统的纵向继承体系重复性代码 (2)AOP底层原理 原始方法------->纵向继承体系 ...

  8. <黑马新秀>Spring学习日志

    # 用于梳理Spring知识点 Spring是分层的Java EE应用全栈轻量级开源框架,以IoC(Inverse Of Control反转控制)和AOP(Aspect Oriented Progra ...

  9. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

随机推荐

  1. C语言:统计字符个数及种类

    #include <stdio.h> int main(){ char c; //用户输入的字符 int shu=0;//字符总数 int letters=0, // 字母数目 space ...

  2. go反射原理

    go反射原理 本文基于go1.13.15 1.go汇编 1.1 基本语法 go采用plan9的汇编器完成汇编,有下面几个重要的伪寄存器 FP: Frame pointer: 局部变量访问 PC: Pr ...

  3. informix 数据库锁表分析和解决方法

    一.前言 在联机事务处理(OLTP)的数据库应用系统中,多用户.多任务的并发性是系统最重要的技术指标之一.为了提高并发性,目前大部分RDBMS都采用加锁技术.然而由于现实环境的复杂性,使用加锁技术又不 ...

  4. Git的使用(六)

    前言 版本管理工具总结: 开发团队项目,对项目的版本进行管理. 使用过的版本管理工具: TFS.SVN与Git. TFS:管理项目,通过visual Studio管理源码,拉取分支,提交代码等.也可以 ...

  5. 我去!爬虫遇到JS逆向AES加密反爬,哭了

    今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...

  6. 第四篇--git 上传可能出现的问题

    1. Q:fatal: TaskCanceledException encountered. A task was canceled. A:$ git config --system --unset ...

  7. MP4命令行处理

    MP4Box可用于生成符合MPEG-DASH规范的内容,也就是ISO / IEC 23009-1在ISO公共可用标准中可用的内容. dash切片命令: mp4box -dash 5000 -frag ...

  8. jquery 阻止表单提交方法

    <form name="message_form" action="?m=mobilecenter&c=index&a=service" ...

  9. 使用Python玩转阿里云盘

    项目地址: https://github.com/foyoux/aligo 这个项目起源于我的一个简单需求, 我有25000个文件, 已经上传了9000个, 但是现在我把这些文件重新整理了, 最后我不 ...

  10. Java方法——递归

    递归(栈)  package method; ​ public class Demon04 {        //递归思想    public static void main(String[] ar ...