Spring的核心接口
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
从代理的原理我们知道,代理的目的是调用目标方法时可以转而执行InvocationHandler的invoke方法,所以如何在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的开启和关闭
Spring新框架WebFlux
Spring的核心接口的更多相关文章
- spring 的核心接口
spring有两个核心接口,BeanFactory 和ApplicationContext ,其中ApplicationContext 是BeanFactory的子接口.他们代表了Spring容器. ...
- Spring事务核心接口
- spring中基础核心接口总结
spring中基础核心接口总结理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口重要的实现类有:XmlBeanFac ...
- Spring Boot REST(一)核心接口
Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
- Spring8:一些常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
- spring IOC核心原理
下面来了解一下Spring到底是怎么运行的. public static void main(String[] args) { ApplicationContext context = new Fil ...
- spring之BeanFactoryAware接口
springBeanFactoryAware (转)要直接在自己的代码中读取spring的bean,我们除了根据常用的set外,也可以通过spring的BeanFactoryAware接口实现,只要实 ...
- spring技术核心概念纪要
一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述 ...
随机推荐
- 记一个 dubbo中hessian2反序列化 Map 的一个问题
dubbo版本: 2.5.10 解决方案: 改用 "dubbo" 序列化方式 (但是 dubbo 方式也存在一个比较坑的问题 详见: Dubbo序列化多个CopyOnWriteAr ...
- MySQL 远程连接问题
使用Workbench 无法远程连接Mysql服务器提示如下错误: 查找原因: 显示只能localhost 访问. 解决方法:修改授权远程访问 create user 'root'@'%' ident ...
- python数据类型之基础进阶
一: 解构 1.1 结构字符串 变量和字符个数必须严格一致 name = 'wc' a,b=name print(a) print(b) # w # c name = 'w' a,b=name pri ...
- 饮冰三年-人工智能-Python-29瀑布流
多适用于:整版以图片为主,大小不一的图片按照一定的规律排列的网页布局. 1:创建model类,并生成数据表 from django.db import models # Create your mod ...
- eclipse中alt+/失效的几种解决方法
1.次方法用于没有一点提示的情况:依次打开eclipse上面的windows ——preferences ——java ——editor —— content assist ,在右上方有一行“sele ...
- js属性对象的propertyIsEnumerable方法
定义 每个对象都有一个propertyIsEnumerable()方法.此方法返回一个布尔值,表明指定的属性是否是可枚举. This method can determine whether the ...
- Yii框架学习资源盘点
盘点一些Yii框架的常用学习资源. 1.Yii中文论坛 https://www.yiichina.com/ 2.Yii中文网 http://www.yii-china.com/ 3.魏曦教你学Yii2 ...
- ECMAScript 6 之 let 和 const 命令
1.let基本用法 1.1.声明变量 let声明的变量只在它所在的代码块有效. 1.2.不存在变量提升 var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined: let命令 ...
- ES6躬行记(15)——箭头函数和尾调用优化
一.箭头函数 箭头函数(Arrow Function)是ES6提供的一个很实用的新功能,与普通函数相比,不但在语法上更为简洁,而且在使用时也有更多注意点,下面列出了其中的三点: (1)由于不能作为构造 ...
- angularjs和ajax的结合使用 (三)
转眼九月份了,忙忙碌碌 发现今年还没开过张,写一篇吧. 15年在空闲时就倒腾过angularjs那玩意儿 ,觉得还是挺好的,李金龙那厚厚的一本书,只不过没有系统化应用.最主要的是原来有一个东西没有用到 ...