ContextLoaderListener接口

Create a new ContextLoaderListenerthat will create a web application context based on the "contextClass" and "contextConfigLocation" servlet context-params. See ContextLoadersuperclass documentation for details on default values for each.

This constructor is typically used when declaring ContextLoaderListener as a <listener> within web.xml, where a no-arg constructor is required.

这个接口实现了J2EE的ServletContextListener接口

通过listener 像Servlet容器注册 Web容器启动时 初始化Spring上下文的信息

    <!-- 加载Spring容器 -->
     <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:applicationContext-core.xml</param-value>
      </context-param>
      <!-- 通过listener 像Servlet容器注册 Web容器启动时 初始化context-param的配置信息。-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

BeanFactory接口

  Spring通过BeanFactory接口的getBean来拿到我们所配置Bean的实列,交给Spring管理的Bean全部默认是单例。

  以下是批量扫描初始化Bean 交给Spring管理

 <context:component-scan base-package="com.sk.service.*"></context:component-scan>

IOC

ioc 是依赖注入,当我们的成员变量是Spring的一个Bean的时候,那这个成员变量可以由Spring帮我们注入(Spring会通过反射调用Set方法)

依赖注入也叫控制反转,以前编程完完全全控制在我自己的手里。用了Spring之后 成员变量的初始化过程控制过程反转到Spring手里。

注解用法:

  @Autowired
  DemoService demoService;

AOP

AOP的实现原理,动态代理。

从代理的原理我们知道,代理的目的是调用目标方法时可以转而执行InvocationHandlerinvoke方法,所以如何在InvocationHandler上做文章就是Spring实现AOP的关键所在。

Spring的AOP实现遵守AOP联盟的约定,同时Spring又扩展了它。增加了 PointCut Advisor接口使得其更加灵活

    <!-- 切面逻辑类的对象 -->
    <bean id="myInterceptor" class="com.sk.util.MyInterceptor"></bean>
    <aop:config>
        <!-- 在add方法上加各种各样的我们切入进来的逻辑 -->
        <aop:pointcut expression="execution(public * com.sk.service..*.*(..))" id="servicePointcut"/>

        <aop:aspect id = "logAspect" ref="myInterceptor">
            <!-- aop:pointcut可以加到aspect的里面来   加到里面的话 只能是logAspect 这个aspect使用 -->
            <aop:before method="before" pointcut-ref="servicePointcut"/>
            <aop:after method="after" pointcut-ref="servicePointcut"/>
        </aop:aspect>
    </aop:config>

当我们执行的时候 符合我们execution(public * com.sk.service..*.*(..))语法要求的方法的时候,

它会在方法执行之前 执行before方法(logInterceptor的before方法) 方法执行之后 执行after方法。

Junit测试

    @Test
    public void testIoc() {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext-core.xml");
        DemoService demoService = beanFactory.getBean(DemoService.class);
        demoService.testAop();
    }

利用JoinPoint模拟AOP 实现事物管理

JoinPoint:连接点(AOP切面切到我们程序时的连接点,切入的那个点)

上面的配置保持不变,首先给我们的Service 加一个自定义的注解

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyAnnotation {
    public String transaction() default "";
}
@Service
public class DemoServiceImpl  implements DemoService{
    @Override
    @MyAnnotation(transaction= "transaction")
    public void testAop() {
        System.out.println("excute Service***********");
    }
}

完善我们的切面逻辑类

当我们的切面发现这个注解的时候 就进行事物的控制

public class MyInterceptor {
    public void before(JoinPoint jp) throws Exception {
        MyAnnotation myAnnotation =getHandlerChain(jp);
        System.out.println("方法开始通过AOP拿到方法上的注解-开始事物"+myAnnotation.transaction());
    }
    public void after(JoinPoint jp)throws Exception  {
        MyAnnotation myAnnotation =getHandlerChain(jp);
        System.out.println("放过结束通过AOP拿到方法上的注解-结束事物"+myAnnotation.transaction());
    }
     // 取方法或者类上的HandlerChain注解,方法上的优先
    private MyAnnotation getHandlerChain(JoinPoint jp) throws Exception {
        MethodSignature methodSignature = (MethodSignature) jp.getSignature();
        Method realMethod = jp.getTarget().getClass().getDeclaredMethod(methodSignature.getName(), methodSignature.getParameterTypes());
        MyAnnotation myAnnotation = realMethod.getAnnotation(MyAnnotation.class);
        if(myAnnotation==null) {
            Class<? extends Object> cls = jp.getTarget().getClass();
            myAnnotation = (MyAnnotation) cls.getAnnotation(MyAnnotation.class);
        }
        return myAnnotation;
    }
}

打印结果

方法开始通过AOP拿到方法上的注解-开始事物transaction
excute Service***********
放过结束通过AOP拿到方法上的注解-结束事物transaction

这里只是打印模拟,项目中需要和JDBC(或者Mybatis Hibernate)结合,进而控制数据库transaction的开启和关闭

推荐文章JAVA动态代理设计模式(AOP背后的原理)

Spring新框架WebFlux

Spring的核心接口的更多相关文章

  1. spring 的核心接口

    spring有两个核心接口,BeanFactory 和ApplicationContext  ,其中ApplicationContext 是BeanFactory的子接口.他们代表了Spring容器. ...

  2. Spring事务核心接口

  3. spring中基础核心接口总结

    spring中基础核心接口总结理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口重要的实现类有:XmlBeanFac ...

  4. Spring Boot REST(一)核心接口

    Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...

  5. 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)

    Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...

  6. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  7. spring IOC核心原理

    下面来了解一下Spring到底是怎么运行的. public static void main(String[] args) { ApplicationContext context = new Fil ...

  8. spring之BeanFactoryAware接口

    springBeanFactoryAware (转)要直接在自己的代码中读取spring的bean,我们除了根据常用的set外,也可以通过spring的BeanFactoryAware接口实现,只要实 ...

  9. spring技术核心概念纪要

    一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述 ...

随机推荐

  1. python3 切片

    一.切片的目的:获取多个元素 能够进行切片的对象有:字符串.列表.元组 语法:  object[start_index:end_index:step]     以下是创建一个列表 a = [0,1,2 ...

  2. 末学者笔记--NFS服务和DHCP服务讲解

    NFS服务端概述 一.概念: NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS:NFS允许一个系统在网络上与他 ...

  3. VueJs笔记

    在使用Vuejs做开发的过程中,偶尔会遇到,动态给data添加一个属性这个属性确不能被动态监听到,只能用this.$set(prop,'prop',val)来强制监听,但是有些情况下又不需要这样操作. ...

  4. 两个spring boot项目war部署到tomcat 其中一个无法正常启动

    Spring Boot的spring.jmx资源管理是默认打开的,而两个项目同时使用会冲突 需要在第二个.或者第三个springboot项目中增加如下配置: 1:application.propert ...

  5. 抓取某东的TT购买记录分析TT购买趋势

    最近学习了一些爬虫技术,想做个小项目检验下自己的学习成果,在逛某东的时候,突然给我推荐一个TT的产品,点击进去浏览一番之后就产生了抓取TT产品,然后进行数据分析,看下那个品牌的TT卖得最好. 本文通过 ...

  6. 微软官网tools

    DHCP/AD域插件: 远程管理工具(含DHCP/AD域) 安装网址: https://www.microsoft.com/zh-cn/download/details.aspx?id=7887 程序 ...

  7. tensorflow 使用 5 mnist 数据集, softmax 函数

    用于分类  softmax 函数 手写数据识别:

  8. ios 上下滑动粘滞问题

    ios 移动端,当你触及到可以左右滑动部分,进行上下滑动操作时,会导致上下滑动粘滞卡顿的问题 mdn:https://developer.mozilla.org/zh-CN/docs/Web/CSS/ ...

  9. RSP小组——团队冲刺博客一——(领航)

    RSP小组--团队冲刺博客一--领航 冲刺日期:2018年12月10日 团队目标 经过团队讨论,我们最新确定的α版本所需实现内容如下: 1.实现游戏代码的实现 2.在Android Studio上实现 ...

  10. 20181125第二章节总结part3

    数据-元祖 元祖的是可存放多个值,不可变,有顺序的,从左向右编号. 作用是可以用来存储一些不可以更改的配置文件 基本 语法: #创建新元祖 tuple = (,,,,,) #索引,写法同list tu ...