16监听器、Filter、Nginx、Spring、AOP-2018/07/30

  • 1.监听器

    • 监听web对象创建与销毁的监听器

      • ServletContextListener
      • HttpSessionListener
      • ServletRequestListener
    • 监听web对象属性变化
      • ServletContextAttributeListener
      • HttpSessionAttributeListener
      • ServletRequestAttributeListener
  • 2.Filter
    • 生命周期

      • 当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
      • 当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
      • 当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.
  • 3.Nginx
    • 实现的负载均衡,满足用户访问量的需求
  • 4.一些规范的问题

    • 不要出现类似这样的import语句:import java.util.*;
    • 列限制:80或100
      • 一个项目可以选择一行80个字符或100个字符的列限制,除了下述例外,任何一行如果超过这个字符数限制,必须自动换行。
    • 水平空白

      • 分隔任何保留字与紧随其后的左括号(()(如if, for catch等)。
      • 分隔任何保留字与其前面的右大括号(})(如else, catch)。
        • 在任何左大括号前({),两个例外:

          • @SomeAnnotation({a, b})(不使用空格)。
          • String[][] x = foo;(大括号间没有空格,见下面的Note)。
        • 在任何二元或三元运算符的两侧。这也适用于以下“类运算符”符号:
          • 类型界限中的&(<T extends Foo & Bar>)。
          • catch块中的管道符号(catch (FooException | BarException e)。
          • foreach语句中的分号。
        • 在, : ;及右括号())后
        • 如果在一条语句后做注释,则双斜杠(//)两边都要空格。这里可以允许多个空格,但没有必要。
        • 类型和变量之间:List list。
        • 数组初始化中,大括号内分隔任何保留字与紧随其后的左括号(()(如if, for catch等)。
    • 每个switch语句都包含一个default语句组,即使它什么代码也不包含

  • 5.json补充

    • JSON 数据的书写格式

      • "firstName" : "John"等价于这条 JavaScript 语句:firstName = "John"
    • JSON的使用
      • 把JSON文本转换为JavaScript对象,JavaScript函数eval()可用于将JSON文本转换为JavaScript对象。
      • var obj = eval ("(" + txt + ")");
  • 6.spring
    • Spring的核心是控制反转(IoC)和面向切面(AOP)
    • Spring就是一个大工厂,是用于生成bean
    • 核心容器:beans、core、context、expression
    • IoC:将由Spring创建对象实例--> IoC 控制反转(Inverse of Control)
      • 配置文件

        • 配置需要创建的对象
        • id :用于之后从spring容器获得实例时使用的
        • class :需要创建实例的全限定类名
        • <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd">
          <!--
            配置service
          <bean> 配置需要创建的对象
          id :用于之后从spring容器获得实例时使用的
          class :需要创建实例的全限定类名
          -->
          <bean id="userServiceId" class="com.itheima.a_ioc.UserServiceImpl"></bean>
          </beans>
      • 测试

        • 1 获得容器

          • String xmlPath = "com/itheima/a_ioc/beans.xml";
          • ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
        • 2获得内容 --不需要自己new,都是从spring容器获得
          • UserService userService = (UserService) applicationContext.getBean("userServiceId");
          • userService.addUser()
    • DI:Dependency Injection,依赖注入

      • 依赖:一个对象需要使用另一个对象
      • 注入:通过setter方法进行另一个对象实例设置
      • 配置文件
      • <property> 用于进行属性注入
      • name: bean的属性名,通过setter方法获得
      • ref :另一个bean的id值的引用
        <!-- 创建service -->
        <bean id="bookServiceId" class="com.itheima.b_di.BookServiceImpl">
        <property name="bookDao" ref="bookDaoId"></property>
        </bean> <!-- 创建dao实例 -->
        <bean id="bookDaoId" class="com.itheima.b_di.BookDaoImpl"></bean>
    • 静态工厂:静态工厂:用于生成实例对象,所有的方法必须是static * <bean id="" class="工厂全限定类名" factory-method="静态方法">
      • 实例工厂:必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。 <bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService">
  • 7.bean种类
    • 普通bean:之前操作的都是普通bean。 ,spring直接创建A实例,并返回FactoryBean:是一个特殊的bean,具有工厂生成对象能力,只能生成特定的对象。
        • bean必须使用 FactoryBean接口,此接口提供方法 getObject() 用于获得特定bean。先创建FB实例,使用调用getObject()方法,并返回方法的返回值 FB fb = new FB(); return fb.getObject();
  • 8.作用域
    • singleton 单例,默认值。
    • prototype 多例,每执行一次getBean将获得一个实例。例如:struts整合spring,配置action多例。
  • 9.生命周期
    • 初始化和销毁

      • 目标方法执行前和执行后,将进行初始化或销毁。

        • <bean id="" class="" init-method="初始化方法名称" destroy-method="销毁的方法名称">

      BeanPostProcessor 后处理Bean

      • spring 提供一种机制,只要实现此接口BeanPostProcessor,并将实现类提供给spring容器,spring容器将自动执行,在初始化方法前执行before(),在初始化方法后执行after() 。 配置
    • <bean destroy-method="myDestroy" init-method="myInit" class="com.itheima.e_lifecycle.UserServiceImpl" id="userServiceId"/>
  • 10.SpEL
    • <property name="" value="#{表达式}">

      • {123}、#{'jack'} : 数字、字符串
      • #{beanId} :另一个bean引用
      • #{beanId.propName} :操作数据
      • #{beanId.toString()} :执行方法
      • #{T(类).字段|方法} :静态方法或字段
    • 集合的注入都是给添加子标签

      • 数组:<array>

      • List:<list>

      • Set:<set>

      • Map:<map> ,map存放k/v 键值对,使用描述

      • Properties:<props>  <prop key=""></prop>

      • 普通数据:<values>

      • 引用数据:<ref>

    • 大于小于分别用lt和gt代替
    • 获取Collection 中的子集-通过条件筛选(注意新对象是一个新的 Collection)
      • 筛选子集(.?[])
      • 获取第一个(.^[])
      • 获取最后一个(.$[])
      • 集合的投影(.![])
        • 如果想获得所有城市的名称组成的列表,可用操作<property name="cityNames" value="#{cities.![name]}"/>
  • 11.构造方法
    • <constructor-arg> 用于配置构造方法一个参数argument

      • name :参数的名称
      • value:设置普通数据
      • ref:引用数据,一般是另一个bean id值
      • index :参数的索引号,从0开始 。如果只有索引,匹配到了多个构造方法时,默认使用第一个。
      • type :确定参数类型
      • <!--例1:使用名称name-->
        <constructor-arg name="username" value="jack"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <!--例2:【类型type 和 索引 index】-->
        <constructor-arg index="0" type="java.lang.String" value="1"></constructor-arg>
        <constructor-arg index="1" type="java.lang.Integer" value="2"></constructor-arg>
  • 12.SET方法
    • 普通数据

      • <property name="" value="值"></property>
         <property name=""><value>值</value></property>

      • 两种方法等效

    • 引用数据
      • 两种方法等效
      • <property name="" ref="另一个bean"></property>
        <property name=""><ref bean="另一个bean"/></ref></property>

  • 13.装配Bean 基于注解
    • 1. @Component取代 @Component("id") 取代
    • 2.web开发,提供3个@Component注解衍生注解(功能一样)取代<bean class="">
      • @Repository :dao层
      • @Service:service层
      • @Controller:web层
    • 3.依赖注入 ,给私有字段设置,也可以给setter方法设置
      • 普通值:@Value("")
      • 引用值:
        • 方式1:按照【类型】注入 @Autowired
        • 方式2:按照【名称】注入1 @Autowired @Qualifier("名称")
        • 方式3:按照【名称】注入2 @Resource("名称")
    • 4.生命周期

      • 初始化:@PostConstruct
      • 销毁:@PreDestroy
    • 5.作用域
      • @Scope("prototype") 多例
      • 注解使用前提,添加命名空间,让spring扫描含有注解类
        <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- 组件扫描,扫描含有注解的类 -->
        <context:component-scan base-package="com.itheima.g_annotation.a_ioc"> </context:component-scan>
        </beans>
  • 15.AOP:面向切面编程

    • AOP是OOP(面向对象编程)的延续
    • aop底层将采用代理机制进行实现。
    • 接口 + 实现类 :spring采用 jdk 的动态代理Proxy。
    • 实现类:spring 采用 cglib字节码增强。
    • 目标类:接口 + 实现类
    • 切面类:用于存通知 MyAspect
    • 工厂类:编写工厂生成代理

      • 目标类

        • final UserService userService = new UserServiceImpl();
      • 切面类 final MyAspect myAspect = new MyAspect();
      • 代理类:将目标类(切入点)和 切面类(通知) 结合 --> 切面

        • Proxy.newProxyInstance

          • 参数1:loader ,类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存。

            • 一般情况:当前类.class.getClassLoader();
            • 目标类实例.getClass().get...
          • 参数2:Class[] interfaces 代理类需要实现的所有接口
            • 方式1:目标类实例.getClass().getInterfaces() ;注意:只能获得自己接口,不能获得父元素接口
            • 方式2:new Class[]{UserService.class}
            • 例如:jdbc 驱动 --> DriverManager 获得接口 Connection
          • 参数3:InvocationHandler 处理类,接口,必须进行实现类,一般采用匿名内部
            • 提供 invoke 方法,代理类的每一个方法执行时,都将调用一次invoke

              • 参数31:Object proxy :代理对象
              • 参数32:Method method : 代理对象当前执行的方法的描述对象(反射)
                • 执行方法名:method.getName()
                • 执行方法:method.invoke(对象,实际参数)
              • 参数33:Object[] args :方法实际参数
      • 代理类:采用cglib,底层创建目标类的子类

        • 需要导包spring-core..jar
        • 核心类 Enhancer enhancer = new Enhancer();
        • 确定父类 enhancer.setSuperclass(userService.getClass());
        • 设置回调函数 , MethodInterceptor接口 等效 jdk InvocationHandler接口
          • intercept() 等效 jdk invoke()
          • 参数1、参数2、参数3:以invoke一样
          • 参数4:methodProxy 方法的代理 enhancer.setCallback(new MethodInterceptor(){ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {...}
        • 创建代理 enhancer.create();
  • 16.spring编写代理:半自动

    • 导包:

      • com.springsource.org.aopalliance-1.0.0.jar
      • com.springsource.org.apache.commons.logging-1.1.1.jar
      • spring-aop-3.2.0.RELEASE.jar
      • spring-beans-3.2.0.RELEASE.jar
      • spring-context-3.2.0.RELEASE.jar
      • spring-core-3.2.0.RELEASE.jar
      • spring-expression-3.2.0.RELEASE.jar
    • 切面类:采用“环绕通知” MethodInterceptor
    • spring配置
      • 创建目标类
      • <bean id="userServiceId" class="com.itheima.b_factory_bean.UserServiceImpl"></bean>
        <!-- 2 创建切面类 -->
        <bean id="myAspectId" class="com.itheima.b_factory_bean.MyAspect"></bean>
    • 创建代理类

      • 使用工厂bean FactoryBean ,底层调用 getObject() 返回特殊bean
      • ProxyFactoryBean 用于创建代理工厂bean,生成特殊代理对象
        • interfaces : 确定接口们。通过可以设置多个值,只有一个值时,value=""
        • target : 确定目标类
        • interceptorNames : 通知 切面类的名称,类型String[],如果设置一个值 value=""
        • optimize :强制使用cglib  <property name="optimize" value="true"></property>
          <bean id="proxyServiceId" class="org.springframework.aop.framework.ProxyFactoryBean">
          <property name="interfaces" value="com.itheima.b_factory_bean.UserService"></property>
          <property name="target" ref="userServiceId"></property>
          <property name="interceptorNames" value="myAspectId"></property>
          </bean>
  • 17.aop编程

    • 导入命名空间
    • 使用 <aop:config>进行配置 proxy-target-class="true" 声明时使用cglib代理 <aop:pointcut> 切入点 ,从目标对象获得具体方法 <aop:advisor> 特殊的切面,只有一个通知 和 一个切入点 advice-ref 通知引用 pointcut-ref 切入点引用
    • 切入点表达式 execution(* com.itheima.cspringaop..(..)) 选择方法 返回值任意 包 类名任意 方法名任意 参数任意
  • 18.AspectJ 通知类型
    • before:前置通知(应用:各种校验)

      • 在方法执行前执行,如果通知抛出异常,阻止方法运行
    • afterReturning:后置通知(应用:常规数据处理)
      • 方法正常返回后执行,如果方法中抛出异常,通知无法执行
      • 必须在方法执行后才执行,所以可以获得方法的返回值。
    • around:环绕通知(应用:十分强大,可以做任何事情)
      • 方法执行前后分别执行,可以阻止方法的执行
      • 必须手动执行目标方法
    • afterThrowing:抛出异常通知(应用:包装异常信息)
      • 方法抛出异常后执行,如果方法没有抛出异常,无法执行
    • after:最终通知(应用:清理现场)
      • 方法执行完毕后执行,无论方法中是否出现异常
    • 导入jar包
      • 4个:aop联盟规范、spring aop 实现、aspect 规范、spring aspect 实现

16监听器、Filter、Nginx、Spring、AOP的更多相关文章

  1. 监听器如何获取Spring配置文件(加载生成Spring容器)

    Spring容器是生成Bean的工厂,我们在做项目的时候,会用到监听器去获取spring的配置文件,然后从中拿出我们需要的bean出来,比如做网站首页,假设商品的后台业务逻辑都做好了,我们需要创建一个 ...

  2. 曹工说Spring Boot源码(21)-- 为了让大家理解Spring Aop利器ProxyFactory,我已经拼了

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  3. 曹工说Spring Boot源码(22)-- 你说我Spring Aop依赖AspectJ,我依赖它什么了

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  4. Spring Boot -- Spring AOP原理及简单实现

    一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...

  5. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  6. Spring AOP实例——异常处理和记录程序执行时间

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

  7. [转]彻底征服 Spring AOP 之 理论篇

    基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, ...

  8. 基于注解的Spring AOP的配置和使用

    摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...

  9. (转)Spring AOP实现方式(转)

    我们可以通过三种方式来使用Spring AOP,它们分别是:@Aspect-based(Annotation),Schema-based(XML),以及底层的Spring AOP API 底层的Spr ...

随机推荐

  1. 容器LinkedList原理(学习)

    一.概述 数据结构和ArrayList有本质不同,LinkedList 是基于链表实现,它的插入和删除操作比 ArrayList 更加高效,基于链表的,所以随机访问的效率要比 ArrayList 差. ...

  2. go11---方法method

    package main /* 方法method Go 中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型的组合 只能为同一个包中的类型定义方法 Receiver ...

  3. Lein droid

    最近尝试使用Clojure,发现有个Lein droid的项目可以方便的在android下使用Clojure. http://clojure-android.info/#get-started 尝试了 ...

  4. 19.Extjs主页面显示js

    1. /** * @author sux * @time 2011-1-11 * @desc main page */ var mainPage = Ext.extend(Ext.Viewport,{ ...

  5. 【转载】7条便利的ViewState技巧

    32.Seven handy ViewState tips 32.7条便利的ViewState技巧 Every time I have to deal with a classic ASP.NET W ...

  6. MogileFS介绍

    MogileFS介绍 MogileFS 是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发. Danga团队开发了包括 Memcached.Mog ...

  7. NestedPreb

    屌丝手动版 One of the things we’re sorely missing from Unity is nested prefabs. So we rolled this little ...

  8. golang——字符串与编码

    1.字符编码 (1)ASCII码 一个字节表示的英文.数字.标点符号等字符. 国际标准ASCII码为0-127即128个字符,二进制最高位为0,其余为扩展ASCII码. (2)GB2312 两字节,主 ...

  9. Invalid default value for 'create_date' timestamp field

    创建表的语句中有这么一句 `create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', 1 之后就报了这个错误. That is be ...

  10. 汇编程序52:实验15 安装新的int9中断例程

    assume cs:code ;重写int9中断例程,当按住a后松开,便会产生满屏A stack segment dw dup() stack ends code segment start: mov ...