一、回顾

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. Python之手把手教你用JS逆向爬取网易云40万+评论并用stylecloud炫酷词云进行情感分析

    本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767 写在前面: 文章有点长,操作有点复杂,需要代码的直接去文末即可.想要学习的需要有点耐心 ...

  2. [003] - JavaSE面试题(三):JavaSE语法(1)

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [003] - JavaSE面试题(三):JavaSE语法(1) 第1问:& 和 & ...

  3. mybatis-3-核心配置文件

    全局配置文件:mybatis-config.xml 1.引入外部配置文件(properties) date.properties外部配置文件 driver = com.mysql.cj.jdbc.Dr ...

  4. Springboot+Mybatis+小程序

    思维导图: 项目效果图 一览界面: 新增界面:

  5. sqldbx配置连接Oracle 12C数据库

    本地开发环境: Windows10 64位.Oracle 12C客户端 32位.sqlDBX (32位) =============================================== ...

  6. RegOpenKeyEx

    对注册表的操作是通过句柄来完成的,在对某个键下的键值进行操作的时候首先将该键进行打开,然后使用键句柄进行引用该键,操作完后要进行关闭: 注册键的根键不需要打开,他们的句柄是固定的,直接拿来用就是了. ...

  7. Maven的属性,${project.basedir},${project.build.directory}:项目构件输出目录,默认为 target/

    内置属性 主要有两个常用内置属性:${basedir}项目的根目录(包含pom.xml文件的目录),${version}项目版本 POM属性 用户可以使用该属性引用POM文件中对应元素的值,常用的PO ...

  8. Java学习常用链接

    最全的Jenkins插件开发教程 最最最全的Jenkins插件开发教程_邪恶八进制-CSDN博客_jenkins插件开发 代理FQ工具Shadow socks https://www.blog-chi ...

  9. Ghost ,博客系统代名词

    Ghost 博客系统是前 WordPress 的一些优秀员工的创业项目.项目仍然采用 100% 开源,加上官方的收费托管的商业模式,目前已经发展成为一个非常的博客系统. 为了更好的方便读者理解 Gho ...

  10. C# 事件与继承

    在窗体编程过程中,常常会封装一个基类,包含未来业务中常用的属性.方法.委托.事件等,但是事件作为一个特殊的委托,只能在声明类中调用,派生类都不可以调用,所以在基类中必须实现一个虚函数,实现事件的调用, ...